问题是
我迭代整个顶点集合,例如journals
,并使用它创建从person
到给定journal
的边author
。
我使用python-arango,代码如下所示:
for journal in journals.all():
create_author_edge(journal)
我有一个相对较小的数据集,并且journals
-集合只有大约1300个文档。但是:这是 * 大于1000*,这是Web界面中的批处理大小-但我不知道这是否相关。
问题是它会引发CursorNextError
,并从数据库返回HTTP 404
和ERR 1600
,这就是ERROR_CURSOR_NOT_FOUND
错误:
当通过游标的ID请求游标但找不到具有该ID的游标时,将引发。
深入了解原因
对于ArangoDB Cursor Timeout和this 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”,所以如果有人能创建它并标记我的问题,那就太好了。*
2条答案
按热度按时间pbgvytdp1#
在服务器内部,简单查询将被转换为
all()
。正如参考的github问题所讨论的,简单查询不支持TTL
参数,也不会获得它们。这里首选的解决方案是在客户端上使用AQL-Query,以便您可以指定TTL参数。
一般来说,您应该避免一次从数据库中提取所有文档,因为这可能会引入其他缩放问题。您应该使用适当的AQL和由索引支持的
FILTER
语句(使用explain()
重新验证)来提取您需要的文档。如果需要遍历数据库中的所有文档,请使用分页。实现分页的最佳方式通常是将range
FILTER
与LIMIT
子句组合在一起:svmlkihl2#
所以我是这样做的。你可以指定更多的参数param使它更容易做到。
查看源代码,您可以看到文档字符串说明了要执行的操作
第一个
这就是所有你需要做的!