为什么ArangoDB(使用Python-Arango)返回错误1600 ERROR_CURSOR_NOT_FOUND?

huwehgph  于 2022-12-09  发布在  Go
关注(0)|答案(2)|浏览(276)

问题是

我迭代整个顶点集合,例如journals,并使用它创建从person到给定journal的边author
我使用python-arango,代码如下所示:

for journal in journals.all():
    create_author_edge(journal)

我有一个相对较小的数据集,并且journals-集合只有大约1300个文档。但是:这是 * 大于1000*,这是Web界面中的批处理大小-但我不知道这是否相关。
问题是它会引发CursorNextError,并从数据库返回HTTP 404ERR 1600,这就是ERROR_CURSOR_NOT_FOUND错误:
当通过游标的ID请求游标但找不到具有该ID的游标时,将引发。

深入了解原因

对于ArangoDB Cursor Timeoutthis issue,我怀疑这是因为游标的TTL在数据库中已经过期,在python堆栈跟踪中可以看到类似以下的内容:

# Part of the stacktrace in the error:
(...)
if not cursor.has_more():
    raise StopIteration
cursor.fetch()  <---- error raised here
(...)

如果我快速迭代整个集合,也就是说,如果我执行print(len(journals.all()),它会无错误地输出“1361”。
当我用AQL替换journals.all(),并增加TTL参数时,它可以正常工作,没有错误:

for journal in db.aql.execute("FOR j IN journals RETURN j", ttl=3600):
    create_author_edge(journal)

但是,如果没有ttl-参数,AQL方法会产生与使用journals.all()相同的错误。

更多信息

最后一条信息是,当出现错误时,我正在我的个人笔记本电脑上运行此程序。在我的工作计算机上,使用相同的代码创建图表并使用相同的数据填充图表,但没有出现错误。因为我在度假,所以无法访问我的工作计算机来比较版本。但这两个系统都是在夏季安装的,所以版本很可能是相同的。

问题

我不知道这是python-arango的问题还是ArangoDB的问题。我相信,因为TTL增加时没有问题,所以这可能表明ArangodDB有问题,而不是Python驱动程序,但我不知道。
(我已经添加了一个特性请求,要求将ttl-param添加到.all()-方法here中。)
你对为什么会发生这种情况有什么见解吗?

  • 我没有代表来创建标签“python-arango”,所以如果有人能创建它并标记我的问题,那就太好了。*
pbgvytdp

pbgvytdp1#

在服务器内部,简单查询将被转换为all()。正如参考的github问题所讨论的,简单查询不支持TTL参数,也不会获得它们。
这里首选的解决方案是在客户端上使用AQL-Query,以便您可以指定TTL参数。
一般来说,您应该避免一次从数据库中提取所有文档,因为这可能会引入其他缩放问题。您应该使用适当的AQL和由索引支持的FILTER语句(使用explain()重新验证)来提取您需要的文档。
如果需要遍历数据库中的所有文档,请使用分页。实现分页的最佳方式通常是将range FILTERLIMIT子句组合在一起:

FOR x IN docs
  FILTER x.offsetteableAttribute > @lastDocumentWithThisID
  LIMIT 200
    RETURN x
svmlkihl

svmlkihl2#

所以我是这样做的。你可以指定更多的参数param使它更容易做到。
查看源代码,您可以看到文档字符串说明了要执行的操作
第一个
这就是所有你需要做的!

相关问题