Задавая вопросы о Gremlin, картинка и описание графика хороши, но сценарий Gremlin, создающий некоторые примеры данных, еще лучше:
g = TinkerGraph.open().traversal()
g.addV('node').property(T.id,0).as('0').
addV('node').property(T.id,1).as('1').
addV('node').property(T.id,2).as('2').
addV('node').property(T.id,3).as('3').
addE('link').from('1').to('0').
addE('link').from('1').to('0').
addE('link').from('0').to('3').
addE('link').from('2').to('0').iterate()
Вот один из способов сделать это:
gremlin> g.V(0).bothE().
......1> group().
......2> by(union(inV(),outV()).fold()).
......3> by(fold().
......4> project('incoming','outgoing').
......5> by(unfold().inV().hasId(0).count()).
......6> by(unfold().outV().hasId(0).count()))
==>[[v[0],v[1]]:[incoming:2,outgoing:0],[v[0],v[2]]:[incoming:1,outgoing:0],[v[3],v[0]]:[incoming:0,outgoing:1]]
По сути, мы group()
каждого ребра связываем с соответствующими вершинами входа / выхода (строка 2 - то есть List
входа / выхода, образованного union().fold()
), а затем уменьшаем ребра, собранные на пару вершин (начиная с в строке 3). Операция сокращения просто создает список с fold()
, а затем использует project()
для преобразования этого List
в Map
с «входящими» и «исходящими» ключами - значения для этих ключей определены в следующих соответствующих by()
модуляторы (то есть развернуть список ребер, отфильтровать для вершины "0" и count()
).