4 プロパティ・グラフのSQL DDL文

SQLデータ定義言語(DDL)文を使用して、SQLプロパティ・グラフを作成、再検証および削除できます。

4.1 SQLプロパティ・グラフの作成

CREATE PROPERTY GRAPH DDL文を使用すると、Oracle Databaseでプロパティ・グラフ・オブジェクトを直接作成できます。

例4-1 CREATE PROPERTY GRAPH DDL文を使用したSQLプロパティ・グラフの作成

この例では、グラフの基礎となるデータベース表としてpersonsuniversityfriendsおよびstudent_ofを使用して、SQLプロパティ・グラフstudents_graphを作成します。

この例を実行するには、次のことを確認してください:

  1. 「データベースでのサンプル・データの設定」の説明に従って、データベースにサンプル表を設定します。
  2. SQLプロパティ・グラフの作成に必要な権限があることを確認するには、「SQLプロパティ・グラフに対するシステム権限およびオブジェクト権限の付与」を参照してください。

次の図は、students_graphを示しています。

対応するSQLプロパティ・グラフDDL文を次に示します。

CREATE PROPERTY GRAPH students_graph
  VERTEX TABLES (
    persons KEY (person_id)
      LABEL person
        PROPERTIES (person_id, name, birthdate AS dob)
      LABEL person_ht
        PROPERTIES (height),
    university KEY (id)
  )
  EDGE TABLES (
    friends
      KEY (friendship_id)
      SOURCE KEY (person_a) REFERENCES persons(person_id)
      DESTINATION KEY (person_b) REFERENCES persons(person_id)
      PROPERTIES (friendship_id, meeting_date),
    student_of
      SOURCE KEY (s_person_id) REFERENCES persons(person_id)
      DESTINATION KEY (s_univ_id) REFERENCES university(id)
      PROPERTIES (subject)
  );

実行時に、前述の例では、スキーマの表を使用してグラフ要素表を定義するSQLプロパティ・グラフ・オブジェクトを作成します。新しいSQLプロパティ・グラフ・オブジェクトを作成すると、プロパティ・グラフ・メタデータのみが格納され、基礎となるデータベース・オブジェクトからグラフ要素表にデータがコピーされることはありません。これは、SQLプロパティ・グラフを問い合せると、データベース内の現在のグラフ・データに対してすべてのGRAPH_TABLE問合せが実行されることを意味します。十分な権限がある場合は、SQLプロパティ・グラフを含む別のスキーマを指定することもできます。

この例のグラフ定義は、次で構成されるグラフを作成します:
  • 2つの頂点グラフ要素表:
    • persons: 表には明示的に定義された一意キーperson_idがあり、次の2つのラベルに関連付けられています:
      • person: このラベルは、person_idnameおよびbirthdateをプロパティとして公開します。
      • person_ht: このラベルは、heightプロパティのみを公開します。
    • university: 表のラベルは暗黙的に推測され、デフォルトでは、基礎となるデータベース表の表示列はすべてプロパティとして公開されます。
  • 2つのエッジ・グラフ要素表:
    • friends: エッジ表は、ソースと宛先の両方の頂点表の基礎となるデータベース表としてpersonsを参照します。エッジ表のソース・キーと宛先キー(person_aおよびperson_b)は、それぞれソースと宛先の頂点表の一意キーに対応します。エッジ表のラベルは、グラフ要素表の名前(この場合はfriends)から自動的に推測され、friendship_idおよびmeeting_dateがプロパティとして公開されます。
    • student_of: エッジ表は、ソースおよび宛先の頂点表の基礎となるデータベース表としてそれぞれpersonsおよびuniversityを参照します。エッジ表のソース・キーと宛先キー(s_person_idおよびs_univ_id)は、それぞれソースと宛先の頂点表の一意キーに対応します。エッジ表のラベルは、グラフ要素表の名前(この場合はstudent_of)から自動的に推測され、subjectがプロパティとして公開されます。
SQLプロパティ・グラフの作成後は、グラフ定義を変更できないことに注意してください。ただし、CREATE PROPERTY GRAPH DDL文のOR REPLACE句を使用して、SQLプロパティ・グラフを再定義できます。この句を使用すると、以前に付与されたオブジェクト権限を削除、再作成および再付与することなく、既存のSQLプロパティ・グラフの定義を変更できます。

関連項目:

『Oracle Database SQL言語リファレンス』CREATE PROPERTY GRAPH

