格雷姆林:生成笛卡尔积

时间:2018-12-04 12:56:46

标签: gremlin

给出对象列表,生成所有可能对的最佳方法是什么?

我尝试过的代码:

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 :(得分:1)

这是我想到的第一种方法-如果有更直接的思考方式,这不会感到惊讶,但是:

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]

很明显,我想说这最后的解决方案是最好,最容易阅读的。