简单的Cypher查询apoc dijkstra取得FOREVER

时间:2018-01-31 08:49:30

标签: neo4j cypher query-optimization gtfs

也许我非常愚蠢或 Neo4j 不应该很快。 (免责声明:我是Neo4j noob)

我有以下简单的 dijkstra查询,它将永远运行。我必须至少等待 5-10分钟才能执行。有时候我的Chrome浏览器崩溃了。

示例图

enter image description here

Cypther查询

profile MATCH  (startNode:Stop)--(st:Stoptime),
(endNode:Stop)--(et:Stoptime)
where  endNode.name = 'Hauptbahnhof Süd' and 
(startNode.name = 'Schlump' or startNode.name = 'U Schlump')     
call apoc.algo.dijkstra(st, et, 'PRECEDES', 'weight') YIELD path, weight
return startNode, endNode, path, weight
limit 100;

计算机配置

我在Windows机器上使用Ubuntu VM,它有24GB Ram和6 Cpus。

索引

enter image description here

sysinfo控件 enter image description here

当我在上面的Query上运行配置文件时,我得到以下信息:

资料信息

enter image description here

为了爱上帝,我无法弄明白,瓶颈所在。我已经检查了所有其他答案,但无济于事。

1 个答案:

答案 0 :(得分:1)

由于我没有数据集来测试我的建议,我只能指出你的方向。希望它会引导您找到答案。

在查看配置文件和查询时,我看到startNode和endNode都是类型:Stop,并且Stop.name属性已编入索引。

在寻找endNode.name ='HauptbahnhofSüd'时,估计有3行,并返回3行。

然而,当查找(startNode.name ='Schlump'或startNode.name ='U Schlump')时,估计有6行,但返回了14827行。

确实有14827:停止包含'Schlump'或'U Schlump'的节点?

或者它是6个估计的行?如果是后者,则可以在没有OR的情况下运行查询:

其中endNode.name ='HauptbahnhofSüd'和startNode.name ='Schlump'

了解分析器的用途。

如果按预期执行,那么解决方案可能是重写查询以包含不同格式的OR逻辑?

也许 其中endNode.name ='HauptbahnhofSüd'和startNode.name IN ['Schlump','U Schlump']

还发现此older answer表示OR运算符和3.2之前的索引存在问题。

我记得曾经看过另一个关于OR问题的最新答案,但现在似乎无法找到它。

祝你好运!