在图表中有一个组G1 - 该组G1有3个子组S1,S2和S3。该关系被分类为IS_SUBGROUP_OF。 G1本身又是另一组的一个子组,我们称之为D1。 D1有很多子组,其中G1只有一个。
让用户U1成为G1子组的成员 - 这里是S1。我想创建一个查询,它能够收集子组S1的所有用户,从用户U1到S1并从那里到G1,从G1到S2和S3的用户获取,从S2和S3获取所有用户同样。最终结果应该是来自父组G1的子组S1,S2和S3中的所有用户,包括G1的用户。
我试过了:
MATCH (d:User) --> (S1:Subgroup)-[:IS_SUBGROUP_OF*0..]->(G1:Group)
WHERE d.name = "U1"
RETURN d
不幸的是,我遍历所有群组并回馈图表中任何群组的所有用户。我试图改变关系中的跳跃级别(例如仅1),但没有成功。您是否有提示如何创建查询以仅获取此用户子集?
组的名称仅用于示例而在现实世界中未知 - 我所知道的是用户名(此处:U1) - 从那里我需要找到各种组,具体取决于用户所在的位置。所以在查询中我不能使用组的名称,但只能使用变量,因为它们是未知的。
*已编辑*
很抱歉这个混乱,我错误地将S1标记为子组,但只有关系提到'IS_SUBGROUP_OF',所以所有组节点都有标签'Group',D1也有标签'Group'。我还为用户添加了关系标签,因此语句现在看起来像这样:
MATCH (d:User) -[:IS_MEMBER_OF]-> (S1:Group)-[:IS_SUBGROUP_OF*0..]->(G1:Group)
WHERE d.name = "U1"
RETURN d
答案 0 :(得分:2)
让我们试试这个,对Dave的答案进行一次小调整(据我所知,它应该可以正常工作......)
MATCH (:User {name: 'U1'})-[:IS_MEMBER_OF]->(:Group)-[:IS_SUBGROUP_OF]->(superGroup:Group)
WITH superGroup
MATCH (superGroup)<-[:IS_SUBGROUP_OF*0..1]-(:Group)<-[:IS_MEMBER_OF]-(users:User)
RETURN COLLECT(DISTINCT users)
根据起始用户,这将找到祖父母组或超级组(根据您的示例的G1),然后匹配作为G1或其任何直接子组的成员的用户并返回不同的集合。它将包括原始匹配用户。
答案 1 :(得分:1)
此答案假定用户被关系IS_MEMBER_OF
标识为组的成员。
查询首先根据提供的用户G1
确定父组U1
。然后,它确定G1
(S1,S2,S3)子组的所有用户,并返回子组中不同用户的集合。
这是一种有点概括的方法,可以通过修改每种情况下要遍历的级别数来遍历更多级别。
// follow IS_MEMBER_OF or IS_SUBGROUP_OF relationships up
// the group/user hierarchy to find the parent group two
// levels up
match (u:User1 {name: 'U1'})-[:IS_MEMBER_OF|IS_SUBGROUP_OF*2]->(g:Group)
// using the parent group
with g
// follow the IS_MEMBER_OF or IS_SUBGROUP_OF relationships back down
// the hierarchy to find all of the peer users or the original user
match (g)<-[:IS_MEMBER_OF|IS_SUBGROUP_OF*2]-(u:User)
return collect(distinct u)
答案 2 :(得分:0)
这会有用吗?
MATCH (d:User)-[*0..1]-(G1:Group)
WHERE d.name= 'U1'
RETURN DISTINCT d