我使用的是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
。但它没有帮助。有什么想法吗?