在三个或更多人开始的密码声明中寻找共同的朋友

时间:2017-09-12 05:45:22

标签: neo4j cypher

我正在尝试为neo4j构建一个cypher语句,我知道2-n起始节点的名称,需要找到所有起始节点都可以访问的节点(如果有的话)。

起初我认为它类似于&#34;共同朋友&#34;可以处理的情况 (start1)-[*..2]->(main)<-[*..2]-(start2) 但在我的情况下,我通常有6个以上的起点,我知道名字。

所以基本上我很困惑的是我如何将第三个,第四个等节点包含在cypher中以便能够在其中找到一个commmon root。

how do I find Anders

在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中是否有更优雅/更有效的方式,我可以使用名称列表作为参数

1 个答案:

答案 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来更清楚地查看。