neo4j - 是否有能力按时间限制密码查询结果?
问题描述
我在生产中运行相当耗时的密码查询。查询不需要具有所有匹配的结果,而是应该在指定的时间限制内完成。如果有 10000 个可能的匹配项,则可以使用 5000 个,而不是 Neo4j 事务超时,那是很小的。
是否可以在密码查询中指定时间限制,例如在 Gremlin timeLimit 步骤中?
解决方案
您可以使用 APOC 过程apoc.periodic.rock_n_roll_while来实现时间限制。
该过程的第一个参数必须是一个 Cypher 查询,它将在查询返回时停止该过程0
orNULL
或FALSE
。该查询可以访问包含查询返回的先前值的$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
推荐阅读
- laravel - 如何从最后 5 行中获取随机行?
- r - 将可编辑的闪亮数据表写入 .csv 文件
- javascript - 我可以使用 Plotly 的自定义按钮来更新多面图中的“shared_yaxes”吗?
- amazon-web-services - 通过 https 提供 S3 资源
- scala - 有人可以解释下面的代码片段中发生了什么吗?我试图理解下面的 Scala 代码
- javascript - AceEditor 实例初始化后运行代码
- xml - 当使用 XPath 从 XML 中知道字段值时如何提取属性名称
- c# - 在使用 websockets 时,我可以在发送查询字符串时传入标头吗?
- c# - 在 Xamarin 中使用 MassTransit
- python - 找出列表中三个单词在给定文档中共同出现的频率