ArangoDB аварийно завершает работу при попытке выполнить обход AQL с предложением COLLECT в нем

Модель данных:

книги - документы

страницы - документы. Страница может содержать только одну ссылку на другую книгу

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 не имеет значения, сколько раз book2 упоминалось в book1.

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?


person A Kunin    schedule 07.02.2020    source источник


Ответы (2)


Я не могу комментировать сбой, не в последнюю очередь, потому что вы не даете никакой информации, относящейся к нему и как он проявляется - если причина заключается в убийстве / перезапуске из-за нехватки памяти, вы должны упомянуть об этом (проверьте системные журналы, если журнал 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}

Это работает для очень небольшого набора образцов. Может это полегче по планировщику запросов, исполнителю?

person Tom Regner    schedule 20.02.2020
comment
Я также пытался решить проблему с помощью DISTINCT, но у меня не получилось по разным причинам. На самом деле помогли: OPTIONS {uniqueEdges: 'path', uniqueVertices: 'global', bfs: true}) - person A Kunin; 26.05.2020

Добавление опции в AQL помогло решить проблему.

OPTIONS {uniqueEdges: 'path',  uniqueVertices: 'global', bfs: true }")
person A Kunin    schedule 26.05.2020