支持 GraphQL 中的聚合函数
Support of aggregate function in GraphQL
我对 GraphQL 的分析解决方案非常感兴趣(想想显示图形的网络应用程序)。但是我找不到任何使用聚合函数的 GraphQL 示例。这是我的前端完成的大部分查询的主要方面。
对于我的解决方案,我们有 3 个典型的后端调用。
- 搜索
- 汇总
- 时间序列
假设我们在 GraphQL 中指定了这种类型
type Person {
name: String
age: Int
create_time: Date
}
- 搜索
这似乎由 GraphQL 处理得很好。这里没有问题。
例如。搜索名为 Bob 的人的年龄
{
人(姓名:"Bob"){
年龄
}
}
- 汇总
这是我想在饼图中显示信息的典型案例。所以假设我想按年龄计算人数。
这是 PostgreSQL 查询:
SELECT age, count(*) from Ticket group by age;
GraphQL 中的等价物是什么?
- 时间序列
这是我想在 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 文档并对其执行聚合分析的示例:
我对 GraphQL 的分析解决方案非常感兴趣(想想显示图形的网络应用程序)。但是我找不到任何使用聚合函数的 GraphQL 示例。这是我的前端完成的大部分查询的主要方面。
对于我的解决方案,我们有 3 个典型的后端调用。
- 搜索
- 汇总
- 时间序列
假设我们在 GraphQL 中指定了这种类型
type Person {
name: String
age: Int
create_time: Date
}
- 搜索
这似乎由 GraphQL 处理得很好。这里没有问题。
例如。搜索名为 Bob 的人的年龄 { 人(姓名:"Bob"){ 年龄 } }
- 汇总
这是我想在饼图中显示信息的典型案例。所以假设我想按年龄计算人数。
这是 PostgreSQL 查询:
SELECT age, count(*) from Ticket group by age;
GraphQL 中的等价物是什么?
- 时间序列 这是我想在 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 文档并对其执行聚合分析的示例: