GraphQL中对聚合函数的支持

GraphQL中对聚合函数的支持,graphql,Graphql,我对GraphQL的分析解决方案非常感兴趣(想想一个显示图形的webapp)。但我找不到任何使用聚合函数的GraphQL示例。这是我的前端完成的大多数查询的一个主要方面 对于我的解决方案,我们有3个典型的后端调用 搜寻 聚合 时间序列 假设我们在GraphQL中指定了这种类型 type Person { name: String age: Int create_time: Date } 搜寻 GraphQL似乎很好地处理了这一点。毫无疑问 例:名为Bob的人的搜索年龄 { 人员(姓

我对GraphQL的分析解决方案非常感兴趣(想想一个显示图形的webapp)。但我找不到任何使用聚合函数的GraphQL示例。这是我的前端完成的大多数查询的一个主要方面

对于我的解决方案,我们有3个典型的后端调用

  • 搜寻
  • 聚合
  • 时间序列
  • 假设我们在GraphQL中指定了这种类型

    type Person {
      name: String
      age: Int
      create_time: Date
    }
    
  • 搜寻
  • GraphQL似乎很好地处理了这一点。毫无疑问

    例:名为Bob的人的搜索年龄 { 人员(姓名:“鲍勃”){ 年龄 } }

  • 聚合
  • 这是我希望在饼图中显示信息的典型情况。假设我想按年龄统计人数

    以下是PostgreSQL查询:

    SELECT age, count(*) from Ticket group by age;
    
    SELECT date_trunc('hour', create_time) as create_time_bin, count(*) from Person group by create_time_bin order by create_time_bin ASC;
    
    GraphQL中的等价物是什么

  • 时间序列 这是一个典型的例子,我想在条形图中显示信息,X轴为时间
  • 比方说,我想计算每小时创建的用户数

    以下是PostgreSQL查询:

    SELECT age, count(*) from Ticket group by age;
    
    SELECT date_trunc('hour', create_time) as create_time_bin, count(*) from Person group by create_time_bin order by create_time_bin ASC;
    

    什么是GraphQL等价查询?

    GraphQL在一天结束时会用您定义的类型进行响应。您只需要将该数据放入一个类型中。无论这是这些不同查询的特定类型,还是现有类型上数据的字段,都取决于您,但归根结底就是这些。GraphQL确实需要在定义类型和所有查询返回的内容方面付出更多的努力,这使得它更加严格,但其思想是,在另一方面存在一些很酷的特性,比如内省和类型检查。如果将这种“特殊”数据结构放入GraphQL类型似乎没有逻辑意义,那么如果您需要其他数据源,使用非GraphQL端点并不违法。

    @Damien,这些问题不是GraphQL的问题

    每当您想在GraphQL中执行某项操作时,您必须定义返回数据的类型、实现的函数的规范,有时还必须定义输入数据的类型以输入函数。最后编写代码来完成这项工作

    事实上,看起来您(重新)使用GraphQL语言编写代码

    以要在饼图中显示信息的示例为例:

    SELECT age, count(*) from Ticket group by age;
    
    定义退货数据此处是年龄和计数列表:

     type TickGroupByAge {
          age: Int
          count: Int
        }
    
    用GraphQL语言定义函数或查询:

    getTicketGroupByAge : [TickGroupByAge]`
    
    最后编写一个函数来实现上述查询:

    async function(){
        const res = await client.query("SELECT age, count(*) from Ticket group by age");
        return res.rows;
    }
    
    @Ryan我完全同意您的看法,GraphQL迫使您编写大量类型定义来解决一个简单的任务。出于这个原因,我最终构建了自己的类似于GraphQL但更简单的GraphQL

    我的项目支持复杂的嵌套类型定义,这使您不必定义许多无用的类型定义

    退房(注意:我是作者)

    与问题相关。它可用于查询和聚合来自JSON端点的数据:

    load json from "http://url/person" as l return l.age, count(1)
    
    甚至还有一个条形图功能:

    load json from "http://url/person" as l return barchart(toint(l.age)) as age_distribution
    
    下面是一个查询复杂JSON文档并对其执行聚合分析的示例:


    更不用说,如何对标量进行范围比较,比如选择*WHERE timestamp>…和timestamp<…?还是按标量对结果进行排序?我在规范中没有看到任何这些。我缺少什么?您向字段中添加的参数允许这种类型的筛选。我想我明白您的意思,但我明白这一实现的样子。@Damien,每个GraphQL查询都会由resolve()函数响应。您为查询提供的查询参数是此函数的参数。然后,resolve()函数会执行任何您想要的操作,比如从别处检索SQL查询的结果,然后您可以根据需要聚合该数据,最后将所有这些结果作为对GraphQL查询的响应返回。要点是:您应该像resolve()只是另一个返回数字的JS函数一样进行聚合。但是查询客户不需要知道或关心。作为挑剔的一方,我不认为在建议类型“TickGroupByAge”中将“Ticket”缩短为“Tick”有什么意义。它损害了可读性,字符也很便宜。