次の各項では、グラフ要素表、キー、ラベルおよびプロパティの概念について説明します:

4.1.1 頂点およびエッジ・グラフ要素表について

基礎となるデータベース・オブジェクトから定義されたSQLプロパティ・グラフの頂点およびエッジは、グラフ要素表に格納されます。

グラフ要素表は、頂点表またはエッジ表のいずれかです。

次の項を簡単に理解するには、例4-1のグラフ定義を参照してください:

頂点グラフ要素表

  • 頂点表は、VERTEX TABLES句を使用して定義されます。
  • 頂点表の各行は、グラフの頂点に対応します。
  • 頂点グラフ要素表には、基礎となるデータベース・オブジェクトの名前と無関係の名前があります。
  • デフォルトでは、頂点グラフ要素表の名前は基礎となるデータベース・オブジェクトの名前と同じです。
  • 頂点表名はグラフに対して一意である必要があります。同じデータベース・オブジェクトの複数のグラフ要素表を含むSQLプロパティ・グラフを定義する場合は、AS句を使用して代替グラフ要素の表名を指定する必要があります。

エッジ・グラフ要素表

  • エッジ表は、EDGE TABLES句を使用して定義されます。
  • それぞれの頂点表をREFERENCESするSOURCEおよびDESTINATIONキーワードを使用して、ソース頂点表と宛先頂点表の間の直接的な関係を指定します。
  • エッジ表の各行は、グラフのエッジに対応します。
  • エッジ・グラフ要素表には、基礎となるデータベース・オブジェクトの名前と無関係の名前があります。
  • デフォルトでは、エッジ・グラフ要素表の名前は、基礎となるデータベース・オブジェクトの名前と同じです。
  • エッジ表名はグラフに対して一意である必要があります。エッジ表名は、頂点表または別のエッジ表と共有できません。

4.1.2 頂点およびエッジ表キーについて

SQLプロパティ・グラフ定義で使用される各頂点およびエッジ表には、SQLプロパティ・グラフで一意の頂点またはエッジを識別するためのキーが必要です。

キーは、基礎となる表の1つ以上の列から定義されます。キーは、既存の主キー、または基礎となる表に定義された一意制約に基づいて暗黙的に推測することも、明示的に定義することもできます。キーは一意である必要があります。

ただし、ENFORCED MODEでグラフを作成する場合は、キー列の一意性制約が必要です。それ以外の場合は、一意性制約がないキー列を使用して、TRUSTED MODEでグラフを作成できます。グラフの作成時に適用できる様々なモードの詳細は、「グラフ・オプションを使用したSQLプロパティ・グラフの作成」を参照してください。

頂点またはエッジ表キーは、次の組込みデータ型列のいずれかに対して定義できます:

  • VARCHAR2
  • NVARCHAR2
  • NUMBER
  • BINARY_FLOAT
  • BINARY_DOUBLE
  • CHAR
  • NCHAR
  • DATE
  • INTERVAL (YEAR TO MONTHDAY TO SECONDの両方)
  • TIMESTAMP

TIMESTAMP WITH TIME ZONEデータ型はサポートされていません。

次の項を簡単に理解するには、例4-1のSQLプロパティ・グラフ定義を参照してください:

頂点表キー

  • デフォルトでは、頂点表のキーは、基礎となるデータベース・オブジェクトの単一のPRIMARY KEYまたはUNIQUEキー制約から自動的に識別されます。両方が存在する場合、PRIMARY KEY制約はUNIQUEキー制約よりも優先されます。
  • 頂点表キーが単一のUNIQUEキーに基づいて自動的に推測される場合、そのUNIQUEキーの一連の列もNOT NULLである必要があります。
  • 基礎となるデータベース・オブジェクトに一意性を強制するための一意制約が含まれていない場合は、頂点表の一意キーを定義する列を識別するために、VERTEX TABLES句にKEY副句を明示的に定義する必要があります。列名は基礎となるデータベース・オブジェクトの列名と一致する必要があります。
  • コンポジット頂点表キーもサポートされています。

