Как отобразить все дочерние краевые узлы в arangoDB [n-й уровень, например, neo4J] - PullRequest
0 голосов
/ 24 января 2020

настроить сбор событий с 1 млн. Записей. Успешно настройте коллекцию ребер ChildEvents.

   FOR c IN events
        FOR p IN events  
            FILTER p.mynum == ( c.mynum + 1 )
                INSERT { _from: c._id, _to: p._id}  INTO ChildEvents
                    RETURN $NEW

Всего записей: 999999 в ChildEvents Теперь мне нужно отобразить всех родителей / или детей для данного узла. В этом случае я ожидаю, что приведенный ниже запрос вернет все узлы от 350 до 99999. (350 -> 351 -> 352 -> .... 999999) FOR v IN OUTBOUND "events / 350" any ChildEvents RETURN v Но этот запрос возвращает только 2 записи. Если мы используем 1..200, это ограничивает количество возвращаемых записей. Как достать н. количество записей в этом случае?

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

Ваша помощь очень ценится.

1 Ответ

0 голосов
/ 27 января 2020

Таким образом, у дочерних узлов будут самые низкие значения для mynum, а у родителей будут более высокие значения, верно? Для набора тестов я создал таблицу events следующим образом:

FOR n IN 1..99999
    LET doc = { mynum: n }
    INSERT doc INTO events

И после создания постоянного ха sh index для mynum я создал ребра как this:

FOR c IN events
    FOR p IN events
        FILTER p.mynum == ( c.mynum + 1 )
        LET edge = { _from: c._id, _to: p._id }
        INSERT edge INTO ChildEvents

Это генерирует график "от дочернего к родительскому", например:

    parent  <---  child  [ <---  child(n) ... ]

Затем вы начинаете с узла (скажем, mynum == 50) и получаете все OUTBOUND ребра (см. анонимный график документы) от прыжка x до прыжка y. Я ограничиваю эти значения (от нуля до ста), чтобы количество возвращаемых документов было небольшим, но вы можете использовать любое значение.

FOR event in events
    FILTER event.mynum == 50
    FOR v IN 0..100 OUTBOUND event
        ChildEvents
        RETURN v

, которое возвращает 101 документ, начиная с mynum: 50, например :

[
  {
    "_id": "events/285436",
    "mynum": 50
  },
  {
    "_id": "events/285437",
    "mynum": 51
  },
  {
    "_id": "events/285438",
    "mynum": 52
  },
  ...
]

Установка x на 0 возвращает начальный узел, но изменение на 1 исключает его, начиная возвращать узлы на расстоянии одного шага:

[
  {
    "_id": "events/285436",
    "mynum": 51
  },
  {
    "_id": "events/285437",
    "mynum": 52
  },
  {
    "_id": "events/285438",
    "mynum": 53
  },
  ...
]

Имея это в виду, мы можем вернуть узлы из любой точки графика. Например, установка x в 99 ...

FOR event in events
    FILTER event.mynum == 50
    FOR v IN 99..100 OUTBOUND event
        ChildEvents
        RETURN v

... вернет только два узла:

[
  {
    "_id": "events/285535",
    "mynum": 149
  },
  {
    "_id": "events/285536",
    "mynum": 150
  }
]

Вы также можете определить значения "счетчика прыжков" с помощью переменные:

LET n_start = 100
LET n_end = 999
FOR event in events
    FILTER event.mynum == 50
    FOR v IN n_start..n_end OUTBOUND event
        ChildEvents
        RETURN v

Не похоже, что вы можете управлять ими из таблицы (БД не может построить план), но вы МОЖЕТЕ создать параметры привязки и передать значения таким образом :

/* JavaScript */
const aql = [
    'FOR event in events',
    '    FILTER event.mynum == 50',
    '    FOR v IN @n_start..@n_end OUTBOUND event',
    '        ChildEvents',
    '        RETURN v',
];
const vars = {
    n_start: 100,
    n_end: 999,
};
const result = await db._query(aql.join('\n'), vars).toArray();

Использование параметров связывания зависит от языка, но вот несколько ссылок для начала:

...