Neo4j-基于关系属性寻找两个节点之间的最短路径
我试图找出是否有某种方法可以基于关系和获得两个节点之间的最短距离,给出以下示例: 上图的代码:Neo4j-基于关系属性寻找两个节点之间的最短路径,neo4j,Neo4j,我试图找出是否有某种方法可以基于关系和获得两个节点之间的最短距离,给出以下示例: 上图的代码: CREATE (some_point_1:Point {title:'Some Point 1'}) CREATE (some_point_2:Point {title:'Some Point 2'}) CREATE (some_point_3:Point {title:'Some Point 3'}) CREATE (some_point_4:Point {title:'Some Point 4'
CREATE (some_point_1:Point {title:'Some Point 1'})
CREATE (some_point_2:Point {title:'Some Point 2'})
CREATE (some_point_3:Point {title:'Some Point 3'})
CREATE (some_point_4:Point {title:'Some Point 4'})
CREATE (some_point_5:Point {title:'Some Point 5'})
CREATE (some_point_6:Point {title:'Some Point 6'})
CREATE (some_point_1)-[:distance {value:100}]->(some_point_2)
CREATE (some_point_2)-[:distance {value:150}]->(some_point_4)
CREATE (some_point_1)-[:distance {value:200}]->(some_point_3)
CREATE (some_point_3)-[:distance {value:300}]->(some_point_4)
CREATE (some_point_2)-[:distance {value:500}]->(some_point_5)
CREATE (some_point_4)-[:distance {value:300}]->(some_point_5)
CREATE (some_point_5)-[:distance {value:300}]->(some_point_6)
CREATE (some_point_6)-[:distance {value:300}]->(some_point_1)
在本例中,最短路径应为:
一些点1>一些点2>一些点4>一些点5(100+150+300=550)
Cypher有这样的功能吗?Cypher有一个最短路径()函数,它与谓词和一些尝试和错误相结合,可能会实现您想要的功能
但为了节省时间,它更容易使用,其中包括一个加权dijkstra最短路径算法,应该是一个完美的适合你想要的
我还没有使用它,但我认为语法(在startNode和endNode上匹配后,使用关系的名称和用于权重的属性)类似于
CALL apoc.algo.dijkstra(startNode, endNode, 'distance', 'value')
YIELD path, weight
至于考虑方向,wiki文档并没有直接说明,但我认为,<或>似乎被添加到了关系标签的适当末端,因此“距离>”可能是更正确的参数,如果您希望它尊重方向。Cypher中的
最短路径
函数不考虑关系属性的累积,因此:
MATCH (start:Point {title: 'Some Point 1'}), (end:Point {title: 'Some Point 5'})
MATCH p=shortestPath((start)-[:distance*]->(end))
RETURN p
将根据路径中的关系数找到从start
到end
的最短路径
您可以减少距离之和:
MATCH (start:Point {title: 'Some Point 1'}), (end:Point {title: 'Some Point 5'})
MATCH p=(start)-[:distance*]->(end)
WITH p,reduce(s = 0, r IN rels(p) | s + r.value) AS dist
RETURN p, dist ORDER BY dist DESC
但这里的问题是,您需要计算从开始
到结束
的所有路径的总距离。为了提高效率,您需要使用像或a*这样的图搜索算法,这两种算法都在中实现
在Neo4j 3.0中,这些算法通过密码公开。安装APOC后,您可以从Cypher调用该过程:
MATCH (start:Point {title: 'Some Point 1'}), (end:Point {title: 'Some Point 5'})
CALL apoc.algo.dijkstra(start, end, 'distance', 'value') YIELD path, weight
RETURN path, weight
谢谢它起作用了^^