我正在使用CosmosDB和GremlinAPI,我想执行简单的计算,即使CosmosDB不支持数学步骤。
假设我有一个属性为Age的顶点"Person“,它可以有一条边"Owns”到另一个同样具有属性Age的顶点"Pet“。我想知道一个人是否有一只比这个人年轻但不超过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")‘了。
我不理解这种行为。我应该怎么做才能进行“选择(”所有者“)”,并且能够根据宠物的年龄来过滤它们。
有没有其他方法可以写这个查询?
提前谢谢你
发布于 2020-06-06 22:29:28
像sum,count和max这样的步骤被称为减少障碍步骤。它们会导致在遍历之前发生的事情基本上被遗忘。解决此问题的一种方法是使用项目步骤。因为我没有您的数据,所以我使用了airport数据集,并在您的图表中使用了机场高度作为年龄的替代品。
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') https://stackoverflow.com/questions/62216414
复制相似问题