我开发了一个查询,通过尝试和错误,它似乎在Neo4j DB中找到了所有重复的关系。我想删除所有这些关系,但我担心我没有想到可能导致数据删除的有问题的情况。
那么,这个查询是否删除除一个重复关系之外的所有其他关系?
MATCH (a)-->(b)<--(a) # identify where the duplication is present
WITH DISTINCT a, b
MATCH (a)-[r]->(b) # get all duplicated paths themselves
WITH a, b, collect(r)[1..] as rs # remove the first instance from the list
UNWIND rs as r
DELETE r如果我用UNWIND rs as r; DELETE r替换WITH a, b, count(rs) as cnt RETURN cnt,它似乎会返回不必要的关系。
不过,我还是不情愿地把这个放在别人用的地方.
谢谢
发布于 2020-11-06 19:50:13
首先,让我(严格地)定义这个术语:“重复关系”。两个关系是重复的,如果它们:
a和b)a和b之间具有相同的方向性(对于用例而言,当且仅当方向性是重要的)您的查询只考虑#1和#4,因此通常也可以删除不重复的关系。
下面是一个考虑到上述所有内容的查询(假设#4应该包括在内):
MATCH (a)-[r1]->(b)<-[r2]-(a)
WHERE TYPE(r1) = TYPE(r2) AND PROPERTIES(r1) = PROPERTIES(r2)
WITH a, b, apoc.coll.union(COLLECT(r1), COLLECT(r2))[1..] AS rs
UNWIND rs as r
DELETE r聚合函数 (与COLLECT一样)使用非聚合术语作为grouping keys,因此查询不需要执行单独的冗余DISTINCT a,b测试。
APOC函数apoc.coll.union返回它的两个输入列表的不同的合并。
https://stackoverflow.com/questions/64720139
复制相似问题