Prev |  | Next

## 5.4. Hyperedges

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.

Figure 5.1. Graph

### 5.4.1. Find Groups

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:

Result

role.name
1 row
`"Role1"`

### 5.4.2. Find all groups and roles for a user

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:

Result

role.name | group.name
--- | ---
2 rows
`"Role1"` | `"Group2"`
`"Role2"` | `"Group1"`

### 5.4.3. Find common groups based on shared roles

Assume a more complicated graph:

1. Two user nodes `User1`, `User2`.
2. `User1` is in `Group1`, `Group2`, `Group3`.
3. `User1` has `Role1`, `Role2` in `Group1`; `Role2`, `Role3` in `Group2`; `Role3`, `Role4` in `Group3` (hyper edges).
4. `User2` is in `Group1`, `Group2`, `Group3`.
5. `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):

Figure 5.2. Graph

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:

Result

group.name | count(role)
--- | ---
2 rows
`"Group1"` | `1`
`"Group2"` | `1`

Copyright © 2014 Neo Technology

Prev | Up | Next
| Home |