在Neo4j中使用Dijkstra算法的一次以上性质

bxpogfeg  于 2022-10-01  发布在  其他
关注(0)|答案(2)|浏览(213)

在Cypher中有没有什么方法可以使用Dijkstra算法来计算具有多个属性的最小权重,而不是:

CALL apoc.algo.dijkstra(start, end, 'RELATED_TO>', '1_property') 
yield path, weight

做一些类似的事情:

CALL apoc.algo.dijkstra(start, end, 'RELATED_TO>', '1_property+2_property') 
yield path, weight

这对我不起作用。你有什么建议吗?因为我想在权重的计算中加入路径的长度,作为对最小权重计算的影响。

tf7tbtn2

tf7tbtn21#

您可以查看Memgraph、高性能、内存和事务图形数据库。openCypherBolt兼容。(免责声明:我是联合创始人兼首席技术官)。Memgraph内置了加权最短路径功能,其中总权重通过用户定义的lambda函数计算。基于此数据集

CREATE (n1 {id: 1}) CREATE (n2 {id: 2}) CREATE (n3 {id: 3}) CREATE (n4 {id: 4})
CREATE (n1)-[:E {weight1: 1, weight2: 1}]->(n2)
CREATE (n1)-[:E {weight1: 2, weight2: 10}]->(n3)
CREATE (n2)-[:E {weight1: 3, weight2: 100}]->(n4)
CREATE (n3)-[:E {weight1: 4, weight2: 1}]->(n4);

相关Memgraph的查询是

MATCH (a {id: 1})-[
          edges *wShortest (e, n | e.weight1 + e.weight2) total_weight
      ]-(b {id: 4})
RETURN startNode(head(edges)).id +
       reduce(acc = "", edge IN edges | acc + " -> " + endNode(edge).id) AS hops,
       total_weight;

结果如下。

| hops      | total_weight |
|-----------|--------------|
|1 -> 3 -> 4| 17.0         |
7bsow1i6

7bsow1i62#

对于apoC,您需要使用一个额外的属性来保存总和。

对于图形算法中的一个,您可以使用将两个权重相加的图形投影。

Https://neo4j-contrib.github.io/neo4j-graph-algorithms/#_single_source_shortest_path

您可以在配置节中使用nodeQueryrelationshipQuery

CALL algo.shortestPath.stream(start, end, 'weight',
{nodeQuery:'match (n) return id(n) as id', 
 relationshipQuery:'match (n)-[r]->(m) return id(n) as source, id(m) as target, r.weight1+r.weight2 as weight', 
defaultValue:1.0,direction:'OUTGOING'}) 
YIELD nodeId, cost

相关问题