2014-12-07 174 views
2

我对Neo4j很新。有人可以向我解释(请逐步说明)我如何实现Dijkstra算法来找到两个节点之间的最短路径?使用Cypher可以简单地做到吗?在Neo4j中实现Dijkstra算法

我已经尝试过的最短路径算法,但它是非常缓慢:

MATCH (from: Location {LocationName:"x"}), (to: Location {LocationName:"y"}) , path = (from)-[:CONNECTED_TO*1..5]->(to) 
RETURN path AS shortestPath, 
    reduce(distance = 0, r in relationships(path)| distance+toInt(r.Distance)) 
AS totalDistance 
    ORDER BY totalDistance ASC 
    LIMIT 1 

我的节点是:与性能LocationID和LOCATIONNAME 位置我的关系是:CONNECTED_TO财产距离

我有更多的超过6000的关系

请注意在上面的代码中,我限制为1..5, 当我没有定义这个限制时,查询不会给出任何结果(ke上执行的EPS)

感谢

回答

12

是有可能用Cypher支架或与Neo4j的REST API的dedicated endpoint

BTW,从Cypher支架的Neo4j文档的例子是自我解释:

http://neo4j.com/docs/milestone/query-match.html#_shortest_path

为了让两个节点之间的最短路径:

MATCH (from: Location {LocationName:"x"}), (to: Location {LocationName:"y"}) , 
path = shortestPath((from)-[:CONNECTED_TO*]->(to)) 
RETURN path 

如果你想获得的所有最短

​​

如果您想按t他降序排列的路径长度(跳数):

MATCH (from: Location {LocationName:"x"}), (to: Location {LocationName:"y"}) , 
paths = allShortestPaths((from)-[:CONNECTED_TO*]->(to)) 
RETURN paths 
ORDER BY length(paths) DESC 

如果你得到最短路径+的关系距离属性的总和:

MATCH (from: Location {LocationName:"x"}), (to: Location {LocationName:"y"}) , 
path = shortestPath((from)-[:CONNECTED_TO*]->(to)) 
WITH REDUCE(dist = 0, rel in rels(path) | dist + rel.distance) AS distance, p 
RETURN p, distance 
+1

感谢您的回应克里斯托夫。唯一的附加点(我忘记提及,这是我的错),是我还希望有最短路径的总距离作为查询的结果。这就是为什么我在发布的查询中使用了reduce函数。但是,使用此函数往往会使查询非常缓慢并且实际上不可用,因此您可以提出解决此问题的方法。谢谢 – Shazu 2014-12-07 22:08:08

+0

你可以在return语句中使用它:RETURN path,length(shortestPath)长度为 – 2014-12-07 22:12:04

+0

感谢您的回复。节点之间的关系具有属性“距离”。最短路径的长度仅仅返回跳数,而不是节点x和节点y(开始和结束节点)之间的实际距离。 那么有可能以有效的方式返回最短路径的距离吗? – Shazu 2014-12-07 22:24:56