我正在使用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上建立了索引,所以老实说我不明白为什么运行如此缓慢。
答案 0 :(得分:4)
SET
子句只是将属性设置为它们已经具有的相同值(由前面的MERGE
子句保证)。SET
子句可能仅在MERGE
创建了新节点时才需要执行。因此,可能应该在ON CREATE
之前。: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)