当我运行此查询时:
START n1=node(7727), n2=node(7730)
MATCH n1-[r:SKILL]->n2 RETURN r
它给了我两个节点之间的重复关系列表。我应该在密码查询中添加什么来迭代关系以保持一个关系并删除其余关系?
要对两个已知节点执行此操作:
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)
如果您对从数据库中删除数据的随机查询有信任问题,您可以做我所做的。
首先,您可能要检查所选关系是否真的重复。此查询会将属性 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)