gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-30 00:40:47 33 4
gpt4 key购买 nike

我有一个包含大量节点(超过 1000 万)的庞大数据库。整个数据库中只有一种关系。但是,有大量节点之间存在重复关系。我目前拥有的是这个密码脚本,它可以找到所有具有重复项的对,然后是一个运行并清理每个对的 python 脚本(在这些节点之间只留下一个唯一的关系)。

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

这对于小型数据库来说效果很好,但是当我在大型数据库上运行它时,它最终会崩溃,出现堆内存不足的异常(越来越多地增加盒子并没有帮助)。

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

附言我在 ubuntu(12 多岁)AWS 机器上运行 neo4j 2.0.1。

附言我意识到有这个答案:stackoverflow ,但是他要问的是更具体的问题(针对 2 个已知节点),并且包含完整数据库的答案不再运行(语法更改?)

提前致谢!

最佳答案

链接的 SO 问题中的 db 全局查询出现什么错误?尝试用 | 替换 : 中的 FOREACH,这是我能看到的唯一重大语法差异。 2.x 的表达方式可能是

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

我认为 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)

因为这个查询根本不涉及属性(与你的查询相反,它返回 (a) 和 (b) 的属性)我认为对于像你这样的中型图来说它不应该占用大量内存,但是您将不得不尝试限制。

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

MATCH (a:A)-[r]->(b) //etc..
MATCH (a:B)-[r]->(b) //etc..

关于python - Neo4j:如何通过密码删除数据库中的所有重复关系?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22995557/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com