仅返回第一个公共节点

时间:2014-11-07 14:34:56

标签: neo4j cypher

我正在尝试编写一个查询,该查询只返回可能有多个节点的两个节点之间的第一个公共节点。

使用此图表作为参考 - http://neo4j.com/docs/stable/cypher-cookbook-friend-finding.html

例如,我是乔,我想找到我不认识的朋友名单,只有一个人我应该要求介绍。一个示例返回集就是这样,即使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节点的第二个查询。希望不是,因为这听起来非常低效。我错过了什么?

1 个答案:

答案 0 :(得分:2)

您需要使用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)

更新

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

这为您提供了3行:

  • 比尔,德里克
  • Bill,Ian或Sara,Ian
  • Sara,Jill

如果Bill-Ian或Sara-Ian在结果中,那么这不是确定性的。