Итерировать список значений из обхода A в обход B (Гремлин) - PullRequest
2 голосов
/ 02 августа 2020

Это мои тестовые данные:

graph = TinkerGraph.open()
g= graph.traversal()
g.addV('Account').property('id',"0x0").as('a1').
  addV('Account').property('id',"0x1").as('a2').
  addV('Account').property('id',"0x2").as('a3').
  addV('Token').property('address','1').as('tk1').
  addV('Token').property('address','2').as('tk2').
  addV('Token').property('address','3').as('tk3').
  addV('Trx').property('address','1').as('Trx1').
  addV('Trx').property('address','1').as('Trx2').
  addV('Trx').property('address','3').as('Trx3').
  addE('sent').from('a1').to('Trx1').
  addE('sent').from('a2').to('Trx2').
  addE('received_by').from('Trx1').to('a2').
  addE('received_by').from('Trx2').to('a3').
  addE('distributes').from('a1').to('tk1').
  addE('distributes').from('a1').to('tk2').
  addE('distributes').from('a1').to('tk3').
  iterate()

Мне нужно сначала получить все адреса токенов, используя отношение распределения, а затем с помощью этих значений l oop через обход. Это пример того, что мне нужно для одного токена

h = g.V().has('Account','id','0x0').next()
token = '1'
g.V(h).
      out('sent').has('address',token).as('t1').
      out('received_by').as('a2').
      out('sent').has('address',token).as('t2').
      out('received_by').as('a3').
      select('a3','a2'). \
         by('id').toList()

Это результат:

[a3:0x2,a2:0x1]

Вместо того, чтобы делать это has('address',token) на каждом переходе, я мог бы его опустить и просто убедитесь, что адрес токена такой же, поместив where('t1',eq('t2')).by('address') в конце обхода, но это плохо работает с учетом моего дизайна базы данных и индексов.

Итак, что я делаю для итерации:

tokens = g.V(h).out('distributes').values('address').toList()
finalList = []
for (token in tokens){    
    finalList.add(g.V(h).
      out('sent').has('address',token).
      out('received_by').as('a2').
      out('sent').has('address',token).
      out('received_by').as('a3').
      select('a3','a2'). \
         by('id').toList())  
 }

И это то, что хранится в finalList в конце:

==>[[a3:0x2,a2:0x1]]
==>[]
==>[]

Это работает, но мне было интересно, как я могу повторять этот список токенов таким образом, не выходя из Гремлина и не вводя это для l oop. Кроме того, мои результаты содержат пустые результаты, которые не являются оптимальными. Ключевым моментом здесь для меня является возможность всегда делать это has('address',token) для каждого перехода с токенами, которые когда-либо отправлял узел Account. Большое спасибо.

1 Ответ

2 голосов
/ 09 августа 2020

По-прежнему существует неопределенность в отношении того, чего вы пытаетесь достичь.

Тем не менее, я думаю, что этот запрос делает то, что вам нужно:

g.V().has('Account', 'id', '0x0').as('a').
  out('distributes').values('address').as('t').
    select('a').
  repeat(out('sent').where(values('address').
        as('t')).
    out('received_by')).
  emit()

Пример: https://gremlify.com/spwya4itlvd

...