エッジ表キー

  • デフォルトでは、エッジ表のキーは、基礎となるデータベース・オブジェクトの単一のPRIMARY KEYまたはUNIQUEキー制約から自動的に識別されます。両方が存在する場合、PRIMARY KEY制約はUNIQUEキー制約よりも優先されます。
  • エッジ表キーが単一のUNIQUEキーに基づいて自動的に推測される場合、そのUNIQUEキーの一連の列もNOT NULLである必要があります。
  • 基礎となるデータベース・オブジェクトに一意性を強制するための一意制約が含まれていない場合は、エッジ表の一意キーを定義する列を識別するために、EDGE TABLES句にKEY副句を明示的に定義する必要があります。列名は基礎となるデータベース・オブジェクトの列名と一致する必要があります。
  • デフォルトでは、SOURCEおよびDESTINATION表キーは、それぞれ、エッジ表と基礎となるソース表と宛先表の間にある単一のFOREIGN KEY制約から自動的に取得されます。
  • ただし、次のいずれかに該当する場合は、SOURCEおよびDESTINATION頂点表に対してKEY副句を明示的に指定する必要があります:
    • エッジと参照されている頂点表の間にFOREIGN KEY制約はありません。
    • エッジと参照される頂点表の間に複数のFOREIGN KEY制約があります。
    • エッジ表とそのソースおよび宛先の頂点表の基礎となるデータベース・オブジェクトは、マテリアライズド・ビューまたは外部表です。

ノート:

データベース・オブジェクトの主キー制約に適用されるすべての制限は、頂点およびエッジ表のキーにも適用されます。

4.1.3 ラベルとプロパティについて

ラベルを1つ以上のグラフ要素表に関連付け、グラフ定義を拡張できます。ラベルは、プロパティの有無に関係なく定義できます。

オプションで、グラフの頂点およびエッジ表に対してLABELSおよびPROPERTIESを定義できます。指定しない場合、グラフ要素表にグラフ要素表の名前を持つラベルが自動的に割り当てられ、列名をプロパティ名として使用して、すべての表示列がプロパティとして公開されます。

次の項を簡単に理解するには、例4-1のSQLプロパティ・グラフ定義を参照してください:

ラベル

  • デフォルトでは、頂点およびエッジ表には、それぞれのグラフ要素表の名前を持つラベルが自動的に割り当てられます。
  • DEFAULT LABEL副句を使用して、前述のルールを明示的に適用することもできます。
  • LABEL副句を使用して、新しいラベル名を頂点またはエッジ・グラフ要素表に明示的に割り当てることができます。
  • 同じグラフ要素表に複数のラベルを関連付けることができます。
  • 同じラベルを複数のグラフ要素表で共有できます。

    次の条件が当てはまる場合、ラベルを複数のグラフ要素表(共有ラベル)に関連付けることができます:

    • このラベルを共有するすべてのグラフ要素表は、同じプロパティ名のセットを宣言します。ラベル定義では、プロパティの順序は重要ではありません。
    • 同じプロパティ名で公開される異なる列または値式には、論理和互換の型があります。
  • また、詳細は、「プロパティ・タイプを決定するためのタイプ互換性ルール」を参照してください。

プロパティ

  • デフォルトでは、ラベル宣言がない場合、またはプロパティ・グラフ定義でDEFAULT LABEL副句が使用されている場合、頂点またはエッジ表のすべての表示列がプロパティとして自動的に公開されます。プロパティ名は、基礎となるデータベース・オブジェクトの列名と同じです。
  • Oracle組込みデータ型の列は、SQLプロパティ・グラフでラベルのプロパティとして公開できます。これには、仮想列、JSONデータ型列、CLOBおよびBLOBデータ型が含まれています。

    ただし、次はサポートされていません:

    • XMLTypeおよびSDO_GEOMETRY型の列はサポートされていません。
    • バイナリXMLとして格納されたXMLType列に対するSQL/XML値式、およびSDO_GEOMETRYオブジェクト・データ型列に対するSDO_GEOMETRY組込み関数は、プロパティでサポートされている型の値を返すかぎり許可されます。一般オブジェクト・データ型とユーザー定義データ型、およびそれらに対する対応するSQL演算子値式はサポートされません。
    • ANYTYPE型の列は、プロパティとして公開できません。
  • SQLプロパティ・グラフの作成時に、頂点またはエッジ・プロパティのデータ型は次のように決定されます:
  • ラベルの頂点またはエッジ・プロパティを明示的に定義する場合、次のプロパティ宣言がサポートされています:
    • PROPERTIES [ARE] ALL COLUMNS: グラフ要素表のすべての表示列をラベル・プロパティとして公開します。ただし、ソース・データベース・オブジェクトで列が追加または削除された場合、SQLプロパティ・グラフの作成後にこれらの列はグラフに反映されません。
    • PROPERTIES [ARE] ALL COLUMNS EXCEPT(<column_names_list>): グラフ要素表のすべての表示列を、明示的にリストされている列を除き、ラベル・プロパティとして公開します。
    • PROPERTIES(<list_of_column_names>): ラベル・プロパティとして明示的にリストされているグラフ要素表の列のみを公開します。プロパティ名はデフォルトで列名になります。
    • PROPERTIES(<column_name AS property_name,...>): 前述のオプションと同じです。ただし、AS property_namecolumn_nameに追加すると、property_nameがプロパティ名として使用されます。
    • PROPERTIES(<column_expressions AS property_name,...>): 列に対する式であるプロパティを宣言します。この場合、AS句は必須です。値式は、スカラー・データ型の列に対して定義されたSQL演算子式またはJSON式のいずれかです。JSON式の使用例については、「SQLプロパティ・グラフでのJSONのサポート」を参照してください。
    • NO PROPERTIES: ラベルの列は公開されません。
  • 疑似列は、ラベル・プロパティとして公開できません。

