【问题标题】:Difference between Neo4j Dijkstra and shortestPath performance?Neo4j Dijkstra 和 shortestPath 性能之间的区别?
【发布时间】:2015-09-02 19:34:06
【问题描述】:

我有一个数据库,其中包含随机数据,其中包含诸如人-> 就读-> 大学、人1-> 朋友-> 人2 等社会关系。 有 4 种类型的节点。我的数据库有大约 3M 节点和 12M 边。

当我尝试使用 REST API 查询 2 个随机节点之间的路径时 我在大约 3-4 秒内得到了 shortestPath 算法的响应。但是使用 Dijkstra 运行相同的查询永远不会返回。

我知道 Dijkstra 很贵,但我可能做错了什么吗?

网址 - http://localhost:7474/db/data/node/499052/paths

最短路径的有效载荷-

{ "to": "http://localhost:7474/db/data/node/296431", "algorithm": "shortestPath", "max_depth":4 }

dijkstra 的有效载荷-

{ "to": "http://localhost:7474/db/data/node/296431", "cost_property": "weight", "algorithm": "dijkstra", "max_depth":4 }

【问题讨论】:

    标签: rest neo4j dijkstra shortest-path


    【解决方案1】:

    不,您没有做错任何事情,不幸的是,shortestPathdijkstra 之间的性能差异如此之大。如果你的权重都是 1,那么我肯定会推荐使用 shortestPath

    【讨论】:

    • 它是 Neo4j 特有的吗?即使我离开它一个小时左右,Dijkstra 也不会返回路径。我看到了 neo4j 的源代码,似乎他们正在使用斐波那契堆,所以实现应该是 O(E+VlogV)。我想知道还有什么其他因素会影响它这么慢。
    • dijkstra 在请求多条路径时的终止条件有点草率。基本上这会导致更多不必要的遍历。这是我们现在正在研究的事情。您在示例中的节点之间找到了多少条路径?
    • allShortestPath 在 max_depth 4 处为我提供了一条路径。我的图形直径较小,因此我预计路径长度可能不会超过 5-6。我认为最好的方法是编写一个自定义 PathExpander 来切断 dijkstra 对更长路径的扩展。如果您有任何其他解决方法,请告诉我。
    • 我尝试了 PathExpander 方法。现在不再返回,而是大约需要 10-15 分钟。你有什么建议吗?可能会增加堆大小。
    • 这听起来是个好主意(很高兴看到它奏效了)。理想情况下,一旦 PathExpander 不再能够“击败”找到的最短路径,它就会立即终止。
    猜你喜欢
    • 2014-07-09
    • 1970-01-01
    • 2019-01-31
    • 2021-07-06
    • 2014-05-11
    • 2011-10-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多