neo4j 保持与最近邻域的关系

ua4mk5z4  于 2023-02-04  发布在  其他
关注(0)|答案(1)|浏览(133)

我有一个结构为(:Person)-[:KNOW]->(:Person)的图。现在Person节点有一个纬度和经度。一个Person连接到其他10个Person。对于每个Person,我只想保持与5个最近Person的关系。由于图非常大,我考虑使用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})

你能提出一个解决办法吗?

2guxujil

2guxujil1#

在按距离排序(ORDER BY)之后,可以收集关系,然后得到列表中第6个到最后一个项目,然后可以删除距离n最远的节点。

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, n 
WITH point.distance(p1, p2) AS Distance, n, r ORDER BY n, Distance
WITH n, collect(r)[5..] as farthest_dist 
FOREACH (farthest_r in farthest_dist|DELETE farthest_r)", 
{batchSize:10000, parallel:false})

我在排序中添加了n,因为batch_size是10000,所以每批有10k n个人。这个符号collect(r)[5..]意味着将所有关系放在一个列表中,然后给予我第6项、第7项,直到最大项。如果愿意,也可以在最后一条语句中使用UNWIND()代替FOREACH()。

UNWIND farthest_dist as farthest_r 
DELETE farthest_r

在删除关系之前,我建议您先备份数据库,以便在需要时还原数据。

相关问题