Как получить вершины последнего уровня определенной вершины, где значение последнего уровня неизвестно, используя gremlinPipeLine

Я хочу написать запрос, чтобы найти все вершины на последнем уровне определенной вершины, где значение последнего уровня неизвестно, используя Gremlin. Предположим, у меня есть вершина A. Следующий набор вершин, которые связаны с A, это [B,C,D]. Вершины на 2-м уровне [E,F,G] и так далее.


person user2420143    schedule 20.04.2015    source источник
comment
Хорошо, что ты чего-то хочешь, но что ты хочешь от нас?   -  person WonderWorld    schedule 20.04.2015
comment
Что вы имеете в виду под «последним уровнем определенной вершины»? Приведите пример!   -  person Faber    schedule 20.04.2015


Ответы (1)


Следующее даст вам все листья того, что я предполагаю, является древовидной структурой:

g.v(1).out.loop(1){it.object.outE.hasNext()}

Вышеупомянутое должно вывести вас из вершины «1», пока вы не достигнете «последнего уровня» любого конкретного пути. Испускаемые вершины должны быть теми, которые этот обход находит в конце.

gremlin> g = new TinkerGraph()
==>tinkergraph[vertices:0 edges:0]
gremlin> v1 = g.addVertex()
==>v[0]
gremlin> v2 = g.addVertex()
==>v[1]
gremlin> v3a = g.addVertex()
==>v[2]
gremlin> v3b = g.addVertex()
==>v[3]
gremlin> v4 = g.addVertex() 
==>v[4]
gremlin> v1.addEdge('next',v2)
==>e[5][0-next->1]
gremlin> v2.addEdge('next',v3a)
==>e[6][1-next->2]
gremlin> v2.addEdge('next',v3b)
==>e[7][1-next->3]
gremlin> v3a.addEdge('next',v4)
==>e[8][2-next->4]                 
gremlin> g.v(1).out.loop(1){it.object.outE.hasNext()}
==>v[3]
==>v[4]

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

В качестве примечания: вы можете контролировать эмиссию промежуточных вершин (а не только конечных), добавляя еще одно замыкание (т.е. замыкание emit). Например,

g.v(1).out.loop(1){true}{true}

Вышеприведенный цикл будет заканчиваться и испускать каждую вершину, которую он найдет.

Найти «высоту» дерева можно, захватив максимальное количество циклов:

gremlin> h=0;g.v(1).out.loop(1){h=Math.max(h,it.loops);it.object.outE.hasNext()}
==>v[3]
==>v[4]
gremlin> h
==>3
person stephen mallette    schedule 20.04.2015
comment
Привет @Стивен Маллетт. Спасибо за быстрый ответ . Первый запрос не дает никаких результатов. Хотя второй запрос работает нормально. Я также хотел бы знать, как найти высоту дерева. - person user2420143; 20.04.2015