是否可以通过时间限制来限制密码查询结果?

时间:2019-01-22 11:57:47

标签: neo4j cypher gremlin

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

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

1 个答案:

答案 0 :(得分:1)

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

该过程的第一个参数必须是Cypher查询,当查询返回0NULLFALSE时,该查询将停止该过程。该查询有权访问包含查询返回的先前值的$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