4.1.4 グラフ・オプションを使用したSQLプロパティ・グラフの作成

グラフ・オプションを使用して、SQLプロパティ・グラフの作成時の動作を制御できます。

グラフ・オプションは、CREATE PROPERTY GRAPH DDL文の最後にOPTIONS句を使用して指定できます。必要に応じて、MODEオプションまたはMIXED PROPERTY TYPESオプション、あるいはその両方を使用できます。

オプションを使用したグラフのモードの指定

SQLプロパティ・グラフの作成時に次のいずれかのオプション値を使用して、グラフのMODEを指定できます:
  • ENFORCED MODE: これにより、基礎となるデータベース表に一意キー制約への依存関係が確保されます。SQLプロパティ・グラフの作成時にCREATE PROPERTY GRAPH文を使用すると、次のいずれかの条件が当てはまる場合にエラーがスローされます:
    • グラフ要素表の指定された頂点またはエッジ表KEYが、NOT NULL列で定義されたPRIMARY KEYキーでもUNIQUEキーでもありません。
    • グラフ要素表に明示的な頂点またはエッジ表KEYが定義されておらず、基礎となるデータベース表のNOT NULL列に単一のPRIMARY KEYまたは単一のUNIQUEキー制約がないため、デフォルトの頂点またはエッジ・キーを自動的に識別できません。
    • 指定されたエッジ・ソース・キーおよび対応するソース頂点キー、または指定されたエッジ宛先キーおよび対応する宛先頂点キーに対して、基礎となる表の間に対応するFOREIGN KEYが存在しません。
    • エッジ表にはソースまたは宛先に対する明示的なキーがなく、エッジ表と参照されるソース(または宛先)頂点表の間に単一のFOREIGN KEY制約がないため、システムがキーを暗黙的に推測できません。

    たとえば、主キー、一意キーまたはNOT NULL制約がないデータベース内の次のt1表について考えてみます。

    SQL> CREATE TABLE t1 (id NUMBER, name VARCHAR2(10));
    
    INSERT INTO t1 (id, name) VALUES (1,'John');
    INSERT INTO t1 (id, name) VALUES (2, 'Mary');

    次のように、OPTIONS(ENFORCED MODE)を使用してSQLプロパティ・グラフを作成します:

    CREATE PROPERTY GRAPH g
       VERTEX TABLES (
          t1 KEY (id)
             LABEL t PROPERTIES ARE ALL COLUMNS
       ) OPTIONS(ENFORCED MODE);

    一意性を強制するキー制約がないため、グラフの作成は次のエラーで失敗します:

    ORA-42434: グラフ要素の表キーを定義するために使用される列は、強制モードではNULL以外である必要があります

    前のグラフ定義のKEY句を省略すると、次のエラーがスローされます:

    ORA-42402: グラフ要素表T1のキーを推測できません

  • TRUSTED MODE (デフォルト): TRUSTEDモードを使用する場合、基礎となるデータベース表に対する一意キー制約への依存関係はありません。したがって、前述の例をTRUSTEDモードで実行しても、エラーはスローされません。これは、このオプションを使用することを選択した場合、各グラフ要素表の主キーの一意性、およびエッジ表とそのソース表と宛先表の間の有効な外部キー参照を保証する必要があることを意味します。そうしないと、予想される保証が満たされないため、グラフ問合せの結果が正しくなくなる可能性があります。

