9 JSONリレーショナル二面性ビューに使用されるGraphQLの言語

GraphQLは、様々なデータベースで使用できるオープンソースの汎用問合せ言語かつデータ操作言語です。JSONリレーショナル二面性ビューを作成するために、Oracle Databaseでは、GraphQLの構文および操作のサブセットがサポートされています。

この章では、GraphQLのサポートされるサブセットについて説明します。「GraphQLを使用したカーレース二面性ビューの作成」で説明されていない構文および機能について紹介します。ここでは、GraphQLを使用した二面性ビューの作成の簡単な例をいくつか示します。

GraphQLを使用した二面重ビューの作成でサポートされているOracle構文は、GraphQL仕様(2021年10月)のセクションB.1、B.2およびB.3で指定されているGraphQLの適切なサブセットです。ただし、ユーザーが指定した名前は、ここで指定するOracle固有のルールを満たす必要があります。

Oracle GraphQL構文には、JSONリレーショナル二面性ビューでの使用を容易にするための追加のオプション機能もあります。GraphQLをプログラムで使用する必要があり、標準のGraphQL構文の使用を続ける場合、これを実行できます。その必要がない場合は、オプションの構文機能が便利なことがあります。

GraphQLをよく理解している読者の場合、サポートされている言語のサブセットには、次の標準のGraphQL構文は含まれていません:

  • ミューテーションとサブスクリプション。サポートされる操作は問合せのみです。

  • インライン・フラグメント。事前定義済のFragmentSpread構文のみがサポートされています。

  • 型定義(型インタフェース、共用体、列挙型、入力オブジェクト、および型拡張)。GraphQLオブジェクトおよびスカラーの型定義のみがサポートされています。

  • 変数定義。

GraphQLを使用して二面性ビューを定義すると、SQLを使用して定義するよりも利点があります。これについては、「GraphQLを使用したカーレース二面性ビューの作成」で説明します。要約すると、GraphQL構文はより単純で冗長性が低くなります。JSON生成副問合せの結果間の明示的な結合を使用して、サポートされているドキュメントとその部分の形式を記述する必要があると、煩雑でエラーが発生しやすくなります。

Oracle GraphQLの二面性ビューのサポートには、次の構文拡張および簡略化が含まれています:

  1. スカラー型

    Oracle Databaseでは、Oracle JSON言語のスカラー型およびSQLのスカラー型に対応する追加のGraphQLスカラー型がサポートされています。「Oracle GraphQLスカラー型」を参照してください。

  2. 暗黙的なGraphQLフィールド別名

    GraphQLフィールド名には、前に別名とコロン(:)を付けることができます。二面性ビュー定義における別名未指定のGraphQLフィールド名は、自動的に、実際のGraphQLフィールド名の別名と見なされます。実際に、これは、二面性ビューでサポートされるドキュメントのフィールド名に対応する、大文字と小文字を区別する照合を行うための簡潔な方法です。「暗黙的なGraphQLフィールド別名」を参照してください。

  3. 二面性ビュー用GraphQLディレクティブ

    Oracle GraphQLには、二面性ビューの定義時に特定の処理を指定するディレクティブ(@link@[un]nest@flex@generatedおよび@hidden)が用意されています。「JSONリレーショナル二面性ビュー用のOracle GraphQLディレクティブ」を参照してください。

  4. 二面性ビュー定義のGraphQL名

    二面性ビュー定義で使用する表および列の名前が標準のGraphQLフィールド名として直接使用できる場合は、そのまま使用されます。たとえば、カーレースの二面性ビューの場合です。

    一般的に、二面性ビュー定義では、(1) JSONフィールド名、(2) GraphQL型とフィールド名、(3) SQL表と列名の間のマッピングを指定します。最初の2つは大/小文字が区別されますが、引用符なしのSQL名は大/小文字が区別されません。また、名前で許可される文字は、GraphQLとSQLで異なります。

    このような理由から、Oracleは、二面性ビュー定義で許可される引用符なしのGraphQL名を緩和および拡張します。

    「GraphQL二面性ビュー定義で使用される名前」を参照してください。

Oracle GraphQLスカラー型

表9-1に、Oracle JSONスカラー型およびOracle SQLスカラー型に対応する、OracleでサポートされているGraphQLスカラー型を示します。標準のGraphQL型とカスタムのOracle固有のGraphQL型の両方がリストされます。

表9-1 スカラー型: Oracle JSON、GraphQLおよびSQL

Oracle JSON言語スカラー型 GraphQLスカラー型 SQLスカラー型

binary

Binary (Oracle固有)

RAWまたはBINARY

date

Date (Oracle固有)

DATE

day-second interval

DaysecondInterval (Oracle固有)

INTERVALDAYTOSECOND

double

Float (標準GraphQL)

BINARY_DOUBLE

float

Float (標準GraphQL)

BINARY_FLOAT

timestamp

Timestamp (Oracle固有)

TIMESTAMP

vector

Vector (Oracle固有)

VECTOR

timestamp with time zone

TimestampWithTimezone (Oracle固有)

TIMESTAMPWITHTIMEZONE

year-month interval

YearmonthInterval (Oracle固有)

INTERVALYEARTOMONTH

暗黙的なGraphQLフィールド別名

二面性ビュー定義の本体は、GraphQL問合せです。GraphQLフィールド名が別名なしでその問合せで使用されている場合は、実際のGraphQLフィールド名を選択するために、大/小文字の区別なしでそれが照合されます。標準のGraphQL問合せでは、このような照合は大/小文字の区別ありです。

この便利な機能では、基本的に、別名のないフィールドに、ビュー定義で示されている大/小文字の区別で別名が付けられます。つまり、大/小文字が区別されます。別名は、サポートされているドキュメントで使用されるJSONフィールド名に直接対応します。実際のGraphQLフィールド名は、SQL表または列名から導出されます

たとえば、GraphQLフィールド名がmyfield (小文字)として定義されており、二面性ビュー作成問合せでmyFieldが使用されている場合、問合せ対象フィールドは、myField : myfieldと記述されているかのように暗黙的に処理され、そのビューでサポートされているJSONドキュメントにはmyFieldというJSONフィールドが含まれます。

GraphQL二面性ビュー定義で使用される名前

Oracleは、二面性ビュー定義で許可される引用符なしのGraphQL名を緩和および拡張します。これは、(1)二面性ビューでサポートされているJSONドキュメントのフィールド名の指定、(2) GraphQL名でのSQL識別子構文(表および列に使用)の使用を容易にするために実行されています。

GraphQL二面性ビュー定義で使用する名前のnoneにピリオド(ドット)文字(.)が含まれているか、引用符で囲む必要がある場合、対応するGraphQLスキーマはGraphQL標準に完全に準拠しています。この場合、既存のすべてのGraphQLツールと連携する必要があります。

そうでない場合は(より一般的な事例)、完全に標準に準拠しているわけではありません。JSONリレーショナル二面性ビューの作成に使用できますが、一部のGraphQLツールでは正しく動作しない可能性があります。

標準GraphQL名は、次の方法で制限されます:

  • 英数字のASCII文字とアンダースコア(_)文字のみを含めることができます。

  • 2つのアンダースコア文字(__)で始めることはできません。

SQL名に引用符を付けると、二重引用符(") (引用符、コード・ポイント34とも呼ばれる)とnull (コード・ポイント0)を除く任意の文字を含めることができます。引用符なしのSQL名には、英数字(ASCIIまたはこれ以外)、アンダースコア(_)、番号記号(#)、ドル記号($)を使用できます。完全修飾の表名にはピリオド(ドット)文字(.)が含まれ、データベース・スキーマ(ユーザー)名と表名を区切ります。

二面性ビュー定義で許可されるGraphQL名には、次のルールが適用されます。これらのルールの末尾は、完全修飾SQL表名、つまり、データベース・スキーマ(ユーザー)名、ピリオド(ドット)文字(.)およびデータベース表名の3つの部分で構成される<schema name>.<table name>という形式の名前に適用されます。その他のルールは、ドットを含まないSQL名に適用されます。

  • 引用符で囲まれたSQL名(識別子)に対応するGraphQL名は、同じ引用符で囲まれた名前です。

    たとえば、"this name"はSQLとGraphQLで同じです。

  • ASCII英数字またはアンダースコア(_)文字のみで構成される引用符なしのSQL名に対応するGraphQL名は、次の点を除いてSQL名と同じです:

    • GraphQL フィールド名は小文字です。

      たとえば、GraphQLフィールド名MY_NAMEは、SQL名my_nameに対応します。

    • GraphQL名の最初の文字は大文字です。

      たとえば、GraphQL型名My_nameは、SQL名MY_NAMEに対応します。

  • 非ASCII英数字番号記号(#)、またはドル記号($)文字を1つ以上含む引用符なしのSQL名に対応するGraphQL名は同じ名前ですが、大文字で引用符付きです。(Oracle SQLでは、このような名前は引用符で囲まれているかどうかに関係なく、大/小文字が区別されません。)

    たとえば、GraphQL名"MY#NAME$4" は、SQL名my#name$4に対応します

  • 完全修飾SQL表名に対応するGraphQL名は、形式が<schema name>.<table name>で、(1) <schema name>に対応するGraphQL名と、(2)ピリオド(ドット)文字(.)と、(3) <table name>に対応するGraphQL名を連結したものです。GraphQL名では、ドットが引用符で囲まれていないことに注意してください。

    完全修飾SQL名の例:

    • GraphQL名My_schema.Mytableは、SQL名MY_SCHEMA.MYTABLEに対応します。

    • GraphQL名"mySchema".Mytableは、SQL名"mySchema".mytableに対応します。

    • GraphQL名"mySchema"."my table"は、SQL名"mySchema"."my table"に対応します。

    • GraphQL名"Schema#3.Table$4"は、SQL名SCHEMA#3.TABLE$4に対応します。

_________________________________________________________

関連項目:

Graph QL