Neo4j 密码查询中的输入和排除节点
早上好 我想在Neo4J中构建一个结构,在这里我可以处理我的用户和组(类似于ACL)。其想法是为每个用户和每个组提供一个包含所有详细信息的节点。组应成为一个图,其中根组将具有子组,该子组也可以具有无限制的子组。这个关系将是-[:IS_SUBGROUP_OF]-到目前为止没有什么令人兴奋的。每个用户都将与一个组相关,该组具有-[:IS_MEMBER_OF]-以获得明确的分配。当然,用户可以是一个或多个组的成员。一些用户将使用不同的关系,如-[:IS_LEADER_OF]——来标识组的组长 我的任务:Neo4j 密码查询中的输入和排除节点,neo4j,cypher,acl,Neo4j,Cypher,Acl,早上好 我想在Neo4J中构建一个结构,在这里我可以处理我的用户和组(类似于ACL)。其想法是为每个用户和每个组提供一个包含所有详细信息的节点。组应成为一个图,其中根组将具有子组,该子组也可以具有无限制的子组。这个关系将是-[:IS_SUBGROUP_OF]-到目前为止没有什么令人兴奋的。每个用户都将与一个组相关,该组具有-[:IS_MEMBER_OF]-以获得明确的分配。当然,用户可以是一个或多个组的成员。一些用户将使用不同的关系,如-[:IS_LEADER_OF]——来标识组的组长 我的任务
MATCH (d:User) -- (g:Group) WHERE g.uuid = "xx"
RETURN d.lastname, d.firstname
返回此组中的所有用户,无论其关系如何(领导/成员)
返回该组中除用户c以外的所有用户。我本来也希望在d-users的列表中得到c,因为c是该组的一部分,应该在(d:User)中找到
我不理解这两个查询之间的区别,可能有人给了我一个提示?您可以稍微简化查询(但是这不应该对性能有影响): 我不完全理解您的问题,但我假设您希望确保
d1
和c
没有通过是
关系的领导者连接。如果是,请尝试:
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(d:User)-[:是|的|成员|是|的|领导者|]-(g:Group:Local)-[:是|的子组|*0..]>(d1:Group:Local)-[r]-(c:User{login:“userlogin”})
其中,类型(r)'是'
返回不同的d.lastname、d.firstname
跟进问题中的*编辑*
在
匹配中
指定路径。根据定义,路径不会两次使用同一关系。否则就有陷入无限递归的危险。查看上面“编辑”部分中的第二个查询:右侧部分匹配yy与该组的关系,而左侧部分匹配与该组相关的所有用户。为了防止同一关系的多次使用,左侧部分不使用yy非常感谢Stefan,我做了一些工作,我想我已经接近了。我用一个编辑部分更新了我的问题,也许你能帮我?谢谢。很好,很有意义,也很好地解决了我的问题,因为这样我可以轻松地解决他。谢谢Stefan的支持。
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
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