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