如何解决删除neo4j中的重复关系-这正确吗?
我开发了一个查询,该查询通过反复试验似乎可以找到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,count(rs) as cnt RETURN cnt
,似乎会返回不必要的关系。
尽管如此,我仍然不愿意将其放置在其他人可以使用的地方。
谢谢
解决方法
首先,让我(严格地)定义一下术语:“重复关系”。如果两个关系重复,则它们是重复的:
- 连接同一对节点(将它们称为
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
Aggregating functions(例如COLLECT
)使用非聚合术语作为grouping keys
,因此查询无需执行单独的冗余DISTINCT a,b
测试。
APOC函数apoc.coll.union返回其2个输入列表的唯一并集。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。