Neo4j中非常高的查询运行时

时间:2018-09-28 19:10:50

标签: neo4j cypher

我正在尝试通过示例自学Neo4J。通过使用我城市中的地铁站数据集,我试图找到两个地铁站之间的所有换乘路径,同时确定最短路径和涉及的线路。

要计算距离,我使用了从KML抓取的大约500个基于位置的节点,节点之间的加权边缘归为PHYSICAL_CONNECTION。边具有其长度和它们对应的线的名称作为属性。如果节点是铁路路段,则为TrackPoints;如果代表车站,则为Station。

但是,我发现我的查询时间变化很大-有时需要2秒,有时需要数百秒,而且我无法通过分析找出我在做什么错!!

这是我的示例查询:

MATCH (startNode:Station{name:"Station1"}) USING INDEX startNode:Station(name)  WITH startNode
MATCH (endNode:Station{name:"Station2"}) USING INDEX endNode:MetroArea(name) WITH startNode, endNode
MATCH p=(startNode)-[*2..7]-(endNode) WHERE ALL (node in nodes(p) WHERE node:Station OR node:TrackPoint)
WITH p AS shortestPath,
reduce(distance=0, r in [x IN relationships(p) WHERE exists(x.distance)] |  distance+r.distance) AS totalDistance
                ORDER BY totalDistance ASC LIMIT 1
RETURN extract(rel in [x IN relationships(shortestPath) WHERE type(x) = "PHYSICAL_CONNECTION"] | rel.LineName) as LineNames, totalDistance

我犯了一些明显的错误吗?

1 个答案:

答案 0 :(得分:0)

具有可变长度路径(例如p=(startNode)-[*2..7]-(endNode))的查询具有指数复杂度[O(N**d), where N=(relationships per node), d=(depth of path)]。

因此,如果特定的startNode / endNode对恰好属于一个较小的连接子图,则查询将很快。但是,如果它们是连接的大子图的一部分,那么您的查询很容易会花费很长的时间,甚至会耗尽内存。

一个小建议是更具体地说明您在可变长度路径中允许的关系类型(如果数据模型在到endNode的过程中有不需要的关系类型)。这将有助于沿着不合适的路径短路搜索。例如(如果您只想让路径包含STOPS_AT和/或ENDS_AT关系类型):

MATCH p=(startNode)-[:STOPS_AT|ENDS_AT*2..7]-(endNode)

但是,如果可以减少可变长度路径查询的上限,则应该看到更大的影响。假设使用5代替7