Imagine a user being part of different groups.
A group can have different roles, and a user can be part of different groups.
He also can have different roles in different groups apart from the membership.
The association of a User, a Group and a Role can be referred to as a HyperEdge.
However, it can be easily modeled in a property graph as a node that captures this n-ary relationship, as depicted below in the U1G2R1 node.
To find out in what roles a user is for a particular groups (here Group2), the following query can traverse this HyperEdge node and provide answers.
Query.
MATCH ({ name: 'User1' })-[:hasRoleInGroup]->(hyperEdge)-[:hasGroup]->({ name: 'Group2' }),
(hyperEdge)-[:hasRole]->(role)
RETURN role.name
The role of User1 is returned:
Here, find all groups and the roles a user has, sorted by the name of the role.
Query.
MATCH ({ name: 'User1' })-[:hasRoleInGroup]->(hyperEdge)-[:hasGroup]->(group),
(hyperEdge)-[:hasRole]->(role)
RETURN role.name, group.name
ORDER BY role.name ASC
The groups and roles of User1 are returned:
Assume a more complicated graph:
User1, User2.
User1 is in Group1, Group2, Group3.
User1 has Role1, Role2 in Group1; Role2, Role3 in Group2; Role3, Role4 in Group3 (hyper edges).
User2 is in Group1, Group2, Group3.
User2 has Role2, Role5 in Group1; Role3, Role4 in Group2; Role5, Role6 in Group3 (hyper edges).
The graph for this looks like the following (nodes like U1G2R23 representing the HyperEdges):
To return Group1 and Group2 as User1 and User2 share at least one common role in these two groups, the query looks like this:
Query.
MATCH (u1)-[:hasRoleInGroup]->(hyperEdge1)-[:hasGroup]->(group),(hyperEdge1)-[:hasRole]->(role), (u2)-[:hasRoleInGroup]->(hyperEdge2)-[:hasGroup]->(group),(hyperEdge2)-[:hasRole]->(role) WHERE u1.name = 'User1' AND u2.name = 'User2' RETURN group.name, count(role) ORDER BY group.name ASC
The groups where User1 and User2 share at least one common role:
Copyright © 2014 Neo Technology