Как пройти по графику с начальной точкой и без знания конечной?

Предположим, у меня есть граф, который выглядит как дерево переменной арности. У меня есть Vertex, и я ничего не знаю о местонахождении конечной точки, кроме того, что id это 0. Я видел несколько примеров использования Gremlin, но не могу найти подходящего — все они в основном делают что-то вроде x.out.in.out и так далее, а в моем случае это неприменимо. Я также использую привязки Java, поэтому я был бы признателен, если бы вы ответили на этот факт.

P.S. Может быть, я должен быть более конкретным. Я также хотел бы собрать все properties этих узлов, так что если есть какие-то reduce/foldLeft и т. д., но только для pipes - это было бы просто здорово.


person tkroman    schedule 19.12.2013    source источник


Ответы (1)


Пример для графа игрушек Tinkerpop (найти путь от vadas [вершина 2 ] в Питер [вершина 6]):

gremlin> g = TinkerGraphFactory.createTinkerGraph()
==>tinkergraph[vertices:6 edges:6]
gremlin> start = g.v(2)
==>v[2]
gremlin> end = g.v(6)
==>v[6]
gremlin> start.as("x").both().loop("x", {it.object != end}, {true}).retain([end]).path()[0]
==>[v[2], v[1], v[3], v[6]]

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

Если вам нужны все свойства:

gremlin> start.as("x").both().loop("x", {it.object != end}, {true}).retain([end]).path().transform({ it.collect({ it.map() }) })[0]
==>[{age=27, name=vadas}, {age=29, name=marko}, {name=lop, lang=java}, {age=35, name=peter}]

И если вам просто нужно одно свойство:

gremlin> start.as("x").both().loop("x", {it.object != end}, {true}).retain([end]).path().transform({ it.collect({ it.name }) })[0]
==>[vadas, marko, lop, peter]

Привет, Даниэль

person Daniel Kuppitz    schedule 19.12.2013
comment
Спасибо, Даниэль. Что означает both? Я имею в виду, что это аналог в Java API, bothV? - person tkroman; 20.12.2013
comment
См.: tinkerpop.com/docs/javadocs/gremlin/2.4.0/com/tinkerpop/gremlin/ - person Daniel Kuppitz; 20.12.2013