我们正在尝试在neo4j数据库中找到一种创建全距离矩阵的方法,其中该距离定义为任意两个节点之间最短路径的长度。当然,有shortestPath
方法,但是使用遍历所有节点对的循环并计算它们的最短路径变得非常慢。我们明确地不谈论allShortestPaths
,因为它返回了2个特定节点之间的所有最短路径。
对于大量节点(> 30k),是否存在快速的特定方法或方法?
谢谢! 学家
答案 0 :(得分:1)
没有更简单的方法;全距离矩阵需要很长时间才能构建。
正如您所描述的那样,全距离矩阵必须包含任意两个节点之间的最短路径,这意味着您必须在某个时刻获取该信息。迭代每对节点并运行最短路径算法是实现此目的的唯一方法,复杂性将O(n)
乘以算法的复杂性。
但您可以使用动态编程解决方案减少运行时。
您当然可以利用一些动态编程方法来减少计算时间。例如,如果你试图找到(A)和(C)之间的最短路径,并且已经计算了从(B)到(C)的最短路径,那么如果碰巧遇到(B)而从路径寻找(A) ),您不需要重新计算该路径的其余成本;它是众所周知的。
但是,创建任何合理复杂度的动态编程解决方案几乎肯定最好在Neo4J的单独模块中完成,该模块将被插入到插件中。如果您正在进行的是一次性操作或不能频繁运行的操作,那么在每对之间调用shortestPath
的天真解决方案可能更容易,但如果您打算在动态数据上经常运行它,可能值得创作一个自定义插件。这完全取决于你的需求。
无论如何,计算都需要一些时间。动态编程解决方案将大大减少时间(特别是在密集连接的图形中),但它仍然不会很快。
答案 1 :(得分:0)
最终游戏是什么?这是一次性查询,它会重置某些属性或创建新边。或者反复频繁的努力。如果它是一次性的,您可以在每个步骤创建两个节点之间创建边缘,从而创建一个传递闭包环境。边缘将指向两个节点之间,并且具有距离的属性。
因此,如果路径是> b> c> d,则会创建边
a>b 1
a>c 2
a>d 3
b>c 1
b>d 2
c>d 1
可以区别地命名边缘以将它们与原始路径边缘区分开。这可能会创建循环路径,既不会否定此策略或需要约束。如果你正在处理有向无环图,它会运作良好。