是否有人知道在neo4j中找到图形数据库中所有节点之间的更快方法?
目前,我正在使用O(n ^ 2)解决方案,我找到每个可能的节点对之间的最短路径。
任何线索或实施都将非常感激。特别是如果它在python中。
答案 0 :(得分:0)
我所知道的最快的中间性算法是the one by Brandes。它以O(nm)运行,即,如果图形稀疏,则速度明显更快。该算法相当复杂,可能没有在neo4j中实现。但是,应该可以实施它。
你为什么使用neo4j?你的图表是否太大而不适合主内存?我不知道neo4j,但这似乎是他们的卖点:他们可以在外部记忆中进行计算。如果不是这种情况,我强烈建议将整个图形加载到RAM中的一些简单表示中,并在那里进行计算。这几乎总是比在一些数据库后端上工作更快。
但是,如果您的图形对于主存储器来说太大,您可能需要考虑特别适合外部计算的替代算法。您可能还想考虑不能精确计算中间性的算法,但只能近似计算。
让我引用Bergamini and Meyerhenke的作品,它提供了非常好的文献综述([...]中的参考文献可以在论文中找到):
现存最快 用于精确BC计算的方法BA,需要Θ(nm)运算 未加权图和具有正边的图的Θ(nm + n 2 log n) 权重[7]。 BA计算[...算法的描述遗漏...]基于这个概念,一些算法用于近似 BC已经开发出来了。 Brandes和Pich [8]建议近似 cB(v)通过从源子集的贡献中推断出来 节点,也称为枢轴。随机均匀选择枢轴, 近似可以证明是cB(v)的无偏估计 (即它的期望等于cB(v))。在随后的工作中, Geisberger等人。 [14]注意到这可能高估了BC的得分 节点靠近枢轴。为了限制这种偏见,他们引入了一个 缩放功能,对来自的贡献不太重要 靠近节点的枢轴。 Bader等。 [1]近似于BC 仅基于自适应采样技术的特定节点 减少具有高中心性的节点的枢轴数。 Chehreghani [9]提出了尝试的替代抽样技术 最小化样本数量。与以前的方法不同 是Riondato和Kornaropoulos [25]的近似算法, 在每次迭代中对单个随机最短路径进行采样。这个 方法允许对质量的理论保证 近似。