我导入了一个带有重复“相关术语”关系的词库,所以当A和B相关时,我的图包含(A) - [:RT] - >(B)以及(B) - [:RT] - >(A)
要清理它,因为Neo4j允许我在两个方向上遍历图形,我做了
match (t0)-[r0:RT]->(t1)-[r1:RT]->(t2)
where t0=t2 AND id(r0) > id(r1)
delete r0
这是最快的方式吗?答:不,因为它可以简化。
编辑成
match (t0)-[r0:RT]->(t1)-[r1:RT]->(t0)
where id(r0)>id(r1)
delete r0
答案 0 :(得分:2)
在Cypher中,关系在每个路径中都是唯一的,因此除非您将查询分解为两个单独的匹配,否则r1
和r2
将永远不会绑定相同的关系。
MATCH (t0)-[r:RT]->(t1)-[:RT]->(t0)
DELETE r
此外,您的模式中声明的关系与(t0)
有不同的方向,因此它们也不能为此绑定相同的关系。如果你打破查询,你可以看到这个。
MATCH (t0)-[r1:RT]->(t1), (t0)<-[r2:RT]-(t1)
<强>附录强>
正如您在评论中指出的那样,这样的模式最终会删除这两种关系。这是偶然的 - 每个单独的匹配将如上所述并且仅删除一个关系。整个查询删除两个关系的原因是模式是对称的,即当且仅当它满足指定地点{{1}的模式时,节点将满足指定地点t0
的模式。 },或(半正式的)
t1
也许我应该说(t0)-[:RT]->(t1)-[:RT]->(t0) iff (t1)-[:RT]->(t0)-[:RT]->(t1)
和r1
永远不能同时绑定相同的关系,或者在同一个匹配或路径中。解决方案是打破对称性。我想象一个具有区别性的本地查询
r2
但是对于全局查询,如果您想一次性完成所有操作,那么比较(t0 {name:"t0"})-[r:RT]->(t1)-[:RT]->(t0)
DELETE r
和t0
上的ID就很棒了。这正是你已经得到的答案。
答案 1 :(得分:1)
我使用这样的东西:
match (s:Node)-[r]-(n:Node)
with s,n,type(r) as t, tail(collect(r)) as coll
foreach(x in coll | delete x)
无论边缘的方向如何,它都会消除重复和相互关系;但是,如果要指定方向,还可以尝试:
match (s:Node)-[r]->(n:Node)
with s,n,type(r) as t, tail(collect(r)) as coll
foreach(x in coll | delete x)
或者相反。 希望这会有所帮助。
答案 2 :(得分:0)
我认为不需要where子句。
match (t0)-[r0:RT]->(t1)-[r1:RT]->(t0)
delete r0
答案 3 :(得分:0)
我通常使用这样的东西:
match (t0)-[r:RT]-(t1)
with t0,t1, collect(r) as rels
forach (r in tail(rels) | delete r)