2016-11-19 6 views
1

Я использую Titan на DynamoDB. У меня есть направленный граф графа без циклов. Учитывая вершину, мне нужны все пути, исходящие из этой вершины. Путь означает только список (вершины) вершин на каждом пути, исходящий из заданной вершины.Как получить все пути (вершины), исходящие из вершины в Java?

Я просто не могу понять Гремлин и Гровой, поэтому я надеюсь, что на Java существует решение.

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

ответ

4

dynamodb-titan основан на TinkerPop 3.x и в TinkerPop 3.x Gremlin не связан с Groovy. Gremlin в Groovy в основном эквивалентен Java. Вы не уйдете с Titan (или TinkerPop), если вы не изучите Gremlin, поскольку это единственный способ запросить график.

Для того, чтобы пройти путь обхода, необходимо использовать шаг path(). Чтобы продемонстрировать, что я буду использовать консоль Gremlin, и, хотя она оценивается с помощью Groovy, я могу заверить вас, что вы можете скопировать и вставить этот код в свой Java-проект, и он будет работать одинаково хорошо там.

Во-первых, я создаю игрушка график, который я продемонстрирую с:

gremlin> graph = TinkerFactory.createModern() 
==>tinkergraph[vertices:6 edges:6] 
gremlin> g = graph.traversal() 
==>graphtraversalsource[tinkergraph[vertices:6 edges:6], standard] 

Далее я пишу обхода, который находит единственную вершину с идентификатором 1 - это будет вершина, мы будем использовать для открыть «путь радиации» вы ищете:

gremlin> g.V(1) 
==>v[1] 

Затем мы пересекаем на из края в смежных вершин от 1:

gremlin> g.V(1).out() 
==>v[3] 
==>v[2] 
==>v[4] 

, а затем мы делаем это снова:

gremlin> g.V(1).out().out() 
==>v[5] 
==>v[3] 

Теперь, если мы хотим, чтобы увидеть тот путь, пересекающие потребовалось, чтобы получить там мы просто делаем:

gremlin> g.V(1).out().out().path() 
==>[v[1],v[4],v[5]] 
==>[v[1],v[4],v[3]] 

и есть все вершины расходящиеся от одна вершина, являются полноправными в двух шагах от 1.

Если вы не знаете длину ходьбы от начальной вершины, то вы можете использовать repeat():

gremlin> g.V(1).repeat(out()).until(outE().count().is(0)).path() 
==>[v[1],v[3]] 
==>[v[1],v[2]] 
==>[v[1],v[4],v[5]] 
==>[v[1],v[4],v[3]] 
+0

Спасибо, stephen mallete, вот что я искал. Как бы то ни было, похоже, проблема. Ошибка .out() должна повторяться до тех пор, пока она не закроет все ребра, которые могут быть связаны? как я знаю, когда прекратить цепочку .out()? Хотел бы я дать вам щедрость. – Ram

+1

Обновлен мой ответ ... снова, который должен перевести непосредственно в java. Обратите внимание, что вам необходимо [статически импортировать] (http://tinkerpop.apache.org/docs/current/tutorials/the-gremlin-console/#static-imports) класс '__' для этого, чтобы он работал (консоль делает это за вас автоматически), поэтому мой код работает без необходимости делать это явно. –

+0

Спасибо, stephen mallette, это именно то, что я искал. – Ram

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