共有プロパティ名に対して異なるプロパティ・タイプを許可または禁止するオプションの使用

MIXED PROPERTY TYPESオプションは、次のいずれかの値を使用して指定できます:
  • ALLOW MIXED PROPERTY TYPES: これにより、次のことが保証されます:
    • 同じ名前の2つのプロパティが異なるラベルに属している場合は、完全に異なるタイプを持つことができます。

      たとえば、サンプル表personsおよびstudentsに加えて(「データベースでのサンプル・データの設定」を参照)、次の追加表を作成します:

      CREATE TABLE t2 (id NUMBER, height VARCHAR2(4),
      CONSTRAINT t2_pk PRIMARY KEY (id));
      
      INSERT INTO t2 (id, height) VALUES (1, '1.80');
      INSERT INTO t2 (id, height) VALUES (2, '1.65');
      
      CREATE TABLE t3 (id NUMBER, height BINARY_DOUBLE,
      CONSTRAINT t3_pk PRIMARY KEY (id));
      
      INSERT INTO t3 (id, height) VALUES (1, 1.80);
      INSERT INTO t3 (id, height) VALUES (2, 1.65);

      同じプロパティ名heightに3つの異なるラベルを使用する次のCREATE PROPERTY GRAPH DDL文を実行します。

      CREATE PROPERTY GRAPH g1
         VERTEX TABLES (
            persons
              LABEL person PROPERTIES (name, height),
            t2
              LABEL t2 PROPERTIES (height),
            t3
              LABEL t3 PROPERTIES (height)
         )OPTIONS(ALLOW MIXED PROPERTY TYPES);
      グラフが作成されると、関連付けられた頂点表のheightのプロパティ・タイプは、次のようになります:
      • LABEL personFLOATです
      • LABEL t2VARCHARです
      • LABEL t3BINARY_DOUBLEです

      ただし、このグラフを問い合せる場合、heightのプロパティ・タイプは、GRAPH_TABLE問合せで使用されるラベル制約に依存します。詳細は、「ラベル・プロパティへのアクセス」を参照してください。

    • 共有ラベル内でプロパティ名を共有している場合は、すべての論理和互換型である必要があります。

      たとえば、共有ラベルt内でプロパティ名heightが使用されている次のCREATE PROPERTY GRAPH DDL文を実行します:

      CREATE PROPERTY GRAPH g2
         VERTEX TABLES (
            persons
              LABEL t PROPERTIES (height),
            t2
              LABEL t PROPERTIES (height)
         )OPTIONS(ALLOW MIXED PROPERTY TYPES);

    personsおよびt2の列heightのデータ型がそれぞれFLOATおよびVARCHARで、論理和の互換性がないため、グラフの作成が失敗します。したがって、次のエラーがスローされます:

    ORA-42414: プロパティHEIGHT (ラベルT)に複合型を使用することはできません

    ただし、FLOATおよびBINARY_DOUBLEが数値グループに属し、論理和互換であるため、次のグラフは正常に作成されます。

    CREATE PROPERTY GRAPH g3
       VERTEX TABLES (
          persons
            LABEL t PROPERTIES (height),
          t3
            LABEL t PROPERTIES (height)
       )OPTIONS(ALLOW MIXED PROPERTY TYPES);

    詳細は、「プロパティ・タイプを決定するためのタイプ互換性ルール」を参照してください。

  • DISALLOW MIXED PROPERTY TYPES (デフォルト): これにより、同じ名前のプロパティは厳密に同じデータ型である必要があります。これは、単一または複数のグラフ要素表に関連付けられているかどうかに関係なく、すべてのラベルに適用されます。

    たとえば、基礎となるデータベース表としてpersonsおよびt2を使用して、次のDDL文を実行します:

    CREATE PROPERTY GRAPH g4
       VERTEX TABLES (
          persons
            LABEL person PROPERTIES (name, height),
          t2
            LABEL t2 PROPERTIES (height)
       );

    前述のコードでは、デフォルトのDISALLOW MIXED PROPERTY TYPESグラフ・オプションが使用されるため、複合プロパティ・タイプがグラフ定義で使用されていると、エラーがスローされます:

    ORA-42414: プロパティHEIGHT (ラベルT2)に複合型を使用することはできません

次の表に、MIXED PROPERTY TYPESオプションに関する互換性ルールをまとめています

