首页 > 解决方案 > 在 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,这就是配置文件向我显示的内容。

在此处输入图像描述

标签: neo4j

解决方案


考虑到您的内存限制,以及与您的 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,它会更快。


推荐阅读