我正在尝试为neo4j构建一个cypher语句,我知道2-n起始节点的名称,需要找到所有起始节点都可以访问的节点(如果有的话)。
起初我认为它类似于"共同朋友"可以处理的情况
(start1)-[*..2]->(main)<-[*..2]-(start2)
但在我的情况下,我通常有6个以上的起点,我知道名字。
所以基本上我很困惑的是我如何将第三个,第四个等节点包含在cypher中以便能够在其中找到一个commmon root。
在neo4j网站的上述示例中,我需要一条以&#39; Dilshad&#39; Becky&#39;开头的路径。和&#39; Cesar&#39;检查他们是否有一个共同的朋友(Anders),不包括&#39; Filipa&#39;和艾米尔&#39;因为他们不是这三个人的朋友。
到目前为止,我将以编程方式创建一个类似于
的语句MATCH (start1 {name:'Person1'}), (start2 {name:'Person2'}),
(start3 {name: 'Person3'}), (main)
WHERE (start1)-[*..2]->(main) AND
(start2)-[*..2]->(main) AND
(start3)-[*..2]->(main) RETURN distinct main
但我想知道在cypher中是否有更优雅/更有效的方式,我可以使用名称列表作为参数
答案 0 :(得分:1)
您的问题中显示的查询是构建cartesian product,因为您正在匹配多个断开连接的模式。
而不是MATCH
所有节点分别使用WHERE
来限制这些节点之间的关系,您可以执行以下操作:
MATCH (start1 {name:'Person1'})-[*..2]->(main),
(start2 {name:'Person2'})-[*..2]->(main),
(start3 {name: 'Person3'})-[*..2]->(main)
RETURN main
上述查询将更有效,因为它只匹配所需的模式。请注意,当您执行MATCH (start1 {name:'Person1'}), (start2 {name:'Person2'}), (start3 {name: 'Person3'}), (main)
时,部分(main)
匹配图表的所有节点,因为没有指定对此的限制。您可以在查询中使用PROFILE来更清楚地查看。