首页 > 解决方案 > 是否有能力按时间限制密码查询结果?

问题描述

我在生产中运行相当耗时的密码查询。查询不需要具有所有匹配的结果,而是应该在指定的时间限制内完成。如果有 10000 个可能的匹配项,则可以使用 5000 个,而不是 Neo4j 事务超时,那是很小的。

是否可以在密码查询中指定时间限制,例如在 Gremlin timeLimit 步骤中?

标签: neo4jcyphergremlin

解决方案


您可以使用 APOC 过程apoc.periodic.rock_n_roll_while来实现时间限制。

该过程的第一个参数必须是一个 Cypher 查询,它将在查询返回时停止该过程0orNULLFALSE。该查询可以访问包含查询返回的先前值的$previous 参数NULL(或者如果这是第一次调用该查询)。查询的返回值必须命名为loop

第二个参数必须是一个 Cypher 查询,它返回所有要处理的项目(例如,节点),第三个参数必须是一个 Cypher 查询,它对第二个参数返回的每个项目都有效。第二个参数的 Cypher 查询返回的命名值(例如, named foo)可用于第三个参数的 Cypher 查询(例如, as $foo)。

第四个参数是“batch size”,在再次询问第一个参数决定是否停止之前,第三个参数应该处理的项目数。

在以下示例查询中(对于虚构的用例),我假设$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

推荐阅读