使用Gremlin在一次遍历中添加边

时间:2018-03-07 20:26:32

标签: graph traversal gremlin titan edges

我们有:

g = graph.traversal()

我该做什么就像:

numV = g.V().count()
g.V().range(0,numV-1).addE('label').to(g.V().range(1,numV))

我想在两个相邻顶点之间添加边。

在我的情况下,numV是使用长代码而不是简单的gV()来计算的.count(),第二行中的gV()也会被长行代替,所以有两个问题:

  1. 如何避免预先计算numV?因为我们已经在代码的第二行完成了g.V()。

  2. 我试图像这样简化代码:

    g.V().as('a').range(0,numV-1).addE('label').to(select('a').range(1,numV))
    

    但它给了我错误:

      

    提供的遍历器不会映射到值

  3. 我是格雷姆林的新手。

1 个答案:

答案 0 :(得分:0)

让我们从一个包含foobar顶点和顺序ID的小样本图开始。

gremlin> g = TinkerGraph.open().traversal()
==>graphtraversalsource[tinkergraph[vertices:0 edges:0], standard]
gremlin> g.withSack(1).
......1>   addV('foo').
......2>     property(id, sack()).
......3>   emit().
......4>     repeat(sack(sum).by(constant(1)).
......5>            addV().
......6>              property(label, __.constant(['foo','bar']).sample(local, 1).unfold()).
......7>              property(id, sack())).
......8>     times(20).
......9>   valueMap(true)
==>[label:foo,id:1]
==>[label:foo,id:2]
==>[label:bar,id:3]
==>[label:foo,id:4]
==>[label:bar,id:5]
==>[label:bar,id:6]
==>[label:foo,id:7]
==>[label:foo,id:8]
==>[label:foo,id:9]
==>[label:bar,id:10]
==>[label:foo,id:11]
==>[label:bar,id:12]
==>[label:foo,id:13]
==>[label:bar,id:14]
==>[label:bar,id:15]
==>[label:foo,id:16]
==>[label:bar,id:17]
==>[label:bar,id:18]
==>[label:foo,id:19]
==>[label:foo,id:20]
==>[label:bar,id:21]

现在假设我们要将所有foo个顶点与baz边连接起来;订单标准将是顶点id。

gremlin> g.V().hasLabel('foo').
......1>   order().
......2>     by(id).as('a').
......3>   aggregate('x').
......4>   flatMap(select('x').unfold().
......5>             where(gt('a')).by(id).
......6>             limit(1)).
......7>   addE('baz').
......8>     from('a')
==>e[0][1-baz->2]
==>e[1][2-baz->4]
==>e[2][4-baz->7]
==>e[3][7-baz->8]
==>e[4][8-baz->9]
==>e[5][9-baz->11]
==>e[6][11-baz->13]
==>e[7][13-baz->16]
==>e[8][16-baz->19]
==>e[9][19-baz->20]

我认为这几乎是您正在寻找的情景,但如果没有提供的示例图表和预期结果,很难说清楚。

另请注意,您应始终拥有明确的订单标准(它不必是ID),否则TinkerPop将无法保证确定性订单。