我需要执行以下形式的查询:我有一个树结构,叶子节点处有开销。我只需要一个查询即可向我提供根节点下的所有汇总成本。
例如,在上图中,我希望从查询中获得类似的输出
{ 1: 6, 2: 4, 3: 2, 4: 1, 5: 1, 6: 2, 7: 1, 8: 1}
我一直在考虑使用Gremlin API中的“麻袋”步骤,但是cosmosDB目前似乎不支持麻袋。我还尝试存储“聚合成本”的伪属性,并从叶节点向上移动,但是我无法弄清楚如何在每个节点上将动态值存储为仅对该节点本地的属性。 考虑到这些限制,这种查询是否可能?
答案 0 :(得分:3)
在询问有关Gremlin的问题时,始终最好包括简短的示例数据的Gremlin脚本:
g.addV().property('id',1).as('1').
addV().property('id',2).as('2').
addV().property('id',3).as('3').
addV().property('id',4).property('cost',1).as('4').
addV().property('id',5).property('cost',1).as('5').
addV().property('id',6).property('cost',2).as('6').
addV().property('id',7).property('cost',1).as('7').
addV().property('id',8).property('cost',1).as('8').
addE('link').from('1').to('2').
addE('link').from('1').to('3').
addE('link').from('2').to('4').
addE('link').from('2').to('5').
addE('link').from('2').to('6').
addE('link').from('3').to('7').
addE('link').from('3').to('8').iterate()
通过CosmosDB中可用的步骤,我认为您可能能够获得的最接近的是:
gremlin> g.V().
......1> group().
......2> by('id').
......3> by(emit(has('cost')).
......4> repeat(out()).
......5> values('cost').
......6> fold())
==>[1:[1,1,2,1,1],2:[1,1,2],3:[1,1],4:[1],5:[1],6:[2],7:[1],8:[1]]
group()
有助于产生所需的Map
结构。然后,对于您分组的每个顶点,使用repeat()
进行遍历,直到到达叶顶点。请注意,emit()
确保仅出于结果目的返回那些具有“ cost”属性的叶子的顶点。
之所以这么说与CosmosDB差不多,是因为我看不到CosmosDB支持sum()
步骤here。如果可以,那么:
gremlin> g.V().
......1> group().
......2> by('id').
......3> by(emit(has('cost')).
......4> repeat(out()).
......5> values('cost').
......6> sum())
==>[1:6,2:4,3:2,4:1,5:1,6:2,7:1,8:1]
我想您将不得不自己对返回的结果进行最终计算。
对于其他人(或将来CosmosDB支持sack()
),您可以执行以下操作:
gremlin> g.V().has('cost').
......1> sack(assign).
......2> by('cost').
......3> emit().
......4> repeat(__.in('link')).
......5> group().
......6> by('id').
......7> by(sack().sum())
==>[1:6,2:4,3:2,4:1,5:1,6:2,7:1,8:1]
由Gremlin Guru提供。