Поиск всех косвенно связанных узлов с конкретными отношениями Gremlin

Предположим, у меня есть числовой идентификатор узла в Gremlin. Используется с

g.V(n_id)

Скажите, что этот узел - тема.

Каждая тема может иметь вопрос с отношениями threadOf,

Каждый вопрос может иметь ответ или комментарий с отношением threadOf

Если я получу числовой идентификатор в качестве входных данных, я хотел бы запрос с гремлином, который возвращает все вопросы, связанные с этой темой, и все ответы или комментарии, связанные с этими вопросами.

Все отношения threadOf

Возможно ли это с Гремлин?

1 ответ

Решение

Есть несколько способов сделать это с Gremlin. Давайте предположим, что этот график (с вопросами о Гремлин всегда полезно включить небольшой пример графика в сам вопрос, например так):

gremlin> graph = TinkerGraph.open()
==>tinkergraph[vertices:0 edges:0]
gremlin> g = graph.traversal()
==>graphtraversalsource[tinkergraph[vertices:0 edges:0], standard]
gremlin> g.addV('topic').property('text','topic').as('t').
......1>   addV('question').property('text','question 1').as('q1').
......2>   addV('question').property('text','question 2').as('q2').
......3>   addV('comment').property('text','comment 1').as('c1').
......4>   addV('comment').property('text','comment 2').as('c2').
......5>   addV('answer').property('text','answer 1').as('a1').
......6>   addV('answer').property('text','answer 2').as('a2').
......7>   addE('threadOf').from('t').to('q1').
......8>   addE('threadOf').from('t').to('q2').
......9>   addE('threadOf').from('q1').to('c1').
.....10>   addE('threadOf').from('q1').to('c2').
.....11>   addE('threadOf').from('q1').to('a1').
.....12>   addE('threadOf').from('q2').to('a2').iterate()

Приведенный выше график представляет собой дерево, поэтому лучше всего вернуть его как единое целое. Для этого мы можем использовать шаг дерева. Тема находится на вершине с идентификатором "0", поэтому, если мы хотим всю иерархию "threadOf", мы могли бы просто сделать:

gremlin> g.V(0L).out('threadOf').out('threadOf').tree().by('text')
==>[topic:[question 1:[comment 2:[],comment 1:[],answer 1:[]],question 2:[answer 2:[]]]]

Это работает, но предполагает, что мы знаем глубину дерева ребер "threadOf" out() дважды от вершины "0". Если мы не знаем глубину, мы можем сделать:

gremlin> g.V(0L).repeat(out('threadOf')).emit().tree().by('text')
==>[topic:[question 1:[comment 2:[],comment 1:[],answer 1:[]],question 2:[answer 2:[]]]]
Другие вопросы по тегам