在Neo4J中查找具有特定重量的路径

时间:2019-04-08 19:21:17

标签: graph neo4j path-finding

对于一个学校项目,我需要找到权重X的从A点到B点的路径。到目前为止,我已经将所有节点和关系插入了Neo4J数据库中。您将如何在合理的时间内搜索该路径?

Neo4J数据库包含大约280万个节点和大约相同数量的关系。它们通过我编写的Go程序插入数据库,并从OSM文件中读取数据。

节点具有以下属性:nodeId,lat,lon。

关系“ DISTANCE”具有通过Vincenty formula计算的属性距离。

到目前为止,我已经尝试过在这个stackoverflow问题中找到的答案:Is neo4j suitable for searching for paths of specific length。 查询的问题在于,如果跳数增加,则将花费大量时间。

我也尝试过使用apoc的dijkstra算法,但不幸的是,这只是最短的路径。

这是上面提到的stackoverflow查询(我实际需要的跳数也存在问题):

MATCH
  (startNode:Node {nodeId:"597212967"}),
  (endNode:Node {nodeId:"1037604076"}),
  path = (startNode)-[:DISTANCE*45..51]-(endNode)
  WITH path, REDUCE(s = 0, r IN RELATIONSHIPS(path) | s + r.distance) AS weight
  WHERE weight >= 8500 AND weight <= 8600
RETURN path, weight
ORDER BY weight
LIMIT 1;

这是我正在使用的apoc dijkstra查询:

MATCH
  (startNode:Node {nodeId:"597212967"}),
  (endNode:Node {nodeId:"1037604076"})
CALL apoc.algo.dijkstra(startNode, endNode, 'DISTANCE', 'distance') YIELD path AS path, weight AS weight
RETURN path, weight

我希望在5秒或更短的时间内得到结果。使用dijkstra算法,我可以在大约1秒钟内得到一条路径,但是第一个查询花费的时间太长,甚至无法完成。

我非常感谢您的帮助:)

0 个答案:

没有答案