【问题标题】:What's the best way to find out if there is a path between 2 nodes in Neo4j?找出 Neo4j 中 2 个节点之间是否存在路径的最佳方法是什么?
【发布时间】:2018-10-20 15:45:23
【问题描述】:

我有一个包含 100k 节点和 5m 关系的 Neo4j 项目。 我的问题: 像“最短路径”这样的算法需要 2-4ms 才能找到最短路径。

MATCH p = shortestPath((p1:Person{nickname:"sievers_amara"})-
[:follows*..5]->(p2:Person{nickname:"burghardt_giulia"}))
WHERE p1 <> p2
RETURN p

但是我的算法找出 2 个节点之间是否存在路径大约需要 200 毫秒... 找到最短路径应该比找出是否有路径更难...... 这是我找出是否有路径的代码:

MATCH p=(p1:Person{nickname:"sievers_amara"})-[r:follows*1..5]->(p2:Person{nickname:"burghardt_giulia"})
WHERE p1 <> p2
RETURN p LIMIT 1

我可以改进什么?

编辑:将PROFILE 放在我的“是否有路径”查询前面会导致:

【问题讨论】:

  • 我想,你已经有了 Person.nickname 的索引?
  • 能否请您在第二个查询前添加PROFILE 并发布结果?
  • 我确实在昵称上创建了一个约束。不确定这是否相同...CREATE CONSTRAINT ON (p:Person) ASSERT p.nickname IS UNIQUE。我在帖子中添加了带有PROFILE 的屏幕截图。
  • 问题是常规模式匹配没有绕过最小化路径长度的图。因此,常规模式匹配可以首先沿着较长的路径进行,绕过较短的路径。因此,shortPath 更有效。

标签: database neo4j path


【解决方案1】:

shortestPath() 使用breadth-first 进行扩展,因此它使用最快的方式来检测路径是否存在,并且一旦找到第一个路径就不会继续扩展。

可变长度扩展使用depth-first 扩展,因此即使到相关节点的路径非常短,也不能保证首先探索短路径,因此在这种情况下会尝试许多路径(并且在找到第一个匹配项之前发现不匹配)(并且该匹配项的路径可能根本不是最短路径)。

【讨论】:

    猜你喜欢
    • 2013-11-06
    • 2018-08-22
    • 1970-01-01
    • 2016-03-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-19
    相关资源
    最近更新 更多