Practice/Microsoft/Design a graph-based system
Object Oriented DesignMust
Design and implement a social network graph system that models relationships between users and groups. The system should support two primary node types: User nodes and Group nodes. Users can be friends with other users (bidirectional relationship), and users can be members of groups (directional relationship from user to group).
Your implementation should provide a flexible, extensible architecture that can easily accommodate additional node types and relationship types in the future. The system must efficiently store and query these relationships.
Example 1: Basic Friendship Network
` Operations: network.add_user("Alice") network.add_user("Bob") network.add_user("Charlie") network.add_friendship("Alice", "Bob") network.add_friendship("Bob", "Charlie")
Query: network.get_friends("Alice") Output: ["Bob"]
Query: network.get_friends("Bob") Output: ["Alice", "Charlie"] `
Example 2: Group Memberships
` Operations: network.add_user("David") network.add_user("Emma") network.add_group("Engineering") network.add_group("ProductManagement") network.add_membership("David", "Engineering") network.add_membership("Emma", "Engineering") network.add_membership("Emma", "ProductManagement")
Query: network.get_group_members("Engineering") Output: ["David", "Emma"]
Query: network.get_group_members("ProductManagement") Output: ["Emma"] `
Example 3: Mixed Relationships
` Operations: network.add_user("Frank") network.add_user("Grace") network.add_group("Designers") network.add_friendship("Frank", "Grace") network.add_membership("Frank", "Designers") network.add_membership("Grace", "Designers")
Query: network.get_friends("Frank") Output: ["Grace"]
Query: network.get_group_members("Designers") Output: ["Frank", "Grace"] `