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