我在努力高效地批量更新Neo4j中的关系属性。目的是更新〜500000的关系(每个具有大约3个属性),其余块成在单一的Cypher语句1000和处理批次,Neo4j中缓慢的性能批量更新关系属性
UNWIND {rows} AS row
MATCH (s:Entity) WHERE s.uuid = row.source
MATCH (t:Entity) WHERE t.uuid = row.target
MATCH (s)-[r:CONSUMED]->(t)
SET r += row.properties
然而1000个节点的每个批次需要大约60秒。存在的:Entity
标签上UUID性的指标,即我先前曾执行过,
CREATE INDEX ON :Entity(uuid)
这意味着匹配关系是每个查询计划的超高效,
有总共有6个数据库命中,查询在〜150毫秒内执行。我还添加上确保了每场比赛只返回一个元素的UUID属性唯一性约束,
CREATE CONSTRAINT ON (n:Entity) ASSERT n.uuid IS UNIQUE
有谁知道我可以继续调试明白为什么它采取的Neo4j这么长时间来处理的关系?
请注意,我正在使用类似的逻辑来更新节点,它的速度要快几个数量级,并且有更多的元数据与它们相关联。
仅供参考我正在使用Neo4j 3.0.3,py2neo和Bolt。的Python代码块的形式为,
for chunk in chunker(relationships): # 1,000 relationships per chunk
with graph.begin() as tx:
statement = """
UNWIND {rows} AS row
MATCH (s:Entity) WHERE s.uuid = row.source
MATCH (t:Entity) WHERE t.uuid = row.target
MATCH (s)-[r:CONSUMED]->(t)
SET r += row.properties
"""
rows = []
for rel in chunk:
rows.append({
'properties': dict(rel),
'source': rel.start_node()['uuid'],
'target': rel.end_node()['uuid'],
})
tx.run(statement, rows=rows)