1

我导入了具有重复“相关术语”关系的同义词库,因此当 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
4

4 回答 4

2

在 Cypher 中,每个路径中的关系都是唯一的,因此除非您将查询分成两个单独的匹配项,r1并且r2永远不会绑定相同的关系。

MATCH (t0)-[r:RT]->(t1)-[:RT]->(t0)
DELETE r

此外,您的模式中声明的关系相对于 具有不同的方向(t0),因此它们也不能因此绑定相同的关系。如果您分解查询,您可以看到这一点。

MATCH (t0)-[r1:RT]->(t1), (t0)<-[r2:RT]-(t1)

附录
正如您在评论中指出的那样,这样的模式最终会删除这两种关系。这是偶然的——每个单独的匹配都会像上面那样运行,并且只有一个关系被删除。查询作为一个整体删除这两个关系的原因是模式是对称的,即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

但是对于全局查询,如果您想一次完成所有操作,比较 id on t0andt1非常好。这正是您已经得出的答案。

于 2014-02-26T19:16:07.710 回答
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)

或相反。希望这可以帮助。

于 2016-01-11T10:13:29.957 回答
0

我认为不需要 where 子句。

match (t0)-[r0:RT]->(t1)-[r1:RT]->(t0)
delete r0
于 2014-02-26T05:35:55.333 回答
0

我通常使用这样的东西:

match (t0)-[r:RT]-(t1)
with t0,t1, collect(r) as rels
forach (r in tail(rels) | delete r)
于 2014-02-28T01:11:10.170 回答