我正在使用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")',并且能够根据宠物的年龄来过滤宠物。
我是否有其他方法可以写这个查询?
先谢谢你
类似的步骤 sum
, count
和 max
被称为减少障碍步骤。它们会导致遍历中前面发生的事情基本上被遗忘。解决这个问题的一个方法是使用一个项目步骤。由于我没有你的数据,我使用了空中航线数据集,并在你的图表中使用机场海拔作为年龄的替代品。
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')