如何加速Neo4J中大节点的创建/更新?

时间:2015-06-03 08:57:34

标签: neo4j cypher

我尝试创建(或者如果节点已经存在则不执行任何操作)1000多个节点,这些节点在我将每个节点存储为属性的数据量方面非常大。每个节点的属性如下:

props: {
      'HPSI0713i-aehn_2_QC1Hip-839.HPSI0813i-ffdb_3_QC1Hip-1.1': ['19','26','1.00','QC1Hip-839'],
      [... 1431 more like this ...]
}

如果我将数据存储在文本文件中,则占用大约650K。

如果我创建一个节点(使用MERGE和一个约束的唯一属性,如果它已经存在则不执行任何操作),并且每个节点需要20-40秒。

要调试我将节点创建分开设置属性,首先创建节点,返回节点ID,然后将该id与设置属性匹配。节点创建速度与预期一样快。这是我设置属性的调试:

will run cypher: MATCH (n) WHERE id(n) = 198058 SET n = { props } return n
- setting 1432 new properties to node with unique property 88aa3f215e73daea9bf65147e630cbd7_QC1Hip-1 took 19 seconds
will run cypher: MATCH (n) WHERE id(n) = 198059 SET n = { props } return n
- setting 1432 new properties to node with unique property 88aa3f215e73daea9bf65147e630cbd7_QC1Hip-10 took 22 seconds

我在调试过程中注意到的一件奇怪的事情是我是否删除了这些节点:

MATCH (n:`labelforthesenodes`) OPTIONAL MATCH (n)-[r]-() DELETE n, r

如果我再次尝试添加它们对于我以前完成的节点来说速度很快,那么对于节点我来说再慢一点:

will run cypher: MATCH (n) WHERE id(n) = 198063 SET n = { props } return n
- setting 1432 new properties to node with unique property 88aa3f215e73daea9bf65147e630cbd7_QC1Hip-1 took 0 seconds
will run cypher: MATCH (n) WHERE id(n) = 198064 SET n = { props } return n
- setting 1432 new properties to node with unique property 88aa3f215e73daea9bf65147e630cbd7_QC1Hip-10 took 1 seconds
will run cypher: MATCH (n) WHERE id(n) = 198068 SET n = { props } return n
- setting 1432 new properties to node with unique property 88aa3f215e73daea9bf65147e630cbd7_QC1Hip-1016 took 24 seconds

如何加快此操作?目前我有一个简单的循环,每次都在一个节点上创建/设置属性,因此创建我的1000个节点需要至少6小时。

2 个答案:

答案 0 :(得分:0)

当您处理相当大的数据集时,我建议您应该查看Batch insertion,而不是一次创建单个节点。

在更新的情况下,您可以维护节点字典,而不是每隔一段时间更新数据库,因为创建/更新节点到数据库所花费的时间比修改字典要多得多。当所有与节点相关的修改都结束后,您最终可以发送整个字典进行批量插入

答案 1 :(得分:0)

我解决了性能问题,而不是使用值数组的值设置1000多个属性,设置单个属性,将整个数据结构的值转换为JSON字符串。

现在创建/更新我的节点需要大约0秒,而不是20 +。

显然,Neo4J中存在一些性能瓶颈,涉及向节点添加大量(未编入索引)属性。