【问题标题】:cypher query for shortest paths between set of nodes密码查询一组节点之间的最短路径
【发布时间】:2015-10-14 09:13:24
【问题描述】:

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

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

假设表格的图形

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

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

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

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

感谢您的指点。

【问题讨论】:

  • 你是说你想要前 10 名用户的每个排列的最短路径的结果吗?
  • 是的。我已经通过以下形式的查询解决了这个问题:“WITH u ORDER BY u.score DESC LIMIT 10 MATCH u-[r]->(c:Box) WITH u,c,r, count(r) as rc WHERE rc > 1 RETURN u,r,c",换句话说,试图仅包含链接到多个用户的框,但这当然包括链接到不在我选择中的用户的框。然后我想到了 shortestPath,但请注意,这只能应用于两个已识别的节点。所以是的,我实际上是在寻求确定每个选定用户之间的最短路径,尽管这让我觉得这可能是一种低效的方式来解决它?
  • 我也尝试过 MATCH p=(u)-[:Owns]-(m), m-[]-(:User) 类型的结构,但我所做的尝试包括 Box 节点仅链接到我的用户选择集之一。这本质上是我的问题。如何确定 Box 集的范围。我显然错过了一些东西:)

标签: neo4j cypher


【解决方案1】:
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

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

【讨论】:

  • 布莱恩,非常感谢。第二个例子正好解决了我的问题。
猜你喜欢
  • 2013-04-04
  • 2014-01-09
  • 2016-03-04
  • 2021-12-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-01-15
相关资源
最近更新 更多