我刚从Neo4j开始,我在对折的案子上有点挣扎。给出了以下图表:

作为"theo",我想返回还可以管理术语表的其他用户名列表。作为父组的成员,您应该可以访问与您的子组相同的权限。
例如,对于"theo",我们应该返回sara和bob,因为sara是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
我也有更好的想法来表示这个图。
发布于 2017-09-14 09:59:18
查询的后半部分几乎是正确的:
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如果您从名为"theo“的:User开始,那么它应该足够参数化名称输入,并返回返回中的name参数,而不是像上面那样在节点上访问它。
我还想知道来自Theo的匹配是否真的是必要的,因为看起来您想要的似乎都是可以管理术语表的组成员的用户。如果是这样,您可以从查询中删除Theo部件:
MATCH (users)-[:MEMBER_OF]->(group)<-[:CHILD_OF*0..]-()-[:CAN_MANAGE]->(:Asset{name:"Glossaries"})
RETURN $name collect(users.name) AS Users对于这一项,我删除了用户和组的标签,但是只有在您的图形结构定义得足够好,这里的关系只能连接到:User和: group节点时,才能这样做。如果其他类型的节点也可以通过这些关系连接,则需要重新添加:User和:Group标签。
https://stackoverflow.com/questions/46214755
复制相似问题