Графовый запрос с использованием AQL - PullRequest
0 голосов
/ 06 июня 2018

У меня есть 3 коллекции, первая - это список (вершины), вторая - пользователи (вершины), а третья - активность (ребра).Я планирую хранить любые виды действий, выполненных в списке в коллекции действий (например, «Нравится», «Комментарий», «Отметить» и т. Д.).Предположим, мне нужно получить все списки любого пользователя, а также счетчик каждого события в каждом списке, который он создал, как ни одного комментария, подобного, отметки в каждом списке в одном запросе.Как я могу это сделать?Я изучал документы на arangodb около 2 дней, но не могу понять, как написать такой запрос.enter image description here

1 Ответ

0 голосов
/ 06 июня 2018

Если каждое отдельное действие представлено как ребро между обеими вашими коллекциями вершин, найдите пользователя, найдите его соседей (вершины списка) и сгруппируйте ребра по типу (атрибут ребра?):

FOR u IN users
  FILTER u._key == "john"
  FOR v, e IN 1..1 OUTBOUND u activities
    // v is a list vertex document
    // e is an activity edge document
    COLLECT list = v._id, type = e.type, user = u._id
    WITH COUNT INTO count
    RETURN { list, user, type, count }

Результат с моими тестовыми данными:

list        | user       | type    | count
------------|------------|---------|------
lists/john1 | users/john | comment | 1
lists/john1 | users/john | modify  | 3
lists/john1 | users/john | vote    | 1
lists/john2 | users/john | delete  | 1
lists/john2 | users/john | like    | 1
lists/john2 | users/john | modify  | 2
lists/john2 | users/john | vote    | 2

Если вы хотите сохранить список и пользовательский документ, вы можете сделать:

FOR u IN users
  FILTER u._key == "john"
  FOR v, e IN 1..1 OUTBOUND u activities
    COLLECT list = v._id, type = e.type
    AGGREGATE count = LENGTH(1) INTO groups
    RETURN {
        list: groups[0].v,
        user: groups[0].u,
        type,
        count
    }

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

FOR u IN users
  FILTER u._key == "john"
  FOR v, e IN 1..1 OUTBOUND u activities
    COLLECT list_id = v._id, user_id = u._id, type = e.type
    WITH COUNT INTO count
    RETURN {
        list: DOCUMENT(list_id),
        user: DOCUMENT(user_id),
        type,
        count
    }
...