我正在尝试编写一个密码查询来确定一组节点之间的最短路径,例如下面标识的集合,
MATCH (u:User) WITH u ORDER by u.score DESC LIMIT 10 RETURN u
假设形式的图表
(:User)-[:Owns]-(:Box)
第一个限制是我只想在匹配第一个查询的用户之间返回路径。
第二个限制是我不想包含Box元素,其中只有用户集中只有一个用户的链接。我只对Box元素感兴趣,其中有一个匹配用户拥有Box。可能还有其他未选中的用户链接到Box,但我对它们没有兴趣。
从某种意义上说,在我看来,我正在寻求提取链接匹配用户集的所有节点/路径的子网,但我是Cypher / Neo4j的新手,无法解决这个问题。
感激地收到任何指示。
答案 0 :(得分:2)
MATCH (u:User)
WITH u ORDER by u.score DESC LIMIT 10
WITH collect(ID(u)) AS user_ids
MATCH (user1:User), (user2:User)
MATCH path=allShortestPaths((user1)-[*0..3]-(user2))
WHERE ID(user1) IN user_ids AND ID(user2) IN user_ids AND user1 <> user2
RETURN path
您可以增加可变路径长度(在这种情况下为3
),但性能可能会根据您的网络迅速降低。
上述查询不会筛选出只有少于一个用户的Box
个元素的路径。如果你只想通过一个盒子直接链接会更容易,但我不确定这是不是你想要的。如果是,你可以这样做:
MATCH (u:User)
WITH u ORDER by u.score DESC LIMIT 10
WITH collect(ID(u)) AS user_ids
MATCH path=(user1:User)-[:Owns]-(box:Box)-[:Owns]-(user2:User)
WHERE ID(user1) IN user_ids AND ID(user2) IN user_ids AND user1 <> user2
RETURN path, user1, box, user2
老实说,也许这就是你想要的。您可能需要在返回查询后处理结果。这取决于你在做什么,我想;)