Graph-Traversal: как запросить «друзей и друзей друзей» с помощью Gremlin - PullRequest
3 голосов
/ 28 февраля 2012

В моей базе данных графиков у меня есть ветви и листья. Ветви могут «содержать» листья, а ветви могут «содержать» ветви.

Как, используя Gremlin, я могу найти все листья для данной ветви, которые прямо или косвенно связаны с ней?

Я получил это для работы в Cypher:

START v=node(1) MATCH v-[:contains*1..2]->i RETURN v,i

Где *1..2 означает «друзья и друзья друзей».

Я думал, может быть, LoopV был путь вперед, но я просто получил Exception:

Ошибка чтения JArray из JsonReader. Текущий элемент JsonReader не является массивом: String

1 Ответ

3 голосов
/ 29 февраля 2012

Вы можете сделать следующее в Gremlin 1.4 +.

g.v(1).out('contains').loop(1){true}{it.out('contains').count() == 0}

Это говорит:

  1. Начать с вершины с идентификатором 1
  2. Возьмите исходящие "содержит" ребра.
  3. Цикл над секцией out ('contains').
  4. Цикл "бесконечно" (убедитесь, что в вашем дереве нет петель)
  5. Излучают только те затронутые вершины, которые не имеют более исходящих «содержащих» ребер. (то есть листья)

Однако, глядя на то, что вы хотели от Сайфера, похоже, что вам нужно всего лишь 2 шага. Таким образом, чтобы сделать это, просто выполните:

g.v(1).out('contains').loop(1){it.loops < 3}

Возможно, я неправильно понял ваш вопрос - в любом случае, этого должно хватить для игры.

...