【问题标题】:How do I simple calculations in CosmosDB using GremlinAPI如何使用 Gremlin API 在 Cosmos DB 中进行简单计算
【发布时间】:2020-06-05 13:26:07
【问题描述】:

我正在使用带有 GremlinAPI 的 CosmosDB,即使 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")' 了。

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

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

提前谢谢你

【问题讨论】:

    标签: gremlin azure-cosmosdb-gremlinapi


    【解决方案1】:

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

    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') 
    

    【讨论】:

    • 感谢您的回答。我想根据投影值过滤人员/机场。在航线示例中,我想查看给定机场是否连接到海拔低于原始机场但不超过 10 米的另一个机场。你能给我一个这样的查询示例吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多