如何使用GremlinAPI在CosmosDB中进行简单的计算?

问题描述 投票:0回答:1

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

想象一下,我有一个顶点 "Person",它的属性是Age,它可以有一个边缘 "Owns "到另一个顶点 "Pet",它也有属性Age.我想知道一个给定的人是否有一只比他年轻的猫,但不超过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")'了。

我不理解这种行为。我应该怎么做才能做到'select("owner")',并且能够根据宠物的年龄来过滤宠物。

我是否有其他方法可以写这个查询?

先谢谢你

gremlin azure-cosmosdb-gremlinapi
1个回答
2
投票

类似的步骤 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.netbookPracticalGremlin.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') 
© www.soinside.com 2019 - 2024. All rights reserved.