我正在尝试编写一个查询,该查询只返回可能有多个节点的两个节点之间的第一个公共节点。
使用此图表作为参考 - 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
节点的第二个查询。希望不是,因为这听起来非常低效。我错过了什么?
答案 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在结果中,那么这不是确定性的。