添加新节点和关系的 neo4j 性能
neo4j performance of adding new nodes and relations
我的 neo4j 图非常简单:它由用户和用户之间的 "Follows" 关系组成。 "login" 属性 上有用户标签的索引。这是图表的片段:
{
"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 应用程序:
- 选择状态 = 1(未处理)的下一个节点
- 获取在步骤 1 中选择的节点的登录。
- 为在步骤 2 中选择登录的用户的关注者请求 Web 服务。
- 通过使用负责节点和关系的唯一性的密码语句、REST API 和密码交易端点添加新的用户节点和 "Follows" 关系,这里是示例查询:
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
}
}
}
目前数据库有 35 万个用户节点和 190 万个关系,添加新节点的速度非常慢。在一台功能强大的机器(8 核 CPU、14 GB RAM)上添加单个关注者和对应关系大约需要 8 秒,它不会做任何其他事情——它是托管在 Azure 上的 Ubuntu 服务器专门针对 Neo4 DB。
我想知道我可以做些什么来提高添加新节点的性能吗?调整查询?调整 Neo4j 配置?使用核心 Java API?还有别的吗?谢谢!
语句最多需要几毫秒。
你对 :User(login)
有限制吗?
create constraint on (u:User) assert u.login is unique
您使用 2.3.1 吗?
请同时报告。
如果您出于任何原因无法升级到 2.3.1,请告诉我。
你能不能试着把你的陈述改成这样:
MATCH (me:User {login : {login} })
UNWIND {followers} as f
MERGE (u:User { login : f })
MERGE (u)-[:Follows]->(me)
有时 MERGE 在 FOREACH 中没有使用唯一索引。
我的 neo4j 图非常简单:它由用户和用户之间的 "Follows" 关系组成。 "login" 属性 上有用户标签的索引。这是图表的片段:
{
"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 应用程序:
- 选择状态 = 1(未处理)的下一个节点
- 获取在步骤 1 中选择的节点的登录。
- 为在步骤 2 中选择登录的用户的关注者请求 Web 服务。
- 通过使用负责节点和关系的唯一性的密码语句、REST API 和密码交易端点添加新的用户节点和 "Follows" 关系,这里是示例查询:
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
}
}
}
目前数据库有 35 万个用户节点和 190 万个关系,添加新节点的速度非常慢。在一台功能强大的机器(8 核 CPU、14 GB RAM)上添加单个关注者和对应关系大约需要 8 秒,它不会做任何其他事情——它是托管在 Azure 上的 Ubuntu 服务器专门针对 Neo4 DB。
我想知道我可以做些什么来提高添加新节点的性能吗?调整查询?调整 Neo4j 配置?使用核心 Java API?还有别的吗?谢谢!
语句最多需要几毫秒。
你对 :User(login)
有限制吗?
create constraint on (u:User) assert u.login is unique
您使用 2.3.1 吗?
请同时报告。
如果您出于任何原因无法升级到 2.3.1,请告诉我。
你能不能试着把你的陈述改成这样:
MATCH (me:User {login : {login} })
UNWIND {followers} as f
MERGE (u:User { login : f })
MERGE (u)-[:Follows]->(me)
有时 MERGE 在 FOREACH 中没有使用唯一索引。