2016-04-11 8 views
1

Привет Я новичок в Tinkerpop и Gremlin, и я борюсь с обходом, который я пытаюсь выполнить.Объединение коллекций с запросом Гремлина

В принципе, у меня есть набор вершинных идентификаторов, из которых я хочу пройти, и найти набор вершин из определенных краев. Я хочу связать вершины, следующие за пределами, с правдивостью, из которой он пришел. Например: v1 -> e1 -> v2 v1 -> e2 -> v4 v3 -> e3 -> v5 v3 -> e4 -> v6 Итак, v1 имеет 2 выходящих ребра (e1 и e2) в v2 и v4, а v3 имеет 2 выходящих ребра (e3 и e4) в v5 и v6. Я хочу получить результат обхода, который будет выглядеть примерно так: [[[v1],[v2,v4]],[v3,[v5,v5]]]

Может кто-нибудь помочь мне с обходом с помощью Гремлина, который поможет мне получить этот результат? Ближайший я пришел это что-то вроде этого graph.traversal().V(4264,40964144).as('people').map{it.get().vertices(OUT, 'codes_in')}.as('languages').union(select('people'), select('languages'))

ответ

2

Вот один из способов вы можете сделать это продемонстрировано с «современным» toy graph:

gremlin> graph = TinkerFactory.createModern() 
==>tinkergraph[vertices:6 edges:6] 
gremlin> g = graph.traversal() 
==>graphtraversalsource[tinkergraph[vertices:6 edges:6], standard] 
gremlin> g.V(1,4).group().by().by(out().fold()) 
==>[v[1]:[v[3], v[2], v[4]], v[4]:[v[5], v[3]]] 

Он просто использует group(). Первый модулятор by() представляет собой ключ каждой группы (в данном случае начальную вершину), а затем второй модулятор by() - это то, что вы хотите в своей группе (в данном случае - out()). Обратите внимание, что вы должны включить fold() во второй by(), чтобы принудительно повторить этот внутренний обход.

Кстати, делать graph.traversal() не очень хороший рисунок. Создайте TraversalSource один раз и повторно используйте его.

+0

Спасибо, Стивен, это сделал трюк. Гораздо легче, чем я ожидал! –

+0

На самом деле Стивен, у меня есть один вопрос с добавлением. Я хотел бы, чтобы свойства v1 и v3 также включались в результат. Я не вижу, что это происходит с запросом, который вы предоставили. –

+0

Я думаю, что я вычислил запрос, который работает 'graph.traversal(). V (4264,40964144) .group(). By(). By (union (fold(), out()). Fold()) ' –