我在生产中运行相当耗时的密码查询。该查询不需要具有所有匹配的结果,而应在指定的时限内完成。如果存在10000个可能的匹配,则可以选择5000,而不是neo4j事务超时,那会很小。
是否可以在密码查询中指定时间限制,例如在Gremlin timeLimit步骤中?
答案 0 :(得分:1)
您可以使用APOC过程apoc.periodic.rock_n_roll_while来设置时间限制。
该过程的第一个参数必须是Cypher查询,当查询返回0
或NULL
或FALSE
时,该查询将停止该过程。该查询有权访问包含查询返回的先前值的$previous
parameter(如果是第一次调用该查询,则返回NULL
)。查询的返回值必须命名为loop
。
第二个参数必须是返回所有要处理的项目(例如,节点)的Cypher查询,第三个参数必须是对第二个参数返回的每个项目起作用的Cypher查询。第二个参数的Cypher查询返回的命名值(例如,名为foo
)可用于第三个参数的Cypher查询(例如,为$foo
)。
第四个参数是“批量大小”,即在再次要求第一个参数决定是否停止之前,第三个参数应处理的项目数。
在下面的示例查询(针对一个用例)中,我假设$duration
(等待回答的最大最大毫秒数)和$batchSize
(每个大小)批处理)作为参数(传递到外部Cypher查询):
WITH timestamp() + $duration AS endTime
CALL apoc.periodic.rock_n_roll_while(
'RETURN timestamp() < endTime AS loop',
'MATCH (p:Person) RETURN p',
'MATCH (p) WHERE p = $p SET p.lastname = p.name',
$batchSize)
duration
是近似值,因为我们仅检查每批之后是否已达到时间限制。要获得更准确的时间限制,请减小batchSize
。
上述查询的原始版本(没有时间限制)应该是这样的:
MATCH (p:Person)
SET p.lastname = p.name