早上好,
我想在Neo4J中构建一个结构,我可以处理我的用户和组(ACL类型)。我们的想法是为每个用户和每个组提供一个包含所有细节的节点。这些组将成为一个图表,其中根组将具有子组,该子组也可以具有无限制的子组。关系将是 - [:IS_SUBGROUP_OF] - - 到目前为止没什么令人兴奋的。每个用户都与 - [:IS_MEMBER_OF]组相关联 - 以获得明确的分配。当然,用户可以是一个或多个组的成员。一些用户将具有不同的关系,如 - [:IS_LEADER_OF] - 来识别组的团队负责。
我的任务:
作业:我可以用一个简单的查询查询一个组的每个成员,我甚至可以使用当前登录并询问用户来查询子组的成员:
MATCH(d1:组:本地) - (c:用户) MATCH(d:用户) - [:IS_MEMBER_OF | IS_LEADER_OF] - (g:组:本地) - [:IS_SUBGROUP_OF * 0 ..] - >(d1) WHERE c.login = userLogin RETURN DISTINCT d.lastname,d.firstname
我将每个相关用户都提供给当前用户和下方(子组)的每个组。也许你有一个提示我如何改进查询或模型。
在这里,我被困住了,因为我想让查询用户和所有子组的所有成员拥有当前组的所有用户 - 除了当前组的领导者。背后的原因是团队成员不能为自己批准行动,但是对于他的团队中的每个其他成员以及包括团队成员在内的所有子组成员。
我尝试使用关系 - [:IS_LEADER_OF] - 来排除它们,但我还松散了子组的团队负责人。有没有人知道如何更改模型或如何查询图表以获得除当前组的teamlead之外的所有用户?
谢谢你的时间, Balael
*编辑*
我想我已经接近了,我只需要了解这两个查询的结果:
MATCH (d:User) -- (g:Group) WHERE g.uuid = "xx"
RETURN d.lastname, d.firstname
无论什么关系(领导者/成员)
,都会返回此组中的所有用户MATCH (d:User) -- (g:Group), (g)--(c:User{uuid:"yy"})
RETURN d.lastname, d.firstname
返回除用户c之外的该组的所有用户。我本来希望在d-users的列表中得到c,因为c是该组的一部分,应该与(d:User)一起找到。
我不明白两个查询之间的区别,也许有人对我提示?
答案 0 :(得分:2)
您可以略微简化查询(但这不会对性能产生影响):
MATCH (d:User) -[:IS_MEMBER_OF|IS_LEADER_OF]- (g:Group:Local)-[:IS_SUBGROUP_OF*0..]->(d1:Group:Local)--(c:User{login:"userlogin"})
RETURN DISTINCT d.lastname, d.firstname
不完全理解您的问题,但我认为您要确保d1
和c
没有IS_LEADER_OF
关系。如果是这样,请尝试:
MATCH (d:User) -[:IS_MEMBER_OF|IS_LEADER_OF]- (g:Group:Local)-[:IS_SUBGROUP_OF*0..]->(d1:Group:Local)-[r]-(c:User{login:"userlogin"})
WHERE type(r)<>'IS_LEADER_OF'
RETURN DISTINCT d.lastname, d.firstname
在MATCH
中指定路径。根据定义,路径不会使用相同的关系两次。否则存在进入无限递归的危险。查看&#34; EDIT&#34;中的第二个查询上面的部分:右边部分匹配yy与该组的关系,而左边部分匹配与该组相关的所有用户。为防止多次使用相同的关系,左侧部分不会使用yy