在neo4j中创建节点之间的关系非常慢

时间:2019-03-21 17:59:45

标签: neo4j cypher

我正在使用python脚本生成并执行从CSV文件中的数据加载的查询。我需要导入大量数据,因此速度非常重要。

我遇到的问题是两个节点之间的合并需要花费很长时间,并且包括在节点之间创建关系的密码会使查询花费大约3秒的时间(对于不花费大约100ms的查询而言)

以下是我要执行的查询的一小部分:

MERGE (s0:Chemical{`name`: "10074-g5"})
SET s0.`name`="10074-g5"
MERGE (y0:Gene{`gene-id`: "4149"})
SET y0.`name`="MAX"
SET y0.`gene-id`="4149"
MERGE (s0)-[:INTERACTS_WITH]->(y0)
MERGE (s1:Chemical{`name`: "10074-g5"})
SET s1.`name`="10074-g5"
MERGE (y1:Gene{`gene-id`: "4149"})
SET y1.`name`="MAX"
SET y1.`gene-id`="4149"
MERGE (s1)-[:INTERACTS_WITH]->(y1)

关于为什么运行如此缓慢的任何建议?我已经在Chemical-> name和Gene-> gene-id上建立了索引,所以老实说我不明白为什么运行如此缓慢。

1 个答案:

答案 0 :(得分:4)

  1. 您的大多数SET子句只是将属性设置为它们已经具有的相同值(由前面的MERGE子句保证)。
  2. 其余的SET子句可能仅在MERGE创建了新节点时才需要执行。因此,可能应该在ON CREATE之前。
  3. 您永远不应生成几乎相同的Cypher代码的长序列。相反,您的Cypher代码应使用parameters,并且应将数据作为参数传递。
  4. 您说您有一个:Gene(id)索引,而您的代码实际上需要一个:Gene(gene-id)索引。

下面是使用dataList参数(包含所需属性值的地图列表)的示例Cypher代码,该代码解决了上述大多数问题。 UNWIND子句只是将列表“展开”为单独的地图。

UNWIND $dataList AS d
MERGE (s:Chemical{name: d.sName})
MERGE (y:Gene{`gene-id`: d.yId})
ON CREATE SET y.name=d.yName
MERGE (s)-[:INTERACTS_WITH]->(y)