消除Neo4j中互惠关系的最快方法?

时间:2014-02-26 00:53:07

标签: neo4j cypher cyclic-reference

我导入了一个带有重复“相关术语”关系的词库,所以当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 个答案:

答案 0 :(得分:2)

在Cypher中,关系在每个路径中都是唯一的,因此除非您将查询分解为两个单独的匹配,否则r1r2将永远不会绑定相同的关系。

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)