Neo4j 使用apoc.periodic.commit或其他方法批处理大型串行查询

Neo4j 使用apoc.periodic.commit或其他方法批处理大型串行查询,neo4j,neo4j-apoc,Neo4j,Neo4j Apoc,有人建议我使用apoc.periodic.commit来批量处理在neo4j中运行的大型查询。我下面的代码似乎并没有在每一步之后进行批处理和提交。服务器内存不足,我认为如果在每个项目之后提交,就不应该这样做 我正在计算一组节点的jaccard索引(这里我将属性命名为“聚合关系”,因为这是文本中的一组下一个单词关系) 为每个节点计算这是一项相当大的工作。我计算的是53个节点,但总数量大约是60k,这是一个n^2运算。如果我在一个事务中运行它,内存就会耗尽。所以我想分批运行它,在计算完每个索引后提交

有人建议我使用apoc.periodic.commit来批量处理在neo4j中运行的大型查询。我下面的代码似乎并没有在每一步之后进行批处理和提交。服务器内存不足,我认为如果在每个项目之后提交,就不应该这样做

我正在计算一组节点的jaccard索引(这里我将属性命名为“聚合关系”,因为这是文本中的一组下一个单词关系)

为每个节点计算这是一项相当大的工作。我计算的是53个节点,但总数量大约是60k,这是一个n^2运算。如果我在一个事务中运行它,内存就会耗尽。所以我想分批运行它,在计算完每个索引后提交。我已经用属性
toProcess
标记了需要处理的节点,我正在运行下面的代码来计算jaccard索引

1) 我只是用apoc错了吗

2) 是否有更好、更以neo4j为中心的方法来实现这一点。我一直使用SQL

call apoc.periodic.commit("
MATCH (s:Word{toProcess: True})
MATCH (w:Word)-[:NEXT_WORD]->(s)
WITH collect(DISTINCT w.name) as left1, s
MATCH (w:Word)<-[:NEXT_WORD]-(s)
WITH left1, s, collect(DISTINCT w.name) as right1
// Match every other word
MATCH (o:Word) WHERE NOT s = o
WITH left1, right1, s, o
// Get other right, other left1
MATCH (w:Word)-[:NEXT_WORD]->(o)
WITH collect(DISTINCT w.name) as left1_o, s, o, right1, left1
MATCH (w:Word)<-[:NEXT_WORD]-(o)
WITH left1_o, s, o, right1, left1, collect(DISTINCT w.name) as right1_o
// compute right1 union, intersect
WITH FILTER(x IN right1 WHERE x IN right1_o) as r1_intersect,
  (right1 + right1_o) AS r1_union, s, o, right1, left1, right1_o, left1_o
// compute left1 union, intersect
WITH FILTER(x IN left1 WHERE x IN left1_o) as l1_intersect,
  (left1 + left1_o) AS l1_union, r1_intersect, r1_union, s, o
WITH DISTINCT r1_union as r1_union, l1_union as l1_union, r1_intersect, l1_intersect, s, o
WITH 1.0*size(r1_intersect) / size(r1_union) as r1_jaccard,
  1.0*size(l1_intersect) / size(l1_union) as l1_jaccard,
  s, o
WITH s, o, r1_jaccard, l1_jaccard, r1_jaccard + l1_jaccard as sim
MERGE (s)-[r:RELATED_TO]->(o) SET r.paradig = sim
set s.toProcess = false
",{batchSize:1, parallel:false})
调用apoc.periodic.commit(“
匹配(s:Word{toProcess:True})
匹配(w:Word)-[:下一个单词]->(s)
使用collect(不同的w.name)作为left1,s
匹配(w:Word)(o)
使用collect(不同的w.name)作为left1_o,s,o,right1,left1
匹配(w:Word)(o)设置r.paradig=sim
设置s.toProcess=false
“,{batchSize:1,parallel:false})
理由:

batchSize:1
:我希望在设置每个jaccard索引后提交它


parallel:false
:我想要串行操作,这样我就不会耗尽内存了

我使用
apoc.periodic.iterate
而不是
apoc.periodic.commit
,如下所示

我已将此标记为正确答案,因为自询问以来已过了相当长的时间。不过,我不认为没有更好的办法

我发现在neo4j中很难找到这样的批处理更新的最佳实践,而且我自己也不是足够的专家,不知道这是否是最佳实践(甚至是半途而废)

调用apoc.periodic.iterate(“
匹配(s:Word),其中s.toProcess=true
返回s“,
“匹配(w:Word)-[:下一个单词]->(s)
使用collect(不同的w.name)作为left1,s
匹配(w:Word)(o)
使用collect(不同的w.name)作为left1_o,s,o,right1,left1
匹配(w:Word)(o)设置r.paradig=sim
设置s.toProcess=false“,
{batchSize:1})
产量批次、总退货批次、总

这不适用于该主题,我现在无法将其与您的查询进行比较,但这是一个用于计算我使用的jaccard的片段(可能对您有用):)谢谢-看起来比我的更容易理解:)
call apoc.periodic.iterate("

MATCH (s:Word) where s.toProcess=true
return s", 
"MATCH (w:Word)-[:NEXT_WORD]->(s)
WITH collect(DISTINCT w.name) as left1, s
MATCH (w:Word)<-[:NEXT_WORD]-(s)
WITH left1, s, collect(DISTINCT w.name) as right1
// Match every other word
MATCH (o:Word) WHERE NOT s = o
WITH left1, right1, s, o
// Get other right, other left1
MATCH (w:Word)-[:NEXT_WORD]->(o)
WITH collect(DISTINCT w.name) as left1_o, s, o, right1, left1
MATCH (w:Word)<-[:NEXT_WORD]-(o)
WITH left1_o, s, o, right1, left1, collect(DISTINCT w.name) as right1_o
// compute right1 union, intersect
WITH FILTER(x IN right1 WHERE x IN right1_o) as r1_intersect,
  (right1 + right1_o) AS r1_union, s, o, right1, left1, right1_o, left1_o
// compute left1 union, intersect
WITH FILTER(x IN left1 WHERE x IN left1_o) as l1_intersect,
  (left1 + left1_o) AS l1_union, r1_intersect, r1_union, s, o
WITH DISTINCT r1_union as r1_union, l1_union as l1_union, r1_intersect, l1_intersect, s, o
WITH 1.0*size(r1_intersect) / size(r1_union) as r1_jaccard,
  1.0*size(l1_intersect) / size(l1_union) as l1_jaccard,
  s, o
WITH s, o, r1_jaccard, l1_jaccard, r1_jaccard + l1_jaccard as sim
MERGE (s)-[r:RELATED_TO]->(o) SET r.paradig = sim
set s.toProcess = false",
{batchSize:1})
yield batches, total return batches, total