在密码查询中加入和排除节点

In- and excluding nodes in a cypher query

早上好,

我想在 Neo4J 中构建一个结构,我可以在其中处理我的用户和组(一种 ACL)。这个想法是为每个用户和每个组创建一个包含所有详细信息的节点。这些组应成为一个图形,其中根组将具有子组,子组也可以无限制地具有子组。关系将是 -[:IS_SUBGROUP_OF]- - 到目前为止没有什么令人兴奋的。每个用户都将与一个带有 -[:IS_MEMBER_OF]- 的组相关联,以进行明确的分配。当然,一个用户可以是 1 个或多个组的成员。一些用户将有不同的关系,如 -[:IS_LEADER_OF]- 来识别组的团队负责人。

我的任务:

  1. 作业:我可以用一个简单的查询来查询组中的每个成员,我什至可以使用当前登录并询问用户来查询子组的成员:

    MATCH (d1:Group:Local) -- (c:User) 匹配 (d:用户) -[:IS_MEMBER_OF|IS_LEADER_OF]- (g:组:本地)-[:IS_SUBGROUP_OF*0..]->(d1) 其中 c.login = 用户登录 RETURN 不同的 d.lastname, d.firstname

我将每个相关用户获取到当前用户及以下(子组)的每个组。也许您知道我如何改进查询或模型。

  1. 批准

我被卡住了,因为我想从查询用户和所有子组的所有成员中获取当前组的所有用户——当前组的组长除外。背后的原因是,团队负责人不能为自己批准行动,但可以为他所在小组的所有其他成员和子小组的所有成员(包括他们的团队负责人)批准行动。

我试图使用关系 -[:IS_LEADER_OF]- 来排除他们,但我也失去了小组的领导。有谁知道我将如何更改模型或如何查询图表以获取除当前组的团队负责人之外的所有用户?

感谢您的宝贵时间, 巴拉尔

* 编辑 *

我想我已经接近了,我只需要了解这两个查询的结果:

MATCH (d:User) -- (g:Group) WHERE g.uuid = "xx" 
RETURN  d.lastname, d.firstname

Returns该组中的所有用户,无论是什么关系(组长/成员)

MATCH (d:User) -- (g:Group), (g)--(c:User{uuid:"yy"})
RETURN  d.lastname, d.firstname

Returns 该组除用户 c 以外的所有用户。我本来希望在 d-users 列表中也能得到 c,因为 c 是该组的一部分,应该在 (d:User) 中找到。

我不明白这两个查询之间的区别,也许有人对我有提示?

您可以稍微简化您的查询(但这不会对性能产生影响):

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

不完全理解您的问题,但我假设您想确保 d1c 没有通过 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 中指定路径。根据定义,路径不会两次使用相同的关系。否则有 运行 进入无限递归的危险。查看上面 "EDIT" 部分中的第二个查询:右侧部分匹配 yy 与组的关系,而左侧部分匹配与该组相关的所有用户。为防止多次使用同一关系,左侧部分未命中使用 yy