我有一个结构为(: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})
你能提出一个解决办法吗?
1条答案
按热度按时间2guxujil1#
在按距离排序(ORDER BY)之后,可以收集关系,然后得到列表中第6个到最后一个项目,然后可以删除距离n最远的节点。
我在排序中添加了n,因为batch_size是10000,所以每批有10k n个人。这个符号collect(r)[5..]意味着将所有关系放在一个列表中,然后给予我第6项、第7项,直到最大项。如果愿意,也可以在最后一条语句中使用UNWIND()代替FOREACH()。
在删除关系之前,我建议您先备份数据库,以便在需要时还原数据。