neo4j - 在 Neo4J 3.5 中创建与节点的 200K 关系需要很多时间吗?
问题描述
我有一个这样的顶点
顶点1
{
name:'hello',
id: '2',
key: '12345',
col1: 'value1',
col2: 'value2',
.......
}
Vertex2,Vertex3,...... Vertex200K
{
name:'hello',
id: '1',
key: '12345',
col1: 'value1',
col2: 'value2',
.......
}
密码查询
MATCH (a:Dense1) where a.id <> "1"
WITH a
MATCH (b:Dense1) where b.id = "1"
WITH a,b
WHERE a.key = b.key
MERGE (a)-[:PARENT_OF]->(b)
最终结果应该是Vertex1应该有200K 的度数,因此应该有 200K 关系。但是,上面的查询花费了很多时间,几乎将吞吐量降低到 500/秒。关于如何更快地创建关系/边缘的任何想法?
当我运行配置文件和上面的密码查询时,它会一直运行并且不会返回,所以我将大小从 200K 减小到 20K,这就是配置文件向我显示的内容。
解决方案
考虑到您的内存限制,以及与您的 MERGE 关系相关的高 db hits,问题很可能是您试图在单个事务中 MERGE 200k 关系。您可能应该使用APOC Procedures中的apoc.periodic.iterate()来批量处理:
CALL apoc.periodic.iterate("
MATCH (a:Dense1)
WHERE a.id <> '1'
MATCH (b:Dense1)
WHERE b.id = '1' AND a.key = b.key
RETURN a, b",
"MERGE (a)-[:PARENT_OF]->(b)",
{}) YIELD batches, total, errorMessages
RETURN batches, total, errorMessages
这应该一次批处理这些合并 10k。
此外,如果您碰巧知道这些关系尚不存在,请使用 CREATE 而不是 MERGE,它会更快。
推荐阅读
- laravel-6 - 一次又一次的图片上传失败
- javascript - nodejs和tampermonkey之间的通信
- ios - 如何解释 Fabric 崩溃和 Xcode 崩溃之间的巨大差异?
- django-rest-framework - 在 Django Rest Framework 中,获取请求用户的所有选定组
- c# - 实体框架核心:将带有列表的对象添加到 DbContext 会导致空列表
- ruby-on-rails - 运行 git push Heroku 时出现问题,Ruby 版本是 2.6.4,但您的 Gemfile 指定了 2.6.3
- go - Beego POST 方法总是寻找模板文件
- amazon-web-services - AWS MSK Cloud Formation 标签问题
- c# - 在c#中使用while循环旁边的类方法
- c# - 如何在实体框架核心中按 id 遍历所有子项?