首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >删除neo4j中的重复关系-这是正确的吗?

删除neo4j中的重复关系-这是正确的吗?
EN

Stack Overflow用户
提问于 2020-11-06 18:51:07
回答 1查看 320关注 0票数 0

我开发了一个查询,通过尝试和错误,它似乎在Neo4j DB中找到了所有重复的关系。我想删除所有这些关系,但我担心我没有想到可能导致数据删除的有问题的情况。

那么,这个查询是否删除除一个重复关系之外的所有其他关系?

代码语言:javascript
运行
复制
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,它似乎会返回不必要的关系。

不过,我还是不情愿地把这个放在别人用的地方.

谢谢

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-11-06 19:50:13

首先,让我(严格地)定义这个术语:“重复关系”。两个关系是重复的,如果它们:

  1. 连接同一对节点(称为ab)
  2. 有相同的关系类型
  3. 拥有完全相同的属性集(名称和值)
  4. ab之间具有相同的方向性(对于用例而言,当且仅当方向性是重要的)

您的查询只考虑#1和#4,因此通常也可以删除不重复的关系。

下面是一个考虑到上述所有内容的查询(假设#4应该包括在内):

代码语言:javascript
运行
复制
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返回它的两个输入列表的不同的合并。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64720139

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档