基本的なクエリの実行¶
ここでは、Denodo GraphQL サービスに対してクエリを実行する手順について説明します。
フィールド¶
GraphQL は、オブジェクトの特定のフィールドを要求します。クエリで関連オブジェクトとそのフィールドをたどることもできるので、関連するデータを 1 回のリクエストでフェッチできます。
以下の例のクエリでは、 order
オブジェクトのフィールドである order_id
、 order_desc
、および total_price
を要求しています。また、 order
ごとに、関連オブジェクトである order_detail
とそのフィールド prod_id
と price
を取得しています。

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
}
]
}
}
複合型¶
Virtual DataPort の複合型 (array
や register
など) に由来するフィールドごとに、新しい graphql オブジェクト型が作成されます。その名前は Virtual DataPort の複合型名の前に _STRUCT__ または _ARRAY__ を付記した文字列になります (どちらになるかは、 array
と register
のどちらに由来するかで決まります)。
このようなフィールドにクエリを実行するには、取得する特定の複合型サブフィールドを指定する必要があります。これは、関連する他のオブジェクト型の場合と同様です。
以下のクエリ例では、オブジェクト struct_type
のフィールド emp_id
を要求しています。さらに、 struct_type
複合フィールドである employee` フィールドからサブフィールド name
と salary
を要求しています。

'struct_type' 型フィールドに対するクエリ¶
{
"data": {
"struct_type": [
{
"emp_id": 1,
"employee": {
"name": "John Smith",
"salary": 20090
}
},
{
"emp_id": 2,
"employee": {
"name": "Diane O'Donnell",
"salary": 32330
}
}
]
}
}
引数¶
GraphQL では、フィールドに引数を渡して結果を絞り込むことができます。
以下の例のクエリでは、 order_id
が 222
である order
オブジェクトのフィールド order_desc
と total_price
を要求しています。

引数を使用したクエリ¶
{
"data": {
"order": [
{
"order_desc": "Cable at discounted price",
"total_price": 15
}
]
}
}
以下のカスタムスカラー型は、GraphQL クエリの引数として使用 できない ことに 注意 してください。
Blob
IntervalDaySecond
IntervalYearMonth
Xml
これらのカスタムスカラー型のほか、VDP の register
データ型または array
データ型から生成された GraphQL オブジェクト型も 引数としてはサポートされていません 。
別名¶
同じフィールドに対して異なる引数でクエリを実行する場合は、別名を使用して名前の競合を回避する必要があります。
以下の例のクエリでは、2 つのクエリの別名として first_order
と second_order
を使用しています。

別名を使用したクエリ¶
{
"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_order
と second_order
の両方のクエリで使用しています。これは例にすぎませんが、複雑なシナリオではフラグメントが実際に効果的です。

フラグメントを使用したクエリ¶
{
"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 変数です。

変数を使用したクエリ¶
{
"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 の場合、このフィールドを省略します。

ディレクティブ @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"
}
]
}
}
改ページ¶
Denodo GraphQL サービスは、オフセットベースの改ページを実装しています。
クエリ order_detail(_offset:1, _first:2)
は、リストの先頭にある order_details を省略して、その次の 2 つの order_details を要求します。
改ページ引数は次のとおりです。
_offset
: 省略する結果の数_first
: フェッチする結果の数。_first
を指定していない場合、その値はquery.default-page-size
プロパティに構成した値になります。デフォルト値は1000
です。

改ページを使用したクエリ¶
{
"data": {
"order_detail": [
{
"prod_id": 2010,
"price": 33
},
{
"prod_id": 2020,
"price": 33
}
]
}
}