Neo4j 计算所有节点之间最短路径长度的完整矩阵

Neo4j 计算所有节点之间最短路径长度的完整矩阵,neo4j,shortest-path,Neo4j,Shortest Path,我们正试图找到一种方法,在neo4j数据库中创建全距离矩阵,其中该距离定义为任意两个节点之间最短路径的长度。当然,有shortestPath方法,但是使用循环遍历所有节点对并计算它们的最短路径会非常慢。我们明确地不是在谈论allshortestpath,因为它返回2个特定节点之间的所有最短路径 是否有针对大量节点(>30k)的快速特定方法或方法 谢谢大家!! j、 没有更简单的方法;构建全距离矩阵需要很长时间。 正如您所描述的,完整距离矩阵必须包含任意两个节点之间的最短路径,这意味着您必须在某个

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

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

谢谢大家!!
j、 没有更简单的方法;构建全距离矩阵需要很长时间。

正如您所描述的,完整距离矩阵必须包含任意两个节点之间的最短路径,这意味着您必须在某个点获取该信息。迭代每对节点并运行最短路径算法是实现这一点的唯一方法,复杂性将是算法复杂性的乘积

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

您当然可以利用一些动态规划方法来减少计算时间。例如,如果您正在尝试查找(A)和(C)之间的最短路径,并且已经计算了(B)到(C)之间的最短路径,那么如果您在从(A)进行寻路时碰巧遇到(B),则无需重新计算该路径的其余成本;这是众所周知的

然而,创建任何合理复杂度的动态编程解决方案几乎肯定最好是在一个单独的模块中为Neo4J创建一个插件。如果您正在做的是一次性操作或不会经常运行的操作,那么只需在每对之间调用
shortestPath
这个简单的解决方案可能会更容易,但是如果您计划在动态数据上相当频繁地运行它,那么编写一个自定义插件可能是值得的。这完全取决于你的需要


不过,不管怎样,计算都需要一些时间。动态规划解决方案将大大缩短时间(特别是在密集连接的图形中),但速度仍然不是很快。

最终结果是什么?这是重置某些属性或创建新边的一次性查询。或者是反复的频繁努力。如果是一次性的,则可以在创建可传递闭包环境的每个步骤中在两个节点之间创建边。边将指向两个节点之间,并且作为属性,具有距离

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

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

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

谢谢你的想法。正如您所说,最终的结果是,我们希望通过将图中的距离矩阵与原始数据(尚未转换为图数据)上计算的距离矩阵进行比较来优化某个算法。创建了许多图,我们要检查距离矩阵最接近非图的图。