Как мне умножить свойство вершины на вес ребра от ребра, указывающего на него?

Я застрял на проблеме обхода графа, которая у меня, кажется, есть. Я использую 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 (), чтобы каждая вершина умножалась на соответствующее количество ребер.


person Morinaga    schedule 17.09.2020    source источник


Ответы (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
person stephen mallette    schedule 17.09.2020