Вот первый подход, который пришёл мне в голову - не удивлюсь, если бы был более прямой способ подумать об этом, но:
gremlin> g.inject([1,2,3]).as('x').
......1> unfold().as('a').
......2> map(select('x').
......3> unfold().
......4> project('a','b').
......5> by(select('a')).
......6> by().
......7> fold()).
......8> unfold()
==>[a:1,b:1]
==>[a:1,b:2]
==>[a:1,b:3]
==>[a:2,b:1]
==>[a:2,b:2]
==>[a:2,b:3]
==>[a:3,b:1]
==>[a:3,b:2]
==>[a:3,b:3]
Я предполагаю «хитрость» в этомПодход состоит в том, чтобы выполнить итерацию «x» (то есть списка чисел) дважды, один раз для «a» и один раз для «b».Возможно, семантику зацикливания можно было бы лучше понять в контексте repeat()
:
gremlin> g.inject([1,2,3]).as('x').
......1> unfold().as('a').
......2> repeat(select('x').
......3> unfold().
......4> project('a','b').
......5> by(select('a')).
......6> by()).
......7> times(1)
==>[a:1,b:1]
==>[a:1,b:2]
==>[a:1,b:3]
==>[a:2,b:1]
==>[a:2,b:2]
==>[a:2,b:3]
==>[a:3,b:1]
==>[a:3,b:2]
==>[a:3,b:3]
Не уверен, что это же намерение более понятно с этим подходом или нет.Я думаю, что предпочитаю первое.Когда я закончил печатать, я понял, что все это может упроститься до:
gremlin> g.inject([1,2,3]).as('x').
......1> unfold().as('a').
......2> select('x').
......3> unfold().as('b').
......4> select('a','b')
==>[a:1,b:1]
==>[a:1,b:2]
==>[a:1,b:3]
==>[a:2,b:1]
==>[a:2,b:2]
==>[a:2,b:3]
==>[a:3,b:1]
==>[a:3,b:2]
==>[a:3,b:3]
Очевидно, я бы сказал, что это последнее решение лучше и проще для чтения.