【问题标题】:Calculating a full matrix of shortest path-lengths between all nodes计算所有节点之间最短路径长度的完整矩阵
【发布时间】:2018-09-29 21:54:46
【问题描述】:

我们正在尝试找到一种方法来在 neo4j 数据库中创建一个全距离矩阵,其中该距离定义为任意两个节点之间的最短路径的长度。当然,有shortestPath 方法,但是使用循环遍历所有节点对并计算它们的最短路径会变得非常慢。我们明确在谈论allShortestPaths,因为它会返回两个特定节点之间的所有最短路径。

对于大量节点 (>30k) 是否有快速的特定方法或方法?

谢谢! j.

【问题讨论】:

    标签: neo4j shortest-path


    【解决方案1】:

    最后的游戏是什么?这是重置某些属性或创建新边的一次性查询吗?或者经常性的努力。如果是一次性的,您可能会在每一步创建两个节点之间的边,从而创建一个传递闭包环境。边将指向两个节点之间,并具有距离作为属性。

    因此,如果路径是 a>b>c>d,您将创建边

    a>b 1
    a>c 2
    a>d 3
    b>c 1
    b>d 2
    c>d 1
    

    可以对边缘进行明确命名,以将它们与原始路径边缘区分开来。这可能会创建循环路径,既不会否定此策略,也不需要约束。如果您正在处理有向无环图,它会很好用。

    【讨论】:

    • 感谢您的想法。正如您所说,最终游戏是我们希望通过将图中的距离矩阵与在原始尚未转换为图形的数据上计算的距离矩阵进行比较来优化某个算法。创建了许多图,我们想要检查距离矩阵最接近非图的那些。
    【解决方案2】:

    没有更简单的方法;完整的距离矩阵需要很长时间才能构建。

    正如您所描述的,全距离矩阵必须包含任意两个节点之间的最短路径,这意味着您必须在某个时候获取该信息。迭代每对节点并运行最短路径算法是做到这一点的唯一方法,复杂度将是O(n) 乘以算法的复杂度。

    但您可以使用动态编程解决方案减少运行时间。

    您当然可以利用一些动态编程方法来减少计算时间。例如,如果您试图找到 (A) 和 (C) 之间的最短路径,并且已经计算出从 (B) 到 (C) 的最短路径,那么如果您在从 (A) 寻路时碰巧遇到 (B) ),您不需要重新计算该路径的其余成本;众所周知。

    但是,几乎可以肯定的是,创建一个具有合理复杂性的动态编程解决方案最好在一个用于 Neo4J 的单独模块中完成,该模块被放入插件中。如果您正在做的是一次性操作或不会经常运行的操作,那么在每对之间调用shortestPath 的幼稚解决方案可能会更容易,但如果您打算公平地运行它经常在动态数据上,可能值得编写一个自定义插件。这完全取决于您的需求。

    不过,无论如何,计算都需要一些时间。动态规划解决方案会大大减少时间(尤其是在密集连接的图中),但仍然不会很快。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-08-07
      • 1970-01-01
      • 2019-04-20
      • 1970-01-01
      • 2016-03-26
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多