如何使用密码删除两个节点之间的重复关系?

Posted

技术标签:

【中文标题】如何使用密码删除两个节点之间的重复关系?【英文标题】:how do I delete duplicate relationships between two nodes with cypher? 【发布时间】:2013-08-14 15:53:33 【问题描述】:

当我运行这个查询时:

START n1=node(7727), n2=node(7730)
MATCH n1-[r:SKILL]->n2 RETURN r

它为我提供了两个节点之间的重复关系列表。我应该在密码查询中添加什么来迭代关系以保留一个关系并删除其余关系?

【问题讨论】:

【参考方案1】:

对两个已知节点执行此操作:

start n=node(1), m=node(2) match (n)-[r]->(m) 
with n,m,type(r) as t, tail(collect(r)) as coll 
foreach(x in coll | delete x)

为所有关系全局执行此操作(请注意,此操作可能非常昂贵,具体取决于您的图表的大小):

start r=relationship(*) 
match (s)-[r]->(e)
with s,e,type(r) as typ, tail(collect(r)) as coll 
foreach(x in coll | delete x)

【讨论】:

在最近的 neo4j 版本中,我认为 START 子句是不必要的,对吧?没有它似乎也一样。 直到我意识到tail 返回除第一个元素之外的所有元素之前,我才明白它是如何工作的。谢谢! 我想知道您在哪里找到了您使用的“关系”功能?我在任何地方的文档中都没有看到它,只有“关系”。它是一个较旧的功能吗? 这个很久以前就被删除了。现在,您只需省略第一行,并以 match 开头。【参考方案2】:

使用 Neo4J 4.x 并全局删除重复关系,您需要改用以下内容。语法略有变化,其他回复中提到的start 前缀不再有效。

match ()-[r]->() 
match (s)-[r]->(e) 
with s,e,type(r) as typ, tail(collect(r)) as coll 
foreach(x in coll | delete x)

【讨论】:

注意,为什么是第一行? (我认为不需要) match ()-[r]->() 为什么match ()-[r:RELTYPE]-() with type(r) as typ, tail(collect(r)) as coll foreach(x in coll | delete x); 不工作呢?为什么会删除该类型的所有关系?【参考方案3】:

如果您对从数据库中删除数据的随机查询有信任问题,您可以按照我的做法进行操作。

首先,您可能想要检查所选关系是否真的重复。此查询会将属性 willBeDeleted 设置为 true,因此您可以检查是否真的要删除它们。

match (a)-[r]->(b) 
with a,b,type(r) as typ, tail(collect(r)) as coll 
foreach(x in coll | set x.willBeDeleted=true)

现在您可以检查哪些关系将被实际删除。

match(a)-[r]-(b)
where r.willBeDeleted=true
return a, b, r

如果您认为正确的关系将被删除,那么您可以执行此查询以删除重复项。

match (a)-[r]->(b) 
with a,b,type(r) as typ, tail(collect(r)) as coll 
foreach(x in coll | delete x)

【讨论】:

以上是关于如何使用密码删除两个节点之间的重复关系?的主要内容,如果未能解决你的问题,请参考以下文章

使用密码删除neo4j中的所有节点和关系超出堆空间

DOM结构 —— 两个节点之间可能存在哪些关系以及如何在节点之间任意移动

如何删除两个日期之间的星期六和星期日并计算总天数[重复]

DOM结构——两个节点之间可能存在哪些关系以及如何在节点之间任意移动

当两个div元素显示为内联块时如何删除它们之间的空白[重复]

模式重复时如何删除两个模式之间的线(删除包括模式)