gremlin - 如何使用 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")' 了。
我不明白这种行为。我应该怎么做才能执行“选择(“所有者”)”并能够根据宠物的年龄过滤宠物。
还有其他方法可以编写此查询吗?
先感谢您
解决方案
和之类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.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')
推荐阅读
- c# - 如何将 Bouncy Castle X509Crl C# 中的 CRL 编号解析为 BigInteger
- hl7-fhir - 如何在不同元素之间使用“或”运算符?
- javascript - 我正在发出抢劫命令,但我不知道如何让它在失败时激活超时或从人身上减去硬币
- matrix - 正交 procrustes 的奇怪行为
- python - 如何使用不同数量的列制作 matplotlib 堆栈子图?
- javascript - Node.js:如何检查生成的进程是否被成功杀死
- python - 根据出现在两个文本文件中的名称将文本拆分为单独的文件
- javascript - 如何使用 webpack 从 npm build 生成的文件中注册 Vue 插件
- html - 我如何定位一个
an下的元素
- javascript - Javascript cell.innerHTML() 显示 [object HTMLDivElement]