数据模型是:
[books-文档
页面-文档。页面可能仅包含对另一本书的引用]
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的页面,但是我只需要一个边缘。 id与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日志对您没有帮助,请检查系统日志。)>
但是关于您的问题:您是否不对长度为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}
它适用于非常小的样本集。也许这对查询计划程序,执行程序来说要轻一些?
向AQL添加选项有助于解决此问题。