我的neo4j图非常简单:它由用户和他们之间的“关注”关系组成。 “login”属性上有User标签的索引。这是图表的片段:
{
"nodes": [
{
"id": "3216",
"labels": [
"User"
],
"properties": {
"login": "user#111",
"status": 16
}
},
{
"id": "3218",
"labels": [
"User"
],
"properties": {
"login": "user#1983",
"status": 1
}
}
],
"relationships": [
{
"id": "4188",
"type": "Follows",
"startNode": "3216",
"endNode": "3218",
"properties": {}
}
]
}
}
用户节点的状态字段指示是否已处理 - 创建了所有关系。 然后我有node.js应用程序正在执行以下步骤:
function buildQuery(login, followers){
return {
statement : 'MATCH (me:User {login : {login} }) FOREACH (f IN {followers} | MERGE (u:User { login : f }) MERGE u-[:Follows]->me),
parameters : {
login : login,
followers : followers
}
}
}
目前,DB拥有350K用户节点和1.9M关系,并且添加新关系 TERRIBLY 慢。在一台功能非常强大的机器(8核CPU,14 GB RAM)上添加单个跟随器和相应的关系大约需要8秒钟才能完成其他操作 - 它是专门为Neo4 DB托管在Azure上的Ubuntu服务器。
我想知道为了提高添加新节点的性能,我还能做些什么吗?调整查询?调整Neo4j配置?使用Core Java API?别的什么?谢谢!
答案 0 :(得分:1)
该陈述最多应该花费几毫秒。
您对:User(login)
有限制吗?
create constraint on (u:User) assert u.login is unique
你使用2.3.1吗?
请两者并报告回来。
如果因任何原因无法升级到2.3.1,请告诉我。
答案 1 :(得分:0)
你能否尝试将你的陈述改为:
MATCH (me:User {login : {login} })
UNWIND {followers} as f
MERGE (u:User { login : f })
MERGE (u)-[:Follows]->(me)
有时FOREACH中的MERGE并没有使用唯一索引。