2017-09-14 50 views
1

我刚刚开始与Neo4j,我在folling的情况下挣扎了一下。鉴于以下图表:Neo4j密码子返回儿童的所有节点

graph

为“西奥”,我要回谁也可以管理词汇表的其他用户名的列表。作为父母组的成员,应该为您提供与您的孩子相同的权限。

例如,对于“theo”,我们应该返回sara和bob,因为sara是PoleManager的成员,它是ProjectManager组的父项。 Bob是有权管理词汇表的ProjectManager组的成员。

到目前为止,我有以下查询,但它不返回萨拉作为候选:

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

我也愿意接受更好的想法把这个图表示。

回答

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 

如果你从开始:名为“西奥”用户,那么它应该是足够的参数名称输入,并返回名称参数在RETURN中,而不是在节点上访问它,如上所述。

我也想知道Theo的匹配是否真的有必要,因为它看起来像所有你想要的都是可以管理词汇表的组的成员。如果是这样,您可以从查询中删除西奥部分:

MATCH (users)-[:MEMBER_OF]->(group)<-[:CHILD_OF*0..]-()-[:CAN_MANAGE]->(:Asset{name:"Glossaries"}) 
RETURN $name collect(users.name) AS Users 

对于这一个,我删除了用户和组的标签,但你只能这样做,如果你的图形结构的明确定义不够的此处存在的关系只能连接到:用户和:组节点。如果其他类型的节点也可以通过这些关系进行连接,则需要重新添加:User和:Group标签。

+0

我错了'[:CHILD_OF *]'虽然'*'会匹配'0',但它似乎不是:( –

+0

其实,@ InverseFalcon第一个查询,这是有用的知道“有什么用户Theo可以管理词汇表“不起作用,它只会返回我'[bob]'。任何想法为什么? –

+0

是的,我的查询中存在一个缺陷,我只是修复它,看看它是否适用于您。 – InverseFalcon

相关问题