如何实施Dijkstra';基于Cypher的Neo4j中的s算法

如何实施Dijkstra';基于Cypher的Neo4j中的s算法,neo4j,cypher,dijkstra,Neo4j,Cypher,Dijkstra,我的问题是:有可能用密码实现Dijkstra的算法吗?neo4j网站上的解释只涉及RESTAPI,对于像我这样的初学者来说很难理解 请注意,我希望找到两个节点之间距离最短的最短路径,而不是两个节点之间的最短路径(涉及的关系数最少)。我知道最短路径算法很容易用Cypher实现,但它不符合我的目的 如果我有一个带有节点的图形数据库,请指导我如何继续,以及节点之间具有“距离”属性的关系。我只想写一个代码,借助它,我们将能够找出数据库中两个节点之间的最短距离。如果我需要改变我的方法并使用其他程序来实现这

我的问题是:有可能用密码实现Dijkstra的算法吗?neo4j网站上的解释只涉及RESTAPI,对于像我这样的初学者来说很难理解

请注意,我希望找到两个节点之间距离最短的最短路径,而不是两个节点之间的最短路径(涉及的关系数最少)。我知道最短路径算法很容易用Cypher实现,但它不符合我的目的


如果我有一个带有节点的图形数据库,请指导我如何继续,以及节点之间具有“距离”属性的关系。我只想写一个代码,借助它,我们将能够找出数据库中两个节点之间的最短距离。如果我需要改变我的方法并使用其他程序来实现这一点,还有什么建议吗

在这种情况下,您可以实现allShortestPaths,根据关系的距离属性按升序排列路径,并根据上一篇文章只返回一条路径,如下所示:

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

不,除非您使用事务并基本上重写算法节奏,否则以合理的方式是不可能的。
前面的答案是错误的,因为allShortestPaths子集不会返回更长但更便宜的路径。您将在不考虑关系成本的情况下筛选已选择的路径子集。

有一个与此相关的问题,可能会有所帮助。是的,我问了这个问题,我得到的答案是正确的,因为我可以获得最短路径(最少的关系数)节点之间距离的总和……但我要寻找的是最短路径(最小“距离”),所以我必须提出另一个问题来澄清“距离”在这里是什么意思?您的关系中是否有表示两个节点之间一个关系“跃点”上的距离的属性?是的,完全正确。每个关系都有一个名为DistanceThank的属性!!请编辑您的代码:第四行中的路径而不是路径,第五行中的路径而不是p,这样以后如果有人看到这一点,他们就不会感到困惑了。是的,很抱歉,与local中的一些测试混合使用:)Neo4j中的dijkstra实现也可以用作服务器扩展的一部分,或者通过REST API:Caution-上述解决方案首先根据关系数过滤所有最短路径。然后利用距离特性来寻找最短距离。在步骤1中,我们可能已经错过了那些关系数量较多但总距离较短的路径,它们将被返回,所有这些都是最短路径的意思