説明 許可 禁止
共有ラベルによって公開される同じ名前のプロパティ脚注1 論理和互換 型は一致することが必要です
共有プロパティ脚注2 任意 型は一致することが必要です

脚注1 同じ名前のラベルを複数のグラフ要素表に関連付けることができます。

脚注2 同じ名前のプロパティは、異なるラベルで公開できます。

4.1.5 SQLプロパティ・グラフに対するシステム権限およびオブジェクト権限の付与

Oracle Database 23cでは、SQLプロパティ・グラフに対する操作を実行するための新しいシステム権限およびオブジェクト権限が導入されています。

表4-1 SQLプロパティ・グラフ・オブジェクトのシステム権限

システム権限 説明
CREATE PROPERTY GRAPH 権限受領者のスキーマにSQLプロパティ・グラフを作成します
CREATE ANY PROPERTY GRAPH SYSおよびAUDSYS以外の任意のスキーマにSQLプロパティ・グラフを作成します
ALTER PROPERTY GRAPH 権限受領者のスキーマのSQLプロパティ・グラフを変更します
ALTER ANY PROPERTY GRAPH SYSおよびAUDSYS以外の任意のスキーマのSQLプロパティ・グラフを変更します
READ PROPERTY GRAPH 権限受領者のスキーマのSQLプロパティ・グラフを問い合せます
READ ANY PROPERTY GRAPH SYSおよびAUDSY以外の任意のスキーマのSQLプロパティ・グラフを問い合せます
SELECT PROPERTY GRAPH 権限受領者のスキーマのSQLプロパティ・グラフを問い合せます
DROP ANY PROPERTY GRAPH SYSおよびAUDSYS以外の任意のスキーマのSQLプロパティ・グラフを削除します

表4-2 SQLプロパティ・グラフのオブジェクト権限

オブジェクト権限 説明
ALTER SQLプロパティ・グラフを変更します
READ GRAPH_TABLE問合せを使用してSQLプロパティ・グラフを問い合せます
脚注3SELECT GRAPH_TABLE問合せを使用してSQLプロパティ・グラフを問い合せます

脚注3

SELECT権限は、SQLプロパティ・グラフ・オブジェクトのREAD権限とまったく同様に動作することに注意してください。これは主に、プロパティ・グラフ・オブジェクトのSQL標準との互換性のために存在します。

次に、SQLプロパティ・グラフに関連する権限の付与および取消しの例を示します。次の権限を付与および取り消すSYSDBAアクセス権があることを確認してください:

GRANT CREATE PROPERTY GRAPH, CREATE ANY PROPERTY GRAPH, 
      ALTER ANY PROPERTY GRAPH, DROP ANY PROPERTY GRAPH, 
      READ ANY PROPERTY GRAPH TO <graphuser>;
REVOKE CREATE PROPERTY GRAPH, CREATE ANY PROPERTY GRAPH, 
      ALTER ANY PROPERTY GRAPH, DROP ANY PROPERTY GRAPH, 
      READ ANY PROPERTY GRAPH FROM <graphuser>;

次のように、データベース内のSQLプロパティ・グラフを別のユーザーと共有できます。

GRANT SELECT ON PROPERTY GRAPH <graph_name> TO <schema_user>;

4.1.6 DBMS_METADATAパッケージを使用したSQL作成DDLの取得

DBMS_METADATAパッケージを使用して、SQLプロパティ・グラフの作成DDLを取得できます。

次の例では、DBMS_METADATAパッケージを使用して「SQLプロパティ・グラフの作成」で作成したグラフのDDLを表示します。

SQL> SELECT DBMS_METADATA.GET_DDL('PROPERTY_GRAPH', 'STUDENTS_GRAPH') FROM DUAL;

  CREATE PROPERTY GRAPH "GRAPHUSER"."STUDENTS_GRAPH"
  VERTEX TABLES (
   "GRAPHUSER"."PERSONS" AS "PERSONS" KEY ("PERSON_ID")
      LABEL PERSON PROPERTIES ("PERSON_ID", "NAME", "BIRTHDATE" AS "DOB")
      LABEL PERSON_HT PROPERTIES ("HEIGHT"),
   "GRAPHUSER"."UNIVERSITY" AS "UNIVERSITY" KEY ("ID")
      PROPERTIES ("ID", "NAME") )
  EDGE TABLES (
   "GRAPHUSER"."FRIENDS" AS "FRIENDS" KEY ("FRIENDSHIP_ID")
      SOURCE KEY("PERSON_A") REFERENCES PERSONS ("PERSON_ID")
      DESTINATION KEY("PERSON_B") REFERENCES PERSONS ("PERSON_ID")
     PROPERTIES ("FRIENDSHIP_ID", "MEETING_DATE"),
   "GRAPHUSER"."STUDENT_OF" AS "STUDENT_OF" KEY ("S_ID")
      SOURCE KEY("S_PERSON_ID") REFERENCES PERSONS ("PERSON_ID")
      DESTINATION KEY("S_UNIV_ID") REFERENCES PERSONS ("ID")
     PROPERTIES ("SUBJECT") )
  OPTIONS (TRUSTED MODE, DISALLOW MIXED PROPERTY TYPES)

