如何在Neo4j中更快地进行多级路径遍历

时间:2019-01-07 18:59:46

标签: neo4j cypher neo4j-apoc

我想找到从叶节点(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

Data Model

Query Profile

1 个答案:

答案 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