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

med*_*dia 2 neo4j cypher

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

a->r1->b
a->r2->b
a->r2->b
a->r3->b
Run Code Online (Sandbox Code Playgroud)

我预计:

a->r1->b
a->r2->b
a->r3->b
Run Code Online (Sandbox Code Playgroud)

我已经研究过类似的问题,但他们假设两个节点之间的所有关系都是相同的,因此您可以简单地保留一个并删除其余的,这在我的情况下不起作用。

Inv*_*con 5

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

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
Run Code Online (Sandbox Code Playgroud)

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

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