0

我被困在我似乎遇到的图形遍历问题上。我使用 gremlinpython,我的数据库存储在 AWS Neptune 中。

该图类似于此示例:

g = TinkerGraph.open().traversal()
o1 = g.addV('o').property('order','order1').next()
r1 = g.addV('r').property('recipe', 'recipe1').property('price', 3).next()
r2 = g.addV('r').property('recipe', 'recipe2').property('price', 3).next()
r3 = g.addV('r').property('recipe', 'recipe3').property('price', 3).next()
g.V(o1).addE('orders').to(r1).property('amount',2)
g.V(o1).addE('orders').to(r2).property('amount',3)
g.V(o1).addE('orders').to(r2).property('amount',4)

现在我想通过将配方值乘以它们各自的边缘量并将它们相加来计算订单的总成本。

到目前为止,我的代码如下所示:

g.withSack(0).V('o1')\
.out()\
.sack(Operator.sum).by('price')\
.sack(Operator.mult)\
.by(g.V('o1').outE().values('amount')).sack().toList()
==>[6,6,6]

我注意到这段代码只会将每个配方值乘以第一个边的数量,而不是各自的数量。我不确定如何在 sack().by() 操作中指定每个顶点应乘以各自的边量。

4

1 回答 1

1

用于创建数据的 Gremlin 脚本需要一些修复:

g = TinkerGraph.open().traversal()
o1 = g.addV('o').property('order','order1').next()
r1 = g.addV('r').property('recipe', 'recipe1').property('price', 3).next()
r2 = g.addV('r').property('recipe', 'recipe2').property('price', 3).next()
r3 = g.addV('r').property('recipe', 'recipe3').property('price', 3).next()
g.V(o1).addE('orders').to(r1).property('amount',2)
g.V(o1).addE('orders').to(r2).property('amount',3)
g.V(o1).addE('orders').to(r2).property('amount',4)

您的方法非常接近,因此希望我的小改动对您有意义:

gremlin> g.withSack(0).V(o1).
......1>   outE().
......2>   sack(Operator.assign).by('amount').
......3>   inV().
......4>   sack(Operator.mult).by('price').
......5>   sack().
......6>   sum()
==>27
于 2020-09-17T10:53:41.883 回答