对于一个学校项目,我需要找到权重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秒钟内得到一条路径,但是第一个查询花费的时间太长,甚至无法完成。
我非常感谢您的帮助:)