使用Cypher删除两个节点之间的重复关系,其中两个节点之间存在多个关系

时间:2017-10-27 17:27:38

标签: neo4j cypher

我想删除两个节点之间的重复关系,Cypher节点之间存在多个关系。 举个例子,给出:

a->r1->b
a->r2->b
a->r2->b
a->r3->b

我期待:

a->r1->b
a->r2->b
a->r3->b

我已经查看了类似的questions,但是他们假设两个节点之间的所有关系是相同的,所以你可以简单地保留一个并删除其余的,这在我的情况下是行不通的。

1 个答案:

答案 0 :(得分:3)

假设您的节点上有标签,这应该有效:

MATCH (a:A)-[r]->(b:B)
WITH a, type(r) as type, collect(r) as rels, b
WHERE size(rels) > 1
UNWIND tail(rels) as rel
DELETE rel

我们按类型(以及开始和结束节点)收集关系和分组,因此如果任何集合大于1,则存在多个具有相同类型的关系。我们将除了第一个关系之外的所有关系重新排列到行中然后删除它们。

如果您没有要用于查询的标签,那么查询将是图表范围的,执行可能需要更长时间,如果要删除的关系集太大而无法执行,则可能会遇到问题一次处理所有。