我刚刚开始使用Neo4j而且我在下一个案例上有点挣扎。给出以下图表:
作为" theo",我想返回还可以管理词汇表的其他用户名列表。成为父组的成员应该允许您访问与您的孩子相同的权限。
例如,对于" theo",我们应该返回sara和bob,因为sara是PoleManager的成员,PoleManager是ProjectManager组的父级。 Bob是ProjectManager组的成员,该组有权管理词汇表。
到目前为止,我有以下查询,但它不会将sara作为候选者返回:
MATCH (me:User{name:"theo"})-[:MEMBER_OF]->(g:Group),
(g)-[:CAN_MANAGE]->(Asset{name:"Glossaries"}),
(users:User)-[:MEMBER_OF]->(g)
RETURN me.name AS Me, collect(users.name) AS Users
UNION MATCH (me:User{name:"theo"})-[:MEMBER_OF]->(Group)<-[:CHILD_OF*]-(children:Group),
(children)-[:CAN_MANAGE]->(Asset{name:"Glossaries"}),
(users:User)-[:MEMBER_OF]->(children)
RETURN me.name AS Me, collect(users.name) AS Users
我也愿意接受更好的想法来代表这张图。
答案 0 :(得分:1)
查询的后半部分几乎是正确的:
MATCH p = (me:User{name:$Me})-[:MEMBER_OF]->()<-[:CHILD_OF*0..]-()-[:CAN_MANAGE]->(:Asset{name:"Glossaries"})
UNWIND nodes(p)[1..-1] as group
MATCH (users:User)-[:MEMBER_OF]->(group)
RETURN $Me, collect(users.name) AS Users
如果你从:名为&#34; theo&#34;的用户开始,则应该足以参数化名称输入,并在RETURN中返回name参数,而不是在节点上访问它,如上所述。
我还想知道Theo的比赛是否真的有必要,因为看起来你想要的只是那些可以管理词汇表的组成员。如果是这样,您可以从查询中删除Theo部分:
MATCH (users)-[:MEMBER_OF]->(group)<-[:CHILD_OF*0..]-()-[:CAN_MANAGE]->(:Asset{name:"Glossaries"})
RETURN $name collect(users.name) AS Users
对于这个,我删除了用户和组的标签,但只有在图形结构定义得足够明确,此处存在的关系只能连接到:用户和:组节点时,才能执行此操作。如果其他类型的节点也可以通过这些关系连接,则您需要重新添加:用户和:组标签。