Neo4j 仅返回第一个公共节点

Neo4j 仅返回第一个公共节点,neo4j,cypher,Neo4j,Cypher,我试图编写一个查询,在可能有多个节点的场景中,该查询只返回两个节点之间的第一个公共节点 使用此图作为参考- 例如,我是乔,我想找到我不认识的朋友的名单,只有一个人需要我介绍。示例返回集如下所示,尽管Bill也是与Ian的连接: Bill Derrick Sara Ian Sara Jill 我尝试过使用DISTINCT,但分组不正确: MATCH (joe { name: 'Joe' })-[:knows]-(friend)-[:knows]-(friend_of_frien

我试图编写一个查询,在可能有多个节点的场景中,该查询只返回两个节点之间的第一个公共节点

使用此图作为参考-

例如,我是乔,我想找到我不认识的朋友的名单,只有一个人需要我介绍。示例返回集如下所示,尽管Bill也是与Ian的连接:

Bill    Derrick
Sara    Ian
Sara    Jill
我尝试过使用
DISTINCT
,但分组不正确:

MATCH (joe { name: 'Joe' })-[:knows]-(friend)-[:knows]-(friend_of_friend)
WHERE NOT (joe)-[:knows]-(friend_of_friend)
WITH DISTINCT friend_of_friend, friend
RETURN friend.name, friend_of_friend.name

我开始相信我需要第二个查询,并将
friend
节点传递给它。希望不会,因为这听起来效率很低。我缺少什么?

您需要使用collect函数在朋友级别进行聚合:

MATCH (joe { name: 'Joe' })-[:knows]-(friend)-[:knows]-(friend_of_friend)
WHERE NOT (joe)-[:knows]-(friend_of_friend)    
RETURN friend.name, collect(friend_of_friend.name)
更新 这将为您提供3行:

  • 比尔,德里克
  • 比尔,伊恩还是莎拉,伊恩
  • 莎拉,吉尔

在这里,比尔·伊恩或莎拉·伊恩是否在结果中并不确定

这是说“你不能得到你想要的结果集”的简写方式吗?这给了我每一个朋友一行,一个朋友的集合。有没有后续的技巧可以把它转换成我想要的?好的,我知道了。最后一步是将集合切碎,只包含第一个元素。重新排列一点,以提供我想要的结果:
MATCH(joe{name:'joe})-[:knows]-(friend)-[:knows]-(friend\u of friend)WHERE note(joe)-[:knows]-(friend\u of friend)WITH friend\u of friend,collect(friend)AS collectFriends返回collectFriends[0],friend\u of friend
我猜我误读了你的问题,见上面更新的答案:好了,我们到了。谢谢我的业务案例要求在后续匹配中只使用一个连接节点。不过,用户界面是这样的,即查看节点时直接显示好友的所有好友。
MATCH path=(joe { name: 'Joe' })-[:knows]-(friend)-[:knows]-(friend_of_friend)
WHERE NOT (joe)-[:knows]-(friend_of_friend)
RETURN collect(friend)[0] AS friend, friend_of_friend