支持 GraphQL 中的聚合函数

Support of aggregate function in GraphQL

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

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

  1. 搜索
  2. 汇总
  3. 时间序列

假设我们在 GraphQL 中指定了这种类型

type Person {
  name: String
  age: Int
  create_time: Date
}
  1. 搜索

这似乎由 GraphQL 处理得很好。这里没有问题。

例如。搜索名为 Bob 的人的年龄 { 人(姓名:"Bob"){ 年龄 } }

  1. 汇总

这是我想在饼图中显示信息的典型案例。所以假设我想按年龄计算人数。

这是 PostgreSQL 查询:

SELECT age, count(*) from Ticket group by age;

GraphQL 中的等价物是什么?

  1. 时间序列 这是我想在 X 轴作为时间的条形图中显示信息的典型情况。

例如。假设我想计算每小时创建的用户数。

这是 PostgreSQL 查询:

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 在定义你的类型和所有查询将 return 方面确实需要更多的前期工作,这使得它更加严格,但想法是在另一方面有一些很酷的功能,比如内省和类型检查.如果将这种 "ad hoc" 数据结构放入 GraphQL 类型似乎没有逻辑意义,那么如果您需要其他数据源,使用非 GraphQL 端点也不是非法的。

@Damien,那些问题不是 GraphQL 的问题。

每当您想在 GraphQL 中做某事时,您必须定义 return 数据类型您实现的函数规范 ,有时 类型的输入数据 可以输入到您的函数中。最后,您编写代码来完成这项工作。

事实上,您似乎(重新)用 GraphQL 语言编写了代码。

以您想在饼图中显示信息为例:

SELECT age, count(*) from Ticket group by age;

在此处定义您的 return 数据是年龄和人数列表:

 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 迫使你编写大量类型定义来解决一个简单的任务。出于这个原因,我最终构建了自己的 NextQL - GraphQL-liked engine,它类似于 GraphQL 但更简单。

我的项目支持复杂的嵌套类型定义,让你免于定义很多无用的类型。

查看https://github.com/niclasko/Cypher.js(注:我是作者)

与问题相关。它可用于查询和聚合来自 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 文档并对其执行聚合分析的示例:

Cypher.js JSON query example