JSONリレーショナル二面性ビューのQBE

Oracle AI Databaseでは、GraphQLのQuery-By-Example (QBE)は、明示的な述語ロジックではなく、例の値を指定することで、問合せ内でフィルタを指定するメカニズムを提供します。

QBEを使用すると、ユーザーは馴染みのあるフィールドと値のペアを使用して選択基準を作成できます。この選択基準はシステムで自動的に解釈され、SQLのWHERE句と同様に適切なフィルタリング操作に変換されます。

OracleのGraphQL実装では、QBE式はcheck句を介して提供されます。各述語は、フィールド(列の別名)、QBE演算子(_eq_lt_likeなど)および対応する比較値の指定により形成されます。この設計により、等価性、比較、パターン一致、nullチェックなどの幅広い条件の式に加え、_and_orなどの演算子を使用した論理的な組合せも可能になります。

ノート:

Oracle Database Support for GraphQLの問合せは、リレーショナル、論理および項目メソッドのQBE演算子の包括的なセットを提供します。サポートされているGraphQL QBE演算子の完全なリストおよび詳細な例は、Oracle Database Support for GraphQL開発者ガイドOracleのGraphQL QBEを参照してください。このトピックで示す例は、JSONリレーショナル二面性ビューに関連するシナリオに特に焦点を当てています。

ここでは、check句内で_eq QBE演算子を使用して、teamの名前Ferrariと等しいことを確認する例を示します:

例9-9 二面性ビュー作成構文でのGraphQL _eq QBE演算子の使用

CREATE OR REPLACE JSON RELATIONAL DUALITY VIEW team_ferrari_dv AS
team (check: {
    name: {_eq: "Ferrari"}
}) @insert @update @delete {
    _id: team_id
    name: name
    points: points 
    driver: driver @insert @update {
        driverId: driver_id
        name: name
        points: points
    }
};

次に、二面性ビュー作成構文を使用した_gt (より大きい) QBE演算子の使用を示す別の例を示します:

例9-10 二面性ビュー作成構文でのGraphQL _gt QBE演算子の使用

CREATE OR REPLACE JSON RELATIONAL DUALITY VIEW valid_race_dv AS
race (check: {
    laps: {_gt: 50}
}) @insert @update @delete {
    _id: race_id
    name: name
    laps: laps
    date: race_date
    podium: podium
};
この例では、Bahrain Grand PrixとAustralian Grand Prixのドキュメントのみが表示されます。Saudi Grand Prixに対応するドキュメントは、_gt:50 QBE演算子で除外されるため含まれません。前述の二面性ビュー作成構文でcheckオプションが有効になっているため、次のDMLはQBEで指定された条件に厳密に従います。たとえば、二面性ビューvalid_race_dvへの次の挿入は、check句のQBE演算子で指定されているように、lapsフィールドが55より大きいため有効です:
INSERT INTO valid_race_dv VALUES ('
{
    "_id"   : 204,
    "name"   : "Miami Grand Prix",
    "laps"   : 55,
    "date"   : "2022-04-16T00:00:00",
    "podium" : {}
}
');
一方、55未満のlaps値を更新しようとすると、次のようになります:
UPDATE valid_race_dv dv SET data =  JSON('
{
    "_id"   : 204,
    "name"   : "Miami Grand Prix",
    "laps"   : 49,
    "date"   : "2022-04-16T00:00:00",
    "podium" : {}
}
') WHERE dv.data."_id" = 204;
lapsフィールドの値がQBE条件を満たしていないため、このDML更新操作は、次のようにエラーになります:
*
ERROR at line 1:
ORA-42692: Cannot update JSON Relational Duality View 'F1_DV'.'VALID_RACE_DV': 
Error while updating table 'RACE' 
ORA-01402: view WITH CHECK OPTION where-clause violation 

論理QBE演算子_andを使用して、複数の条件を組合せできます。次の例では、有効なレースを格納する二面性ビューを作成します(laps>=51かつlaps<=57):

例9-11 二面性ビュー作成構文でのGraphQL _およびQBE演算子の使用


CREATE OR REPLACE JSON RELATIONAL DUALITY VIEW valid_race_dv AS
race (check: {
    _and: [
        {laps: {_gte: 51}},
        {laps: {_lte: 57}}
    ]
}) {
    _id: race_id
    name
    laps
    date: race_date
    podium
};