ArangoDB: агрегирование подсчетов через обход графика

в моем графике ArangoDB у меня есть тема, потоки сообщений, связанные с этой темой, и сообщения внутри этих потоков сообщений. Я хотел бы пересечь график таким образом, чтобы вернуть данные, связанные с потоком сообщений, а также количество сообщений внутри потока сообщений.

данные структурированы довольно просто: у меня есть узел темы, ребро, расширяющееся до узла потока с связанной датой и категорией, и ребро из узла потока к узлу сообщения.

Я хотел бы вернуть данные, хранящиеся в узле потока, и количество сообщений, прикрепленных к потоку.

Я не уверен, как это сделать с for v, e, p in 1..2 outbound синтаксис. Должен ли я просто сделать for v, e, p in outbound с вложенным графом внутри него? Это все еще работает?

1 ответов


извините за задержку, мы упорно работаем над выпуском 3.1;)

Я думаю, что вы уже на правильное решение: Нелегко выразить то, чего вы хотели бы достичь в 1..2 OUTBOUND заявление. Это способ проще сформулировать в два 1..1 OUTBOUND заявления.

из вашего объяснения я думаю, что следующий запрос-это то, что вы будете использовать:

FOR thread IN 1 OUTBOUND @start @@threadEdges
  LET nr = COUNT(FOR message IN 1 OUTBOUND thread @@messageEdges RETURN 1)
  RETURN {
    date: thread.date,
    category: thread.category,
    messages: nr
  }

для некоторого объяснения: сначала я выбираю связанный поток. Далее я делаю подзапрос, чтобы просто могут ли сообщения для одного потока. Наконец я возвращаю нужную информацию.

С точки зрения производительности: С точки зрения доступа к данным (что, скорее всего, является "узким местом") нет никакой разницы в FOR x IN 1..2 OUTBOUND [...] и FOR x IN 1 OUTBOUND [...] FOR y IN 1 OUTBOUND x [...] оба должны смотреть на точно такие же документы. Оптимизация запросов может быть немного медленнее в более позднем случае, но разница намного ниже 1ms.