cypher查询节点集之间的最短路径

时间:2015-10-14 09:13:25

标签: neo4j cypher

我正在尝试编写一个密码查询来确定一组节点之间的最短路径,例如下面标识的集合,

MATCH (u:User) WITH u ORDER by u.score DESC LIMIT 10 RETURN u

假设形式的图表

(:User)-[:Owns]-(:Box)

第一个限制是我只想在匹配第一个查询的用户之间返回路径。

第二个限制是我不想包含Box元素,其中只有用户集中只有一个用户的链接。我只对Box元素感兴趣,其中有一个匹配用户拥有Box。可能还有其他未选中的用户链接到Box,但我对它们没有兴趣。

从某种意义上说,在我看来,我正在寻求提取链接匹配用户集的所有节点/路径的子网,但我是Cypher / Neo4j的新手,无法解决这个问题。

感激地收到任何指示。

1 个答案:

答案 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

老实说,也许这就是你想要的。您可能需要在返回查询后处理结果。这取决于你在做什么,我想;)