我想找到从叶节点(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秒内得到结果。
系统配置:
系统内存为32 is
储存: SSD
电流Neo4j Conf:
堆大小:初始值-12 max最大值-12 max
缓存:12
数据库大小: 1.6GB


发布于 2019-01-07 21:17:06
如果您的DB路径具有很大的可变性(例如,C节点并不总是后面跟着D节点),但是您知道您总是想要一个特定的路径模式(例如A->B->C->D->E),那么指定显式模式应该要快得多:
MATCH path=(:A)-[:USE]->(:B)-[:USE]->(:C)-[:USE]->(:D)-[:USE]->(:E)
RETURN path可变长度的路径模式是昂贵的,因为它们具有指数复杂性(基于路径的深度)。
更新
即使您感兴趣的DB路径没有任何可变性(例如,从A到E的路径总是类似于A->B->C->D->E),但是包含这些路径的路径更长(例如,如果E节点有较长的传出USE路径),那么没有上限的可变长度路径模式将迫使neo4j测试所有这些传出路径。在这种情况下,如果您仍然希望使用可变长度的路径模式,那么应该指定一个固定的上界,因为您知道感兴趣的路径的确切长度(在本例中为4):
MATCH path=(:A)-[:USE*..4]->(:E) RETURN pathhttps://stackoverflow.com/questions/54080242
复制相似问题