Добавление входящих ребер вершины в заданное свойство во время обхода - PullRequest
0 голосов
/ 25 апреля 2019

То, что я хотел бы сделать, - это прохождение в глубину, где на каждом шаге я добавляю входное ребро (фактически вершину) к набору. В конечном итоге я хочу, чтобы у каждого узла на шаге был список входящих вершин, которые были пройдены. Первоначально я добавлял единицу к простому свойству для каждого входящего ребра:

g.V().has('Name', 'startnode').repeat(__.in()).emit().property('degree', union(values('degree'), constant(1)).sum())

Я получаю свойство градус , которое содержит количество входящих ребер. Теперь я хочу набор входящих ребер, а не просто счет. что-то похожее на:

g.V().has('Name', 'R1\\B').repeat(__.in()).emit().property(set, 'incoming', XXX)

Это тот самый ХХХ. Что мне нужно установить? то есть текущая входящая вершина в обходе.

1 Ответ

1 голос
/ 25 апреля 2019

Для того, чтобы получить доступ к краям, вам нужно явно их пройти.

gremlin> g = TinkerFactory.createModern().traversal()
==>graphtraversalsource[tinkergraph[vertices:6 edges:6], standard]
gremlin> g.V().hasLabel('software').
           repeat(__.inE().as('e').outV()).
             emit().
           property(set, 'incoming', select(last, 'e')).iterate()
gremlin> g.V().valueMap()
==>[incoming:[e[9][1-created->3],e[8][1-knows->4]],name:[marko],age:[29]]
==>[name:[vadas],age:[27]]
==>[name:[lop],lang:[java]]
==>[incoming:[e[11][4-created->3],e[10][4-created->5]],name:[josh],age:[32]]
==>[name:[ripple],lang:[java]]
==>[incoming:[e[12][6-created->3]],name:[peter],age:[35]]

Я бы не рекомендовал хранить целые края;Идентификаторы ребер могут быть хорошими.

gremlin> g = TinkerFactory.createModern().traversal()
==>graphtraversalsource[tinkergraph[vertices:6 edges:6], standard]
gremlin> g.V().hasLabel('software').
           repeat(__.inE().as('e').outV()).
             emit().
           property(set, 'incoming', select(last, 'e').by(id)).iterate()
gremlin> g.V().valueMap()
==>[incoming:[9,8],name:[marko],age:[29]]
==>[name:[vadas],age:[27]]
==>[name:[lop],lang:[java]]
==>[incoming:[11,10],name:[josh],age:[32]]
==>[name:[ripple],lang:[java]]
==>[incoming:[12],name:[peter],age:[35]]

ОБНОВЛЕНИЕ

Чтобы собрать смежные идентификаторы вершин, это будет:

gremlin> g.V().hasLabel('software').
           repeat(__.as('v').in()).
             emit().
           property(set, 'incoming', select(last, 'v').by(id)).iterate()
gremlin> g.V().valueMap()
==>[incoming:[3,4],name:[marko],age:[29]]
==>[name:[vadas],age:[27]]
==>[name:[lop],lang:[java]]
==>[incoming:[3,5],name:[josh],age:[32]]
==>[name:[ripple],lang:[java]]
==>[incoming:[3],name:[peter],age:[35]]
...