Neo4j:如何通过cypher删除数据库中的所有重复关系?

Dia*_*par 6 python database neo4j

我有一个庞大的数据库,有大量节点(10mil +).整个数据库中只有一种关系.但是,有大量节点在它们之间存在重复关系.我目前所拥有的是这个cypher脚本,它找到所有带有重复项的对,然后是一个运行并清理每个对的python脚本(在这些节点之间只留下一个唯一的关系).

match (a)-[r]->(b) with a,b, count(*) as c where c>1 return a.pageid, b.pageid, c LIMIT 100000;

这对于一个小型数据库来说效果相当不错,但是当我在一个大型数据库上运行它时,它最终会因为堆上的内存耗尽而异常爆炸(越来越多的盒子没有帮助).

所以,问题是2倍:1)是否有任何类型的索引我可以建立关系(现在没有),这将有助于加快这一点?2)是否存在能够(以快速方式......或至少可靠地)删除数据库中所有重复关系的密码查询,为每个节点对(已经存在它们之间的关系)留下一个唯一的关系?

PS我在ubuntu(12something)AWS盒子上运行neo4j 2.0.1.

PPS我意识到有这样的答案:stackoverflow,然而他所要求的是更具体的东西(针对2个已知的节点),并且完整数据库覆盖的答案不再运行(语法改变?)

提前致谢!

jja*_*erg 8

您在链接的SO问题中使用db全局查询会出现什么错误?尝试替换|:FOREACH,这是唯一的破语法的区别,我可以看到.2.x方式说同样的事情,除了适应你在db中只有一种关系类型,可能是

MATCH (a)-[r]->(b)
WITH a, b, TAIL (COLLECT (r)) as rr
FOREACH (r IN rr | DELETE r)
Run Code Online (Sandbox Code Playgroud)

我认为WITH管道将在没有重复的情况下携带空尾,我不知道循环一个空集合是多么昂贵 - 我的感觉是引入限制的地方是在之后的过滤器WITH,某事喜欢

MATCH (a)-[r]->(b)
WITH a, b, TAIL (COLLECT (r)) as rr
WHERE length(rr) > 0 LIMIT 100000
FOREACH (r IN rr | DELETE r)
Run Code Online (Sandbox Code Playgroud)

由于这个查询根本没有触及属性(与你的相反,它返回(a)和(b)的属性)我不认为对于像你这样的中等图形来说它应该是非常重的内存,但你会有试验极限.

如果内存仍然存在问题,那么如果有任何方法可以限制节点使用(不涉及属性),那也是个好主意.如果您的节点可通过标签区分,请尝试同时运行一个标签的查询

MATCH (a:A)-[r]->(b) //etc..
MATCH (a:B)-[r]->(b) //etc..
Run Code Online (Sandbox Code Playgroud)

  • 有效!!!!之前的努力将持续数小时,并最终以一堆"内存不足"异常爆炸.这件事在2.5分钟内完成!! (2认同)