- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有 1.3 亿个带有标签 Snp
的节点。我想将所有节点的属性 position
从 string
转换为 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/
我有 1.3 亿个带有标签 Snp 的节点。我想将所有节点的属性 position 从 string 转换为 int。我正在使用带有 apoc 版本 3.0.4.1 的 neo4j 3.0.4。 由于
我是一名优秀的程序员,十分优秀!