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

pri*_*iri 17 neo4j cypher

当我运行此查询时:

START n1=node(7727), n2=node(7730)
MATCH n1-[r:SKILL]->n2 RETURN r
Run Code Online (Sandbox Code Playgroud)

它给出了我在两个节点之间的重复关系列表.我将如何添加到cypher查询以迭代关系以保持一个关系并删除其余关系?

Ste*_*ter 35

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

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

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

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

  • 我不明白这是如何工作的,直到我意识到“tail”返回除第一个元素之外的所有元素。谢谢! (3认同)
  • 在 neo4j 的最新版本中,我认为“START”子句是不必要的,对吗?没有它似乎也能工作。 (2认同)
  • 这个很久以前就被删除了。如今,您只需省略第一行并以“match”开始语句即可。 (2认同)

小智 7

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