基本的なクエリの実行

ここでは、Denodo GraphQL サービスに対してクエリを実行する手順について説明します。

フィールド

GraphQL は、オブジェクトの特定のフィールドを要求します。クエリで関連オブジェクトとそのフィールドをたどることもできるので、関連するデータを 1 回のリクエストでフェッチできます。

以下の例のクエリでは、 order オブジェクトのフィールドである order_idorder_desc 、および total_price を要求しています。また、 order ごとに、関連オブジェクトである order_detail とそのフィールド prod_idprice を取得しています。

Query for 'order' type fields

order 型のフィールドに対するクエリ

order 型のフィールドの応答
{
  "data": {
     "order": [
             {
             "order_id": 111,
             "order_desc": "Internet and phone",
             "order_detail": [
                     {
                     "prod_id": 2000,
                     "price": 60
                     },
                     {
                     "prod_id": 2020,
                     "price": 40
                     }
             ],
             "total_price": 100
             },
             {
             "order_id": 222,
             "order_desc": "Cable at discounted price",
             "order_detail": [
                     {
                     "prod_id": 2010,
                     "price": 15
                     }
             ],
             "total_price": 15
             }
      ]
  }
}

引数

GraphQL では、フィールドに引数を渡して結果を絞り込むことができます。

以下の例のクエリでは、 order_id222 である order オブジェクトのフィールド order_desctotal_price を要求しています。

Query with arguments

引数を使用したクエリ

引数を使用したクエリの応答
{
  "data": {
     "order": [
             {
             "order_desc": "Cable at discounted price",
             "total_price": 15
             }
      ]
  }
}

以下のカスタムスカラー型は、GraphQL クエリの引数として使用 できない ことに 注意 してください。

  • Array

  • Blob

  • IntervalDaySecond

  • IntervalYearMonth

  • Struct

  • Xml

別名

同じフィールドに対して異なる引数でクエリを実行する場合は、別名を使用して名前の競合を回避する必要があります。

以下の例のクエリでは、2 つのクエリの別名として first_ordersecond_order を使用しています。

Query with aliases

別名を使用したクエリ

別名を使用したクエリの応答
{
  "data": {
     "first_order": [
             {
             "order_desc": "Internet and phone",
             "total_price": 100
             }
      ],
     "second_order": [
             {
             "order_desc": "Cable at discounted price",
             "total_price": 15
             }
      ]
  }
}

フラグメント

フラグメントを使用すると、一連のフィールドを 1 回定義しておけば、必要なすべてのクエリでそれを再利用でき、フィールドを繰り返し記述する必要がなくなります。

以下の例のクエリでは、 orderFields フラグメントを定義して、 first_ordersecond_order の両方のクエリで使用しています。これは例にすぎませんが、複雑なシナリオではフラグメントが実際に効果的です。

Query with fragment

フラグメントを使用したクエリ

フラグメントを使用したクエリの応答
{
  "data": {
     "first_order": [
             {
             "order_desc": "Internet and phone",
             "total_price": 100
             }
      ],
     "second_order": [
             {
             "order_desc": "Cable at discounted price",
             "total_price": 15
             }
      ]
  }
}

変数

クエリの引数を動的にする場合は変数を使用します。同じクエリを異なる引数値で使用する場合、この方法を使用すれば、新しい GraphQL クエリを作成する代わりに、異なる変数を渡すだけで済みます。

以下の例のクエリでは、 $price が GraphQL 変数です。

Query with variables

変数を使用したクエリ

変数を使用したクエリの応答
{
  "data": {
     "order_detail": [
             {
             "order_id": 333,
             "prod_id": 2000,
             "last_updated_time": "2018-06-13 17:08:02",
             "price": 33
             },
             {
             "order_id": 333,
             "prod_id": 2010,
             "last_updated_time": "2018-06-13 17:08:02",
             "price": 33
             }
     ]
  }
}

ディレクティブ

Denodo GraphQL サービスには、仕様で必須として定義されている次の 2 つのディレクティブが用意されています。

  • @include(if: Boolean): 引数が true の場合にのみ、このフィールドを結果に追加します。

  • @skip(if: Boolean): 引数が true の場合、このフィールドを省略します。

Query with directive @include

ディレクティブ @include を使用したクエリ

ディレクティブ @include を使用したクエリの応答
{
  "data": {
     "order": [
             {
             "order_id": 111,
             "order_desc": "Internet and phone"
             },
             {
             "order_id": 222,
             "order_desc": "Cable at discounted price"
             },
             {
             "order_id": 333,
             "order_desc": "3 in one offer"
             }
     ]
  }
}