【问题标题】:ArangoDB crashes on attempt to run traversal AQL with COLLECT clause in itArangoDB 在尝试运行带有 COLLECT 子句的遍历 AQL 时崩溃
【发布时间】:2025-12-04 16:10:02
【问题描述】:

数据模型是:

书籍 - 文档

页面 - 文档。页面可能只包含对另一本书的引用

books_pages - 边缘。从一本书到另一页,从一页到另一本书

例子:

book1 -> (edge) -> page1 -> (edge) -> book2
book1 -> (edge) -> page2 -> (edge) -> book2
book1 -> (edge) -> page3 -> (edge) -> book2
book1 -> (edge) -> page4 -> (edge) -> book3
book2 -> (edge) -> page5 -> (edge) -> book4
book2 -> (edge) -> page6 -> (edge) -> book4
book2 -> (edge) -> page7 -> (edge) -> book4
book2 -> (edge) -> page6 -> (edge) -> book4
...

目标是在书籍之间建立边缘以避免重复。 book1 包含几个提到 book2 的页面,但我只需要一个边缘。在 book1 中引用 book2 的次数无关紧要。

AQL

FOR b1 IN books
    FOR v IN 1..1 OUTBOUND b1 books_pages
       FOR b2 IN 1..1 OUTBOUND v books_pages
       COLLECT  from = b1._id, to = b2._id
  RETURN {'from':from, 'to': to}

当数据库中的文档数量很大时,arangodb 崩溃。这个查询有问题还是这只是 arangodb 方面的错误?

【问题讨论】:

    标签: arangodb aql


    【解决方案1】:

    我无法对崩溃发表评论,尤其是所有原因,因为您没有提供任何有关它的信息以及它是如何表现出来的——如果原因是内存不足杀死/重新启动,您应该提及那个(如果 arangodb 日志没有帮助,请检查系统日志)。

    但是关于您的问题:您是否对长度为 3 的所有唯一路径(就顶点而言,就边而言 2)感兴趣?那不是浓缩成

    FOR b IN books
       FOR v,e,p IN 2..2 OUTBOUND b GRAPH 'books'
          RETURN DISTINCT {"from": p.vertices[0]._id, "to": p.vertices[2]._id}
    

    它适用于非常小的样本集。也许这对查询计划者,刽子手来说有点轻?

    【讨论】:

    • 我也尝试使用 DISTINCT 解决问题,但由于各种原因对我不起作用。真正有帮助的是: OPTIONS {uniqueEdges: 'path', uniqueVertices: 'global', bfs: true }")
    【解决方案2】:

    向 AQL 添加选项有助于解决问题。

    OPTIONS {uniqueEdges: 'path',  uniqueVertices: 'global', bfs: true }")
    

    【讨论】:

      最近更新 更多