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スキーマには、各リレーショナル表に対応する4つの型(それぞれ
team、driver、raceおよびdriver_race_map)があります。 - GraphQL型の命名規則: リレーショナル・スキーマの引用符で囲まれていない表名に対応する型の名前は、表名と同じで、最初の文字が大文字で残りの文字が小文字になります。この図に示した例では、リレーショナル・スキーマの表名
raceは、GraphQLスキーマの型Raceとして名前が付けられています。リレーショナル・スキーマの引用符で囲まれた表名は変更されません。
- 「カー・レース・データセットの設定」で設定したリレーショナル・スキーマの場合、GraphQLスキーマには、各リレーショナル表に対応する4つの型(それぞれ
- 各GraphQL型には、表の列に対応するフィールドがあります:
teams表には、team_id、nameおよびpointsの3つの列があったことを思い出してください。- このため、GraphQLスキーマの型
Teamsには、リレーショナル表の各列に対応する3つのフィールドがあります。 - GraphQL型の下の各フィールドは、
type、nullableおよびquotedの3つのサブフィールドを含むJSONオブジェクトです。typeフィールドは列のデータ型を表します。nullableフィールドは、列にNOT NULL制約があるかどうかに応じてTRUEまたはFALSEになるブール値です。quotedフィールドもブール値であり、TRUEは列名が引用符で囲まれていることを表します。 - GraphQL型のフィールドの命名規則:リレーショナル表の引用符で囲まれていない列名に対応するフィールドの名前は、列名と同じで、すべての文字は小文字です。前述の図では、
race表の列名(race_id、race_date、podium、nameおよびlaps)が、GraphQLスキーマで同じ名前になっていることがわかります。リレーショナル表の引用符で囲まれた列名は変更されません。
- 各GraphQL型には、その特定のリレーショナル表で参照しているか、参照されている外部キー関係をリストする追加フィールドもあります。
- 前述の図では、
driver_race_map表でdriver表のdriver_idフィールドを参照していることがわかります。この関係は、Driver型の下のフィールドとして示され、図ではdriver_race_mapとして示されています。 - GraphQL型の外部キー・フィールドの命名規則: 小文字のフィールド名は、リレーショナル・スキーマの参照されている表名または参照している表名と同じです。列フィールドと同様に、外部キー・フィールドも、
type、nullableおよびquotedの3つのサブフィールドを含むJSONオブジェクトです。 typeサブフィールドは、参照されている表名または参照している表名と同じで、引用符なしの名前の場合、先頭の文字が大文字でその他の文字が小文字になります。- フィールドが、参照している表を表す場合は、
typeの値を角括弧で囲みます。 - 双方向の関係がある場合(両方の表が相互を参照する場合、または表がそれ自体を参照する場合)のフィールド名のあいまいさは、参照されている表のフィールドに「
_Obj」を、参照している表のフィールドに「_List」を付加することによって解決されます。
- フィールドが、参照している表を表す場合は、
- サブフィールド「
nullable」は、常にFALSEです。 quotedフィールドはブール値で、TRUEは表名が引用符で囲まれていることを表します。
- 前述の図では、
ノート:
GraphQL標準では、型、フィールド、ディレクティブおよび引数の名前に英数字のASCII文字とアンダースコア(_)のみを使用でき、すべての名前で大文字と小文字が区別されます。名前はアンダースコア(_)で始まることができますが、唯一の例外は、二重アンダースコア(__)で始まる名前を使用できないことです。RDBMSでは、引用符で囲まれていない名前は大/小文字が区別されず、特殊文字(_、$、#)に加えてすべての英数字を使用できます。二重引用符(")で囲まれた名前では、大/小文字が区別され、nullは許可されません。
Oracle DBリレーショナル・スキーマのGraphQLスキーマでの規則の緩和:
- ASCII以外の文字を使用できます。
- 英字で始まり、大文字の英字、数字または記号(#、$、_)のみを含む引用符で囲まれた名前は、引用符なしの名前として扱われます。