neo4j 我如何用密码删除两个节点之间的重复关系?

2lpgd968  于 2023-03-12  发布在  其他
关注(0)|答案(4)|浏览(235)

运行此查询时:

START n1=node(7727), n2=node(7730)
MATCH n1-[r:SKILL]->n2 RETURN r

它给了我一个在两个节点之间的重复关系的列表。我在密码查询中添加什么来迭代关系以保留一个关系并删除其余的?

ktecyv1j

ktecyv1j1#

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

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)
jvlzgdj9

jvlzgdj92#

在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)
kmb7vmvb

kmb7vmvb3#

如果你对从DB中删除数据的随机查询有信任问题,你可以做我所做的。
首先,您可能需要检查所选关系是否真的是重复的,这个查询将属性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)
lc8prwob

lc8prwob4#

这里有一个很好的方法来查找所有重复关系,并了解它们发生的位置。

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)

相关问题