gpt4 book ai didi

neo4j apoc.periodic.rock_n_roll() 性能

转载 作者:行者123 更新时间:2023-12-04 19:31:13 24 4
gpt4 key购买 nike

我有 1.3 亿个带有标签 Snp 的节点。我想将所有节点的属性 positionstring 转换为 int。我正在使用带有 apoc 版本 3.0.4.1 的 neo4j 3.0.4。

由于节点数量众多,必须分批完成。我为此尝试了 apoc.periodic.rock_n_roll() 程序

CALL apoc.periodic.rock_n_roll(
'MATCH (n:Snp) WITH n RETURN id(n) AS id_n',
'MATCH (n:Snp) where id(n)={id_n} SET n.position = toInt(n.position)',
20000
)

我认为这会批量匹配所有节点,然后为每个批处理调用第二个查询。但它会阻止 neo4j 频繁的 GC 和不断增长的内存使用量。 3 小时后该程序还没有完成。

如果第一个 MATCH 是有限的,它会起作用,以下需要大约 20 秒:

CALL apoc.periodic.rock_n_roll(
'MATCH (n:Snp) WITH n LIMIT 1000000 RETURN id(n) AS id_n',
'MATCH (n:Snp) where id(n)={id_n} SET n.position = toInt(n.position)',
20000
)

但是,我认为这不是程序的重点。我可以以不同的方式使用它来转换大量节点的属性吗?

最佳答案

您传递给 apoc.periodic.rock_n_roll 过程的第一条 Cypher 语句将尝试获取所有 1.3 亿个 Snp 节点。这可能就是您看到内存使用率高且处理速度慢的原因。批处理仅在第二个 Cypher 语句上执行。

apoc.periodic.commit 过程应该更适合您的用例。以下调用将一次获取并转换 100K 个节点,直到它们都被处理完。

CALL apoc.periodic.commit(
'MATCH (n:Snp) WHERE TOINT(n.position) <> n.position WITH n LIMIT {limit} SET n.position = TOINT(n.position) RETURN COUNT(*);',
{limit: 100000}
)

apoc.periodic.commit 过程重复调用其 Cypher 查询,直到它返回 0。MATCH 子句过滤掉已经具有整数 position< 的节点limit 参数指定批量大小。

关于neo4j apoc.periodic.rock_n_roll() 性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39147236/

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