Neo4j在高事务并发性方面变得相当慢

时间:2017-02-28 11:13:51

标签: neo4j

我使用的是neo4j 3.1.0企业版。我的图中的主要逻辑是:有" IP"节点和"用户"节点和两者都有" UNIQUE"限制。每次用户登录时,我都会添加从IP到User的关系。

这是我的插入Cypher:

MERGE (i:IP {ip:"1.2.3.4"}) 
MERGE (u:User {username:"xxx@gmail.com"}) 
MERGE (i) - [l:SUCC] -> (u) 
SET i:ExpireNode, i.expire={expire} 
SET u:ExpireNode, u.expire={expire}
SET l.expire={expire}, l.login={login}

插入作为开头非常快。但是当节点数量增加到数百万时,它变得非常慢,有时需要超过1秒才能插入节点和关系。

我该如何优化它?我正在使用12核CPU和64G内存运行neo4j。初始磁头大小为16G,页面缓存为30G。

----------------------------------------------- ---------------

在Web UI中测试了相同的cypher,命令花了10ms。但是通过使用java驱动程序,它有时需要超过1秒。以下是我的java代码:

try (Transaction tx = session.beginTransaction()) {
    for (Login login : loginList) {
        Value value = login2Operation(login);
        tx.run(INSERT_COMMANDS_SUCC, value);
    }
    tx.success();
}

----------------------------------------------- ---------------

经过一番探索,我发现如果在5个线程中运行,插入速度会显着增加。但整体速度太慢,我必须增加到100个线程。然后每个速度的单个插入增长到1秒。所以,我认为这个问题是因为Neo4j的并行能力。

在neo4j.conf中,我添加了dbms.threads.worker_count=200。但它没有帮助。有什么想法吗?

1 个答案:

答案 0 :(得分:1)

感谢@InverseFalcon的建议, UNWIND 操作有很多帮助!

Michael Hunger's tips and tricks

中获取更多详情