尝试运行包含COLLECT子句的遍历AQL时,ArangoDB崩溃

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

数据模型为:

账簿-单据
-文档。页面只能包含一个对另一本书的引用
books_pages- edges。从书本到页面和从页面到书本

示例:

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
...

我们的目标是在图书之间建立边缘,以避免重复。book 1包含多个提到book 2的页面,但我只需要一个边缘。Id与book 1引用book 2的次数无关。

合格质量水平

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端的一个bug?

cigdeys3

cigdeys31#

我不能对崩溃发表评论,尤其是所有原因,因为您没有给予任何与之相关的信息以及它是如何表现出来的--如果原因是内存不足的kill/restart,您应该提到这一点(如果arangodb日志没有帮助,请检查系统日志)。
但关于你的问题:难道你对所有长度为3的唯一路径不感兴趣吗(顶点数为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}

它适用于一个非常小的样本集。也许这是一个有点轻的查询平面,刽子手?

ssm49v7z

ssm49v7z2#

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

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

相关问题