4.1.7 SQLプロパティ・グラフの作成の制限事項

この項では、SQLプロパティ・グラフの作成時に適用されるいくつかの制限を示します。

  • ハイブリッド・パーティション表およびこれらの表から導出されたビューは、SQLプロパティ・グラフのグラフ要素表として使用できません。
  • データベース・リンク、およびこれらのリンクを使用して定義されたビューは、SQLプロパティ・グラフのグラフ要素表として使用できません。
  • オブジェクト表(CREATE TABLE x OF myObjectTypeで作成された表)およびオブジェクト・ビューは、SQLプロパティ・グラフのグラフ要素表として使用できません。
  • XMLType表(CREATE TABLE x OF XMLTYPE ...で作成された表)は、SQLプロパティ・グラフのグラフ要素表として使用できません。ただし、SQL/XML演算子(SQL値式としてプロパティを定義するためにバイナリXMLとして格納される、XMLType列に対するXMLExists()XMLCast(XMLQuery()))は、サポートされています。
  • ANYTYPE型の列は、プロパティまたはグラフ要素表のキーとして公開できません。
  • 疑似列は、プロパティまたはグラフ要素表のキーとして公開できません。
  • PL/SQL関数への呼出しを構成する列式は、プロパティとして公開できません。同様に、PL/SQL関数への呼出しを構成する列式に対して定義された仮想列は、プロパティとして公開できません。
  • SQLプロパティ・グラフはエディション化できません。
  • SQLプロパティのグラフ定義は、グラフの作成後は変更できません。ただし、CREATE PROPERTY GRAPH DDL文のOR REPLACE句を使用して、SQLプロパティ・グラフを再定義できます。
  • シャード・カタログでは、SQLプロパティ・グラフの作成はサポートされていません。ただし、ローカル・シャード内のシャード表に対してプロパティ・グラフを作成できます。

4.2 SQLプロパティ・グラフの再検証

ALTER PROPERTY GRAPH COMPILE DDL文を使用すると、データベース内の既存のプロパティ・グラフ・オブジェクトを再検証できます。

SQLプロパティ・グラフ・スキーマは、基礎となるデータベース・オブジェクトの変更によって無効になる場合があります。たとえば、グラフ定義で使用される基礎となるデータベース表に対して列を追加または削除すると、グラフが無効になる可能性があります。グラフを無効にすると、グラフ・オブジェクトに応じてカーソルも無効になります。このような場合、次の例に示すように、無効な状態からプロパティ・グラフをリカバリできます。また、「SQLプロパティ・グラフに対するシステム権限およびオブジェクト権限の付与」を参照して、ALTER PROPERTY GRAPH操作の実行に必要な権限があることを確認してください。

例4-2 SQLプロパティ・グラフの再検証

ALTER PROPERTY GRAPH students_graph COMPILE;

関連項目:

『Oracle Database SQL言語リファレンス』ALTER PROPERTY GRAPH

4.3 SQLプロパティ・グラフの削除

DROP PROPERTY GRAPH DDL文を使用すると、Oracle Databaseのプロパティ・グラフ・オブジェクトを削除できます。

SQLプロパティ・グラフの削除に必要な権限があることを確認するには、「SQLプロパティ・グラフに対するシステム権限およびオブジェクト権限の付与」を参照してください。

例4-3 SQLプロパティ・グラフの削除

次の例では、データベース内のSQLプロパティ・グラフstudents_graphを削除します。

DROP PROPERTY GRAPH students_graph;

データベース・ビューと同様に、プロパティ・グラフ・オブジェクトを削除しても、基礎となるデータベース表は削除されません。

関連項目:

『Oracle Database SQL言語リファレンス』DROP PROPERTY GRAPH

4.4 SQLプロパティ・グラフでのJSONのサポート

SQLプロパティ・グラフを作成する場合は、簡易ドット表記法を使用して、JSONデータ型列に対してラベル・プロパティを定義できます。後でGRAPH_TABLE問合せ内でこのプロパティにアクセスできます。

JSONデータ型列に対して定義されたラベル・プロパティは、次のような一般的なSQLスカラー・データ型です:
  • VARCHAR
  • NUMBER
  • BINARY_FLOAT
  • BINARY_DOUBLE
  • DATE
  • TIMESTAMP
  • .string().number().float().double().date().timestamp().binary()またはJSON_VALUE演算子を使用してSQLデータ型に変換された未加工のJSONデータ

したがって、JSONドット表記法またはJSON_VALUE演算子を使用して、JSONデータ内のスカラー値を選択し、SQLプロパティ・グラフ・ラベル・プロパティを定義できます。これは、GRAPH_TABLE問合せ内のJSONデータ型列に対して定義されたラベル・プロパティにアクセスする場合にも適用されます。

例4-4 ラベル・プロパティのJSONドット表記法およびJSON式を使用したSQLプロパティ・グラフの定義

次の例では、JSONデータ型列に対して定義されたラベル・プロパティを含むSQLプロパティ・グラフを作成します。グラフは、「データベースでのサンプル・データの設定」で定義されているサンプル・データベース表(personsおよびfriendships)を使用して作成されます。この例では、JSONドット表記法とJSON_VALUE式の両方を使用して、ラベル・プロパティを定義します。

CREATE PROPERTY GRAPH friends_graph
  VERTEX TABLES (
      persons AS p KEY (person_id)
        LABEL person
          PROPERTIES (name, birthdate AS dob,
               p.hr_data.department.string() AS "works_in",
               JSON_VALUE(person_data, '$.role') AS "works_as")
  )
  EDGE TABLES (
      friends
        KEY (friendship_id)
        SOURCE KEY (person_a) REFERENCES p(person_id)
        DESTINATION KEY (person_b) REFERENCES p(person_id)
        PROPERTIES (meeting_date)
  );

グラフが正常に作成され、次の例に示すようにグラフを問い合せることができます:

例4-5 SQLプロパティ・グラフの問合せおよびSQL/JSON式として定義されたラベル・プロパティへのアクセス

次の例では、前の例で作成したSQLプロパティ・グラフを問い合せて、JSONデータ型列に対して作成されたラベル・プロパティにアクセスします。

SELECT * FROM GRAPH_TABLE (friends_graph
  MATCH
   (a IS person) -[e IS friends]-> (b IS person)
   COLUMNS (a.name AS a,
            a."works_in" AS "a_works_in",
            e.meeting_date,
            b.name AS b)
);

問合せの出力は次のようになります。

A     a_works_in MEETING_D B
----- ---------- --------- -----
John  IT         01-SEP-00 Bob
Mary  HR         19-SEP-00 Alice
Mary  HR         19-SEP-00 John
Bob   IT         10-JUL-01 Mary

例4-6 JSONデータ型のラベル・プロパティを使用したSQLプロパティ・グラフの作成および問合せ

次の例では、JSONデータ型のラベル・プロパティを使用してSQLプロパティ・グラフを作成します:

CREATE PROPERTY GRAPH friends_graph_new
  VERTEX TABLES (
      persons AS p KEY (person_id)
        LABEL person
          PROPERTIES (name, birthdate AS dob, p.hr_data AS "p_data")
  )
  EDGE TABLES (
      friends
        KEY (friendship_id)
        SOURCE KEY (person_a) REFERENCES p(person_id)
        DESTINATION KEY (person_b) REFERENCES p(person_id)
        PROPERTIES (meeting_date)
  );

その後、次のようにJSON_VALUE式を使用してグラフを問い合せることができます:

SELECT * FROM GRAPH_TABLE (friends_graph_new
  MATCH
   (a IS person WHERE JSON_VALUE(a."p_data", '$.department') = 'IT') -[e]-> (b)
   COLUMNS (a.name AS a, 
           a."p_data".department.string() AS "a_works_in",
           a."p_data".role.string() AS "a_works_as",
           e.meeting_date,
           b.name AS b)
  );
A     a_works_in a_works_as           MEETING_D B
----- ---------- -------------------- --------- -----
John  IT         Software Developer   01-SEP-00 Bob
Bob   IT         Technical Consultant 10-JUL-01 Mary