首页 > 解决方案 > 如何使用 GremlinAPI 在 CosmosDB 中进行简单计算

问题描述

我正在使用带有 GremlinAPI 的 CosmosDB,即使 CosmosDB 不支持数学步骤,我也想执行简单的计算。

想象一下,我有一个具有属性 Age 的顶点“Person”,它可以与另一个也具有属性 Age 的顶点“Pet”有一条边“Owns”。我想知道某个人是否有一只比这个人年轻但不超过 10 岁的猫。

查询(我知道这只是其中的一部分,但这是我的问题所在)

g.V().hasLabel("Person").has("Name", "Jonathan Q. Arbuckle").as("owner").values("age").inject(-10).sum().as("minAge").select("owner")

返回一个空结果,但

g.V().hasLabel("Person").has("Name", "Jonathan Q. Arbuckle").as("owner").values("age").inject(-10).as("minAge").select("owner")

返回选定的所有者。似乎如果我在查询中执行 sum() 或 count(),那么我不能再执行 'select("owner")' 了。

我不明白这种行为。我应该怎么做才能执行“选择(“所有者”)”并能够根据宠物的年龄过滤宠物。

还有其他方法可以编写此查询吗?

先感谢您

标签: gremlinazure-cosmosdb-gremlinapi

解决方案


和之类sum的步骤被称为减少障碍步骤。它们导致遍历中较早发生的事情基本上被遗忘。解决此问题的一种方法是使用项目步骤。由于我没有您的数据,因此我使用了航线数据集并使用机场海拔来代替您图表中的年龄。countmax

gremlin> g.V(3).
           project("elev","minelev","city").
             by("elev").
             by(values("elev").inject(-10).sum()).
             by("city")

==>[elev:542,minelev:532,city:Austin]

我在这里写了一些关于减少障碍步骤的笔记:http: //kelvinlawrence.net/book/PracticalGremlin.html#rbarriers

更新

如果您想找到海拔小于起始机场不超过 10 的机场并避免该math步骤,您可以使用此公式。

g.V(3).as('a').
  project('min').by(values('elev').inject(-10).sum()).as('p').
  select('a').
  out().
  where(lt('a')).by('elev').
  where(gt('p')).by('elev').by('min') 

推荐阅读