2012-02-28 4 views
3

В моей базе данных графов у меня есть ветви и листья. Филиалы могут «содержать» Листья и ветви могут «содержать» ветви.Graph-Traversal: как я могу запросить «друзей и друзей друзей» с использованием Gremlin

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

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

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

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

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

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

ответ

3

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

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

Это говорит:

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

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

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

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

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