Гремлин: генерирует декартово произведение - PullRequest
0 голосов
/ 04 декабря 2018

Учитывая список объектов, каков наилучший способ генерации всех возможных пар?

Код, который я пробовал:

g.inject(1, 2, 3).project('a', 'b').by().by()

Ожидаемый:

[
  {'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},
]

Факт:

[
  {'a': 1, 'b': 1},
  {'a': 2, 'b': 2},
  {'a': 3, 'b': 3},
]

1 Ответ

0 голосов
/ 04 декабря 2018

Вот первый подход, который пришёл мне в голову - не удивлюсь, если бы был более прямой способ подумать об этом, но:

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]

Очевидно, я бы сказал, что это последнее решение лучше и проще для чтения.

...