当我运行这个查询:
START n1=node(7727), n2=node(7730)
MATCH n1-[r:SKILL]->n2 RETURN r
它给我列出了两个节点之间的重复关系列表。我应该在Cypher查询中添加什么来遍历这些关系,保留一条关系并删除其他重复的关系?
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 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:RELTYPE]-() with type(r) as typ, tail(collect(r)) as coll foreach(x in coll | delete x);
来删除关系?为什么它会删除所有该类型的关系? - Ookermatch (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)
这里有一个很好的方法来查找所有重复的关系并获得一些可见性,以了解它们发生的位置。
MATCH p=(n)-[r1]->(g)<-[r2]-(n)
WHERE type(r1) = type(r2) AND r1 <> r2
RETURN type(r1) as relType, labels(n), labels(g), count(p)
START
子句是不必要的,对吧?它似乎没有使用它也能正常工作。 - Ken Williamstail
返回除第一个元素外的所有元素,我才明白这是如何工作的。谢谢! - fiat