Oracle AI DatabaseでのGraphQLスキーマの規則

スキーマは、2つのJSON配列(「types」と「quoted」)で構成されます。

一般的なGraphQLスキーマの構造では、各リレーショナル表をGraphQL型で表し、表の列をGraphQL型のフィールドとして表します。「quoted」配列には、引用符で囲まれた表の名前が含まれています。

例2-2 GraphQLスキーマ表現のJSONスキーマ

{
  "$schema": "http://json-schema.org/draft-07/schema#",
  "type": "object",
  "properties": {
    "types": {
      "type": "array",
      "items": {
        "type": "object",
          "properties": {
            "type": {
              "type": "string"
            },
            "nullable": {
              "type": "boolean"
            },
            "quoted": {
              "type": "boolean"
            }
          }
      }
    }
    },
    "quoted": {
      "type": "array",
      "items": {
        "type": "string"
      }
    }
  },
  "required": ["types"]
}

次の図は、リレーショナル・スキーマと対応するGraphQLスキーマの間のマッピング例を示しています。ここで指定するリレーショナル・スキーマは、「カー・レース・データセットの設定」で定義されています。GraphQLスキーマは、GET_GRAPHQL_SCHEMA APIを使用して取得されます。

図2-1 リレーショナル・スキーマからGraphQLスキーマへのマッピング


この図は、リレーショナル・スキーマの様々なコンポーネントのGraphQLスキーマへのマッピングを示しています。

  • 各リレーショナル表はGraphQL型にマップされます:
    • 「カー・レース・データセットの設定」で設定したリレーショナル・スキーマの場合、GraphQLスキーマには、各リレーショナル表に対応する4つの型(それぞれteamdriverraceおよびdriver_race_map)があります。
    • GraphQL型の命名規則: リレーショナル・スキーマの引用符で囲まれていない表名に対応する型の名前は、表名と同じで、最初の文字が大文字で残りの文字が小文字になります。この図に示した例では、リレーショナル・スキーマの表名raceは、GraphQLスキーマの型Raceとして名前が付けられています。リレーショナル・スキーマの引用符で囲まれた表名は変更されません。
  • 各GraphQL型には、表の列に対応するフィールドがあります:
    • teams表には、team_idnameおよびpointsの3つの列があったことを思い出してください。
    • このため、GraphQLスキーマの型Teamsには、リレーショナル表の各列に対応する3つのフィールドがあります。
    • GraphQL型の下の各フィールドは、typenullableおよびquotedの3つのサブフィールドを含むJSONオブジェクトです。typeフィールドは列のデータ型を表します。nullableフィールドは、列にNOT NULL制約があるかどうかに応じてTRUEまたはFALSEになるブール値です。quotedフィールドもブール値であり、TRUEは列名が引用符で囲まれていることを表します。
    • GraphQL型のフィールドの命名規則:リレーショナル表の引用符で囲まれていない列名に対応するフィールドの名前は、列名と同じで、すべての文字は小文字です。前述の図では、race表の列名(race_idrace_datepodiumnameおよびlaps)が、GraphQLスキーマで同じ名前になっていることがわかります。リレーショナル表の引用符で囲まれた列名は変更されません。
  • 各GraphQL型には、その特定のリレーショナル表で参照しているか、参照されている外部キー関係をリストする追加フィールドもあります。
    • 前述の図では、driver_race_map表でdriver表のdriver_idフィールドを参照していることがわかります。この関係は、Driver型の下のフィールドとして示され、図ではdriver_race_mapとして示されています。
    • GraphQL型の外部キー・フィールドの命名規則: 小文字のフィールド名は、リレーショナル・スキーマの参照されている表名または参照している表名と同じです。列フィールドと同様に、外部キー・フィールドも、typenullableおよびquotedの3つのサブフィールドを含むJSONオブジェクトです。
    • typeサブフィールドは、参照されている表名または参照している表名と同じで、引用符なしの名前の場合、先頭の文字が大文字でその他の文字が小文字になります。
      • フィールドが、参照している表を表す場合は、typeの値を角括弧で囲みます。
      • 双方向の関係がある場合(両方の表が相互を参照する場合、または表がそれ自体を参照する場合)のフィールド名のあいまいさは、参照されている表のフィールドに「_Obj」を、参照している表のフィールドに「_List」を付加することによって解決されます。
    • サブフィールド「nullable」は、常にFALSEです。
    • quotedフィールドはブール値で、TRUEは表名が引用符で囲まれていることを表します。

ノート:

GraphQL標準では、型、フィールド、ディレクティブおよび引数の名前に英数字のASCII文字とアンダースコア(_)のみを使用でき、すべての名前で大文字と小文字が区別されます。名前はアンダースコア(_)で始まることができますが、唯一の例外は、二重アンダースコア(__)で始まる名前を使用できないことです。RDBMSでは、引用符で囲まれていない名前は大/小文字が区別されず、特殊文字(_、$、#)に加えてすべての英数字を使用できます。二重引用符(")で囲まれた名前では、大/小文字が区別され、nullは許可されません。

Oracle DBリレーショナル・スキーマのGraphQLスキーマでの規則の緩和:

  • ASCII以外の文字を使用できます。
  • 英字で始まり、大文字の英字、数字または記号(#、$、_)のみを含む引用符で囲まれた名前は、引用符なしの名前として扱われます。