ArangoDB эффективный обход через атрибуты узла

В OrientDB каждая вершина имеет присоединенные ребра. Это означает, что можно явно ходить по узлам из коллекции, используя вложенные операторы "select".

В качестве примера: учитывая путь атрибутов узла, найдите соответствующий конечный узел. Путь состоит из списка атрибутов узла (например, kind является уникальным в узлах на пути).

Теперь предположим, что у меня есть дерево:

kind=site, name=site1
  -- kind=project, name=project1
  -- kind=library, name=library1
kind=site, name=site2
  -- kind=project, name=project2
  -- kind=library, name=library1

Пользователь хочет получить информацию из библиотеки с именем library1 с путем:

[{kind=site},{kind=project,name=project1},{kind=library,name=library1}]

Полностью квалифицированный для обхода каждый узел - это нормально, если в результате получается один узел.

В OrientDB процесс будет:

  • начать со всех узлов вида = сайт
  • пройти через "дочерний" край и собрать все объекты, которые имеют вид = проект и имя = проект1
  • пройти через дочерний край и собрать все объекты, которые имеют вид = библиотека и имя = библиотека1

Это можно сделать с помощью вложенного оператора select. Поле kind индексируется, поэтому начальные узлы быстро собираются из большого количества объектов. Чтобы еще больше повысить производительность, я знаю, какие виды есть в каких таблицах (коллекциях), чтобы я мог выбирать количество объектов для выбора (выберите из

, где kind = site).

В ArrangoDB, только ребра имеют информацию о привязке узла, поэтому, имея узел, я не могу напрямую пройти через соединенное ребро. В функции GRAPH_TRAVERSAL я могу указать начальную коллекцию на примере. Так что пример будет {вид = сайт}. Разве это не означает, что начальный список узлов нужно подбирать, сканируя все ребра графа, в основном просматривая каждый узел, связанный с входом каждого ребра во всем графе?

Как будет сформулирован такой запрос (в AQL и / или arangojs), чтобы он не начинался с полного сканирования объектов, связанных с краями?

Я также не вижу, как отправить примерную вершину в функцию обхода arangojs. Кажется, он всегда хочет явную начальную вершину.

1 ответ

Решение

Имея в виду подобные задачи, мы разработали новый обход AQL-графиков, который будет выпущен с ArangoDB 2.8 (в настоящее время в поздней бета-версии)

Что касается вашего последнего пункта, мы идентифицируем соответствующие коллекции, используя именованные графы, которые знают коллекции и их связь в графе. Я предполагаю, что вы будете использовать named graphs следовательно.

Давайте использовать один из графиков ArangoDB 2.8 в качестве примера с arangosh:

var examples = require("org/arangodb/graph-examples/example-graph.js");
var graph = examples.loadGraph("traversalGraph");

У него есть свои венецианские circles коллекция, и ее ребра, соединяющие вершины в edges коллекция:

db.circles.toArray();
db.edges.toArray();

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

Здесь мы фильтруем атрибут вершины, который будет найден в первом слое обхода:

db._query("FOR v, e, p IN 1..3 " + 
              "OUTBOUND 'circles/A' " + 
              "GRAPH 'traversalGraph' " + 
              "FILTER p.vertices[1]._key != 'G' RETURN v._key");

Мы также можем фильтровать атрибуты ребер аналогичным образом:

db._query("FOR v, e, p IN 1..3 "
          "OUTBOUND 'circles/A' " +
          "GRAPH 'traversalGraph' " + 
          "FILTER p.edges[0].label != 'right_foo' RETURN v._key");

Глава об обходе графа AQL также содержит подробное объяснение того, как обходчик проходит по графу.

Другие вопросы по тегам