使用apoc.periodic.iterate保留Person节点最近5个KNOW关系的方案咨询
问题
现有一张结构为(:Person)-[:KNOW]->(:Person)的图,每个Person节点带有经纬度属性(long、lat),且每个节点恰好与10个其他Person存在KNOW关系。需要为每个Person仅保留与最近5个节点的KNOW关系,由于图规模极大,计划用apoc.periodic.iterate处理,但当前代码无法实现删除排名靠后的5个关系。
当前代码:
CALL apoc.periodic.iterate("MATCH (n:Person) RETURN n", "WITH n MATCH (n)-[r:KNOW]->(m:Person) WITH point({longitude: TOFLOAT(n.long), latitude: TOFLOAT(n.lat)}) AS p1, point({longitude: TOFLOAT(m.long), latitude: TOFLOAT(m.lat)}) AS p2, r WITH point.distance(p1, p2) AS Distance, r ORDER BY Distance", {batchSize:10000, parallel:false})
解决方案
修改后的完整Cypher语句如下,核心是对每个Person的关系按距离排序后,跳过前5个最近的,删除剩余的关系:
CALL apoc.periodic.iterate( "MATCH (n:Person) RETURN n", "MATCH (n)-[r:KNOW]->(m:Person) WITH n, r, point.distance( point({longitude: TOFLOAT(n.long), latitude: TOFLOAT(n.lat)}), point({longitude: TOFLOAT(m.long), latitude: TOFLOAT(m.lat)}) ) AS distance ORDER BY distance ASC SKIP 5 DELETE r", {batchSize: 10000, parallel: false} ) YIELD batches, total, errorMessages RETURN batches, total, errorMessages
关键说明
- 按节点关联处理:内层语句保留
n与r的绑定,确保排序和删除操作仅针对当前Person的关系集合 - 距离计算与排序:用
point.distance计算两点 geodesic 距离,按距离升序排列后,前5个即为最近的关系 - 精准删除冗余关系:
SKIP 5跳过需保留的近距关系,后续DELETE r直接移除剩下的5个远距关系 - 性能与冲突控制:
parallel:false避免并发修改同一节点关系引发冲突,batchSize可根据硬件配置调整大小
内容的提问来源于stack exchange,提问作者lenhhoxung
相关产品推荐
相关产品推荐

