gpt4 book ai didi

neo4j - Neo4j 中性能缓慢的批量更新关系属性

转载 作者:行者123 更新时间:2023-12-01 03:26:57 24 4
gpt4 key购买 nike

我正在努力有效地批量更新 Neo4j 中的关系属性。目标是更新约 500,000 个关系(每个关系大约有 3 个属性),我将它们分成 1,000 个批处理并在单个 Cypher 语句中处理,

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

但是,每批 1,000 个节点大约需要 60 秒。 :Entity 的 UUID 属性存在索引标签,即我之前运行过,
CREATE INDEX ON :Entity(uuid)

这意味着根据查询计划匹配关系非常有效,

enter image description here

总共有 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)

最佳答案

试试这个查询:

UNWIND {rows} AS row
WITH row.source as source, row.target as target, row
MATCH (s:Entity {uuid:source})
USING INDEX s:Entity(uuid)
WITH * WHERE true
MATCH (t:Entity {uuid:target})
USING INDEX t:Entity(uuid)
MATCH (s)-[r:CONSUMED]->(t)
SET r += row.properties;

它使用 index hints强制对 进行索引查找两个 Entity节点,然后是 Expand(Into) 应该比 Expand(All) 更高效的运算符和 Filter查询计划显示的运算符。

关于neo4j - Neo4j 中性能缓慢的批量更新关系属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40725765/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com