如何使用 Neo4j 的 gds.shortestPath.dijkstra.stream 来处理具有 elementId(node) 而不是 id(node) 的节点?

问题描述 投票:0回答:2

我有一个从节点和关系“(n1:Place)-[r:COST]->(n2:Place)”投影的图表。 为了找到名称为“a”和“z”的两个节点之间最便宜的路径,我使用 Dijkstra 的最短路径算法:

MATCH (start:Place) where 'a' = start.name
MATCH (end:Place) where 'z' = end.name
CALL gds.shortestPath.dijkstra.stream('my-graph',{
    sourceNode: id(start),
    targetNode: id(end),
    relationshipWeightProperty: 'cost'
})
YIELD nodeIds

它工作得很好,但我读到 id(node):int 已被弃用,在 Neo4j 1.5.8 中我应该使用新的 elementId(node):string 函数。

MATCH (start:Place) where 'a' = start.name
MATCH (end:Place) where 'z' = end.name
CALL gds.shortestPath.dijkstra.stream('my-graph',{
    sourceNode: elementId(start),
    targetNode: elementId(end),
    relationshipWeightProperty: 'cost'
})
YIELD nodeIds

但是,由于 elementId() 返回字符串而不是 int,因此会引发异常:

Failed to invoke procedure `gds.shortestPath.dijkstra.stream`: Caused by: java.lang.IllegalArgumentException: Expected a node or a node id for `sourceNode`. Got String. 

还有其他选项支持使用 elementId() 而不是 id() 进行寻路吗?

neo4j cypher
2个回答
1
投票

GDS 目前不支持

elementId()
值,因此您必须使用
id()


0
投票

elementID 是一个字符串,但您可以获取 id,如下所示:

match (n) return  toInteger(split(elementId(n),':')[2]) 
© www.soinside.com 2019 - 2024. All rights reserved.