我想找到从叶节点(E)到根节点(A)的所有路径。 (不适用于任何特定节点,因此此处没有ID或字段过滤器)
数据模型如图所示。
我使用了基本的Cypher查询来查找路径(从A到E):
MATCH path=(:A)-[:USE*]->(:E) RETURN path
它会一直运行,而且永远不会完成。
我尝试使用以下方法获取从C到E的路径:
MATCH path=(:C)-[:USE*]->(:E) RETURN path
此查询最多需要18秒才能返回18k路径。 我已经尝试过使用扫描,但是时间没有任何改善。
如何改善遍历以在更短的时间内返回结果? 我需要在4-5秒钟内得到结果。
系统配置:
系统内存为32GB
存储:SSD
当前的Neo4j Conf:
堆大小: 初始12GB 最大12GB
缓存:12GB
数据库大小:1.6GB
答案 0 :(得分:2)
如果您的数据库路径具有很多可变性(例如,C
节点并不总是跟着D
节点),但是您知道您总是想要特定的路径模式(例如,{{ 1}}),然后指定显式模式应该更快:
A->B->C->D->E
可变长度路径模式非常昂贵,因为它们具有指数级的复杂度(基于路径的深度)。
[更新]
即使您感兴趣的数据库路径没有任何可变性(例如,从MATCH path=(:A)-[:USE]->(:B)-[:USE]->(:C)-[:USE]->(:D)-[:USE]->(:E)
RETURN path
到A
的路径总是看起来像E
),但是存在更长的路径包括那些路径(例如,如果A->B->C->D->E
节点具有较长的传出E
路径),则没有上限的可变长度路径模式将迫使neo4j测试所有这些传出路径。在这种情况下,如果您仍想使用可变长度的路径模式,则应指定一个固定的上限,因为您知道所关注路径的确切长度(在此示例中为USE
):< / p>
4