Neo4j 合并路径上的节点计算关系的(复合)属性

Neo4j 合并路径上的节点计算关系的(复合)属性,neo4j,cypher,Neo4j,Cypher,(使用Neo4j 3.x和Neo4j.v1 Python驱动程序) 我有一个由节点链表组成的轨迹,每个节点代表一对(lon,lat)坐标 (A) -[:下一个]->(B)-[:下一个]->(C)等。 使用每个节点上的lon、lat属性 问题1 两个相邻节点的坐标之间的直接距离,例如(0,0)和(1,1),可以添加为两个相邻节点之间关系-[:NEXT{distance:1.41421}]>的“距离”属性。考虑到我有数千个这样的节点,你怎么能这样做呢 问题2 此节点链接列表的整个段可以替换为单

(使用Neo4j 3.x和Neo4j.v1 Python驱动程序)

我有一个由节点链表组成的轨迹,每个节点代表一对(lon,lat)坐标


(A) -[:下一个]->(B)-[:下一个]->(C)等。
使用每个节点上的lon、lat属性

问题1

两个相邻节点的坐标之间的直接距离,例如(0,0)和(1,1),可以添加为两个相邻节点之间关系-[:NEXT{distance:1.41421}]>的“距离”属性。考虑到我有数千个这样的节点,你怎么能这样做呢

问题2

此节点链接列表的整个段可以替换为单个-[:NEXT]>关系,其中“distance”属性是原始列表相邻节点之间所有距离的总和。对于数千个或更多的节点,如何有效地实现这一点


(A) -[:下一个{距离:1}]->(B)-…->(D)-[:下一个{距离:1}]->(E)
(A) -[:下一个{距离:4}}->(E)


感谢您的指导和提示。

第1部分:您使用的是lat/lon,在neo4j 3.0中有对点和距离的本机支持,请确保使用
纬度
经度
属性键。然后,您可以在与以下各项的关系上设置此属性:

MATCH (start:YourNodeLabel)-[r:NEXT]->(end)
SET r.distance = distance(point(start), point(end)) / 1000
第2部分:如果知道路径的起点和终点节点,则可以通过减少关系的距离属性来创建下一个关系:

MATCH (start:YourNodeLabel {name:"A"}), (end:YourNodeLabel {name:"E"})
MATCH (start)-[r:NEXT*]->(end)
CREATE (start)-[newrel:NEXT]->(end)
SET newrel.distance = reduce(d=0.0, x IN r | d + x.distance)
但是要小心,考虑到从
开始
结束
可能有多条
路径
,在这种情况下,对于eg,如果您想找到从开始到结束的最短距离,您需要计算总距离并取最小距离:

MATCH (start:YourNodeLabel {name:"A"}), (end:YourNodeLabel {name:"E"})
MATCH p=(start)-[:NEXT*]->(end)
WITH p, start ,end, reduce(d=0.0, x IN rels(p) | d + x.distance) as totalDistance
ORDER BY totalDistance ASC
LIMIT 1
CREATE (start)-[newRel:NEXT]->(end)
SET newRel.distance = totalDistance
如果关系中没有“距离”属性,还可以在“减少”函数中动态计算地理距离:

MATCH (start:YourNodeLabel {name:"A"}), (end:YourNodeLabel {name:"E"})
MATCH p=(start)-[:NEXT*]->(end)
WITH p, start, end, 
reduce(d=0.0, x IN range(1, size(nodes(p))-1) | d + distance(point(nodes(p)[x-1]), point(nodes(p)[x])) / 1000) as distance
ORDER BY distance ASC
LIMIT 1
CREATE (start)-[newRel:NEXT]->(end)
SET newRel.distance = distance

作为一般建议,我不会对用作快捷方式的关系使用相同的关系类型名称,可能
CONNECT\u TO
REACH\u POINT
更适合,以免在其他查询中干扰
下一个
关系。

太棒了,这非常有用。非常感谢!附带问题:如果我有一些奇怪的指标,比如说,时空坐标,你将如何实现你的距离计算?作为一个存储过程?我很高兴Neo4j 3.x对地理距离有原生支持,但你永远不知道…是的,如果你能用一点java,我会用过程