【问题标题】:How to implement Dijkstra's algorithm in Neo4j using Cypher如何使用 Cypher 在 Neo4j 中实现 Dijkstra 算法
【发布时间】:2014-12-08 15:27:45
【问题描述】:

我的问题是:是否可以使用 Cypher 实现 Dijkstra 算法? neo4j网站上的解释只讲了REST API,对于我这样的初学者来说很难理解

请注意,我想找到两个节点之间距离最短的最短路径,而不是两个节点之间的最短路径(涉及最少数量的关系)。我知道使用 Cypher 很容易实现的 shortestPath 算法,但它不符合我的目的。

如果我有一个带有节点的图形数据库,以及具有“距离”属性的节点之间的关系,请指导我如何进行操作。我想要的只是编写一个代码,借助它我们将能够找出数据库中两个节点之间的最短距离。或者如果我需要改变我的方法并为此使用其他程序有什么提示?

【问题讨论】:

  • 有一个与此相关的recent question,也许有帮助。
  • 是的,我问了这个问题,我收到的答案是正确的,因为我可以获得最短路径(最少的关系)和节点之间的距离总和......但是什么我正在寻找的是最短的路径(最小的“距离”),所以我必须提出另一个问题来澄清这一点
  • 这里的“距离”是什么意思?您的关系中是否有一些属性表示两个节点之间一个关系“跳跃”的距离?
  • 是的,完全正确。每个关系都有一个称为距离的属性

标签: neo4j cypher dijkstra


【解决方案1】:

在这种情况下,您可以实现 allShortestPaths,根据关系的距离属性以升序对路径进行排序,并仅返回一个,根据您的上一篇文章,它将是这样的:

MATCH (from: Location {LocationName:"x"}), (to: Location {LocationName:"y"}) , 
paths = allShortestPaths((from)-[:CONNECTED_TO*]->(to))
WITH REDUCE(dist = 0, rel in rels(paths) | dist + rel.distance) AS distance, paths
RETURN paths, distance
ORDER BY distance
LIMIT 1

【讨论】:

  • 谢谢!!您能否编辑您的代码:第四行中的路径而不是路径和第五行中的路径而不是 p,这样如果将来其他人看到这一点,他们就不会感到困惑。
  • 是的,很抱歉,在本地进行了一些测试:)
  • Neo4j 中的 dijkstra 实现也可以用作服务器扩展的一部分或通过 REST API:neo4j.com/docs/stable/…
  • 警告 - 上述解决方案首先过滤所有最短路径基于关系数量。然后它使用距离属性来找到最短的。在第 1 步中,我们可能已经错过了关系数量较多但总距离较少的路径
  • 它们会被返回,所有的意义都是allShortestPath
【解决方案2】:

不,除非您使用事务并基本上重写算法,否则不可能以合理的方式进行。 前面的答案是错误的,因为 allShortestPaths 子集不会返回更长但更便宜的路径。您将在不考虑关系成本的情况下过滤已选择的路径子集。

【讨论】:

    猜你喜欢
    • 2015-02-05
    • 1970-01-01
    • 2022-01-05
    • 1970-01-01
    • 2019-04-02
    • 2014-01-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多