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个已知的节点),并且完整数据库覆盖的答案不再运行(语法改变?)
提前致谢!
您在链接的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)