2016-01-11 5 views
3

В OrientDB каждая вершина имеет присоединенные кромки. Это означает, что можно явно перемещать узлы из коллекции с помощью вложенных операторов «select».Эффективный обход ArangoDB через атрибуты узла

В качестве примера: с учетом пути атрибутов узла найдите соответствующий конечный узел. Путь состоит из списка атрибутов узла (например, 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, процесс будет:

  • начала со всеми узлами рода = сайт
  • Прогулка по краю «ребенок» и собрать все предметы, которые имеют Kind = проекта и имя = project1
  • прогулки по детским краям и собрать все предметы, которые имеют Kind = библиотека и имя = Library1

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

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

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

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

ответ

1

С работы, как это в виду, мы разработали новый AQL graph traversal, который будет выпущен с ArangoDB 2,8 (в настоящее время в конце бета)

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

Позволяет использовать one of the ArangoDB 2.8 Example graphs с arangosh:

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

Она имеет свои ventices в 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 graph traversal chapter также имеет подробное объяснение, по которому траверс проходит по графику.

+0

Это именно то, что я искал. Я собираюсь аннотировать места в моем коде, где запрос будет полезен для этой функции. Мы все еще находимся на стадии технико-экономического обоснования, поэтому у меня есть немного времени. – ggendel

Смежные вопросы