web-dev-qa-db-ja.com

GraphQLの集約関数のサポート

GraphQLには分析ソリューション(グラフを表示するwebappのようなもの)に非常に興味があります。しかし、集計関数を使用したGraphQLの例は見つかりません。これは、私のフロントエンドが行うほとんどのクエリの主要な側面です。

私のソリューションでは、3つの典型的なバックエンド呼び出しがあります。

  1. 探す
  2. 集計
  3. 時系列

GraphQLでこのタイプが指定されているとします

type Person {
  name: String
  age: Int
  create_time: Date
}
  1. 探す

これはGraphQLでうまく処理されているようです。ここに質問はありません。

例Bobという名前の人の検索年齢{Person(name: "Bob"){age}}

  1. 集計

これは、円グラフで情報を表示する典型的なケースです。だから私は年齢によって人の数をカウントしたいとしましょう。

PostgreSQLクエリは次のようになります。

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

GraphQLで同等のものは何ですか?

  1. 時系列これは、X軸を時間としてBarChartに情報を表示する典型的なケースです。

例1時間に作成されたユーザーの数をカウントしたいとしましょう。

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の同等のクエリは何でしょうか?

22
Damien

GraphQLは、一日の終わりに、定義されたタイプで応答します。そのデータを型に入れるだけです。これがこれらのさまざまなクエリの特定のタイプであろうと、既存のタイプのデータのフィールドであろうと、それはあなた次第ですが、それは結局のところすべてです。 GraphQLは、型とすべてのクエリが返すものを定義するという点で、より多くの労力を必要とします。これにより、より厳密になります。そのような「アドホック」データ構造をGraphQLタイプに入れることが論理的に意味をなさないようであれば、他のデータソースが必要な場合に非GraphQLエンドポイントを使用することは違法ではありません。

13
Ryan

@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を使用すると、単純なタスクを解決するために多くの型定義を作成する必要があることに完全に同意します。そのため、私は自分で NextQL-GraphQLに似たエンジン を構築しました。これはGraphQLに似ていますが、よりシンプルです。

私のプロジェクトは、複雑なネストされた型定義をサポートしています。

9
Giap Nguyen

チェックアウト 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クエリの例