我们有:
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()也会被长行代替,所以有两个问题:
如何避免预先计算numV?因为我们已经在代码的第二行完成了g.V()。
我试图像这样简化代码:
g.V().as('a').range(0,numV-1).addE('label').to(select('a').range(1,numV))
但它给了我错误:
提供的遍历器不会映射到值
我是格雷姆林的新手。
答案 0 :(得分:0)
让我们从一个包含foo
和bar
顶点和顺序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将无法保证确定性订单。