Neo4j 使用提交将更新操作拆分为块

Neo4j 使用提交将更新操作拆分为块,neo4j,cypher,Neo4j,Cypher,我正在对返回的列表运行一个进程,如下所示 MATCH p=(Item{name:'x'})-[r:RELATED_TO]->(w:item) where r.relatedness > 0.25 [PERFORM CALCS AND UPDATE w] 初始的MATCH只返回大约100个节点,但执行计算步骤是一个n^2操作,其中n相当大。每个[执行…]步骤都可以独立执行。整个过程可能需要一天的时间 我想将其分解,以便它在每个[执行…]步骤后提交。这样,在发生故障时,我可以从中断的

我正在对返回的列表运行一个进程,如下所示

MATCH p=(Item{name:'x'})-[r:RELATED_TO]->(w:item) 
where r.relatedness > 0.25
[PERFORM CALCS AND UPDATE w]
初始的
MATCH
只返回大约100个节点,但执行计算步骤是一个n^2操作,其中n相当大。每个
[执行…]
步骤都可以独立执行。整个过程可能需要一天的时间

我想将其分解,以便它在每个
[执行…]
步骤后提交。这样,在发生故障时,我可以从中断的地方启动

在SQL server中,我可能会将初始
匹配的结果存储到一个表中,并使用
光标对其进行操作,同时标记已完成的行

如何在Neo4J中执行类似操作

作为一个概念:

1) 保存第一次查询的结果:

WITH 'x' as itemName
MERGE (T:SavedQueryResult {name: itemName})
WITH itemName, T
MATCH (:item {name: itemName})-[r:RELATED_TO]->(w:item) WHERE r.relatedness > 0.25
MERGE (I:SavedID {id: ID(w), processed: false})
MERGE (T)-[:hasResult]->(I)
2) 并执行一系列查询:

WITH 'x' as itemName
MATCH (T:SavedQueryResult {name: itemName})-[:hasResult]->(I:SavedID {processed: false})
MATCH (w:item) WHERE ID(w) = I.id
[PERFORM CALCS AND UPDATE w]
SET I.processed = true

3) 要处理保存的结果,您可以使用。

中的。非常感谢。我想试试这个。从“作为一个概念”开始,是否意味着你认为这不是做我想做的事情的最佳方式?(或者我读的是一个不存在的潜台词)@DanBennett
概念
意味着就你的案例而言,解决方案可以是这样的。在我的项目中,我以同样的方式解决类似的问题。请注意,对于批处理操作,我们建议使用
apoc.periodic.iterate()
而不是
apoc.periodic.commit()
。它们可能类似,但是
apoc.periodic.iterate()
往往更有效,并且隐式地处理批处理(尽管您可以根据需要更改批处理大小)。使用
apoc.periodic.commit()
,您需要在查询中显式执行限制,并确保返回更新计数,否则您可能会编写一个可能挂起的错误查询。