13.1 PGQLを使用したプロパティ・グラフの作成

CREATE PROPERTY GRAPHは、データベース表からPGQLプロパティ・グラフを作成するためのPGQL DDL文です。

CREATE PROPERTY GRAPH文は、グラフに付ける名前で始まり、その後に頂点表とエッジ表のセットが続きます。グラフには、頂点表またはエッジ表がない(空のグラフ)か、頂点表がありエッジ表はない(頂点のみでエッジなしのグラフ)か、頂点表とエッジ表の両方がある(頂点とエッジのあるグラフ)場合があります。ただし、エッジ表のみで頂点表のないグラフは指定できません。

オプションで、既存のグラフからPGQLプロパティ・グラフを作成することもできます。詳細は、「BASE_GRAPHS句を使用したPGQLプロパティ・グラフの作成」を参照してください。

ノート:

PGQLプロパティ・グラフを作成する場合は、次のベスト・プラクティスをお薦めします:

  • グラフに重複する頂点またはエッジ・キーが含まれないように、頂点またはエッジ・キーに主キー制約が存在することを確認します。
  • 頂点が欠落しているエッジがグラフに含まれないように、エッジ表と参照される頂点表の間に外部キー制約が存在することを確認します。
  • グラフの作成後にpg.validate()関数を実行して、頂点とエッジ表のキーが一意であり、エッジのソースと宛先が存在することを確認します。
    pgqlStmt.execute("CALL pg.validate('<graph_name>')")

たとえば、opt/oracle/graph/dataディレクトリのサンプル・グラフ・データを使用して作成されたbank_accountsおよびbank_txnsデータベース表について考えてみます。詳細は、「CSVファイルからのデータのインポート」を参照してください。

  • BANK_ACCOUNTSは、列idnameが含まれる表です。新しい口座ごとに、この表に行が追加されます。
  • BANK_TXNSは、列txn_idfrom_acct_idto_acct_iddescriptionおよびamountが含まれる表です。from_acct_idからto_acct_idへの新しいトランザクションごとに、この表に行が追加されます。

次のようにデータベース表を使用して、PGQLプロパティ・グラフを作成できます。

CREATE PROPERTY GRAPH bank_graph
     VERTEX TABLES(
       bank_accounts AS accounts
         KEY(id)
         LABEL accounts
         PROPERTIES (id, name)
     )
     EDGE TABLES(
       bank_txns AS transfers
         KEY (txn_id)
         SOURCE KEY (from_acct_id) REFERENCES accounts (id)
         DESTINATION KEY (to_acct_id) REFERENCES accounts (id)
         PROPERTIES (description, amount)
     ) OPTIONS (PG_PGQL)

次のグラフの概念については、データベース表をグラフにマップし、前述のPGQL DDL文を使用して説明します:

  • 頂点表: データ・エンティティが含まれる表は頂点表です(bank_accountsなど)。
    • 頂点表の各行は頂点です。
    • 頂点表の列は、頂点のプロパティです。
    • 頂点表の名前は、この頂点セットのデフォルト・ラベルです。あるいは、CREATE PROPERTY GRAPH文の一部としてラベル名を指定できます。
  • エッジ表: エッジ表は、2つの頂点表をリンクする任意の表、またはソース・エンティティからターゲット・エンティティへのアクションを示すデータを含む表です。たとえば、FROM_ACCOUNT_IDからTO_ACCOUNT_IDへの送金は自然なエッジです。
    • 外部キー関係により、データ内で関連しているリンクを知ることができます。CREATE PROPERTY GRAPHは、デフォルトで外部キー関係を使用してエッジを識別します。
    • エッジ表のプロパティの一部は、エッジのプロパティにできます。たとえば、from_acct_idからto_acct_idへのエッジには、プロパティdescriptionおよびamountを指定できます。
    • エッジ表の名前は、エッジ・セットのデフォルト・ラベルです。あるいは、CREATE PROPERTY GRAPH文の一部としてラベル名を指定できます。
  • キー:
    • 頂点表のキー: 頂点表のキーは、グラフ内の一意の頂点を識別します。キーはCREATE PROPERTY GRAPH文で指定できます。指定しない場合、デフォルトで表の主キーになります。表に重複した行がある場合は、CREATE PROPERTY GRAPH文によってエラーが返されます。
    • エッジ表のキー: エッジ表のキーは、グラフ内のエッジを一意に識別します。ソースと宛先の頂点を指定すると、KEY句はソースと宛先の頂点キーを一意に識別します。
  • 表の別名: 頂点表とエッジ表には一意の名前が付いている必要があります。同じリレーショナル表から複数の頂点表を識別したり、同じリレーショナル表から複数のエッジ表を識別する必要がある場合は、別名を使用する必要があります。たとえば、次のように、1つの表bank_accountsから2つの頂点表bank_accountsおよびaccountsを作成できます:
    CREATE PROPERTY GRAPH bank_transfers
         VERTEX TABLES (bank_accounts KEY(id)
                        bank_accounts AS accounts KEY(id))
    

    頂点表とエッジ表のいずれかが同じ名前を共有する場合は、表の別名を再度使用する必要があります。次の例では、同じ名前で参照されている頂点表があるため、エッジ表DEPARTMENTSに表の別名が使用されます。

    CREATE PROPERTY GRAPH hr
    VERTEX TABLES (
      employees KEY(employee_id)
        PROPERTIES ARE ALL COLUMNS,
      departments KEY(department_id)
        PROPERTIES ARE ALL COLUMNS
     )
    EDGE TABLES (   
      departments AS managed_by
        SOURCE KEY ( department_id ) REFERENCES departments ( department_id )
        DESTINATION employees
        PROPERTIES ARE ALL COLUMNS
     )OPTIONS (PG_PGQL)
  • プロパティ: グラフの頂点プロパティおよびエッジ・プロパティはそれぞれ、頂点表およびエッジ表の列から導出され、デフォルトでは基礎となる表の列と同じ名前になります。ただし、列ごとに異なるプロパティ名を選択できます。これは、2つの表の列名が同じでデータ型が異なる場合に競合を回避するのに役立ちます。

    次の例では、頂点プロパティidおよびnameの名前がそれぞれacct_noおよびacct_nameに変更されます。

    CREATE PROPERTY GRAPH bank_transfers
    VERTEX TABLES (
      bank_accounts AS accounts
        LABEL accounts  
        PROPERTIES (id AS acct_no, name AS acct_name)
    )
  • REFERENCES句: エッジのソースおよび宛先の頂点を、対応する頂点表に接続します。

CREATE PROPERTY GRAPH文の詳細は、PGQL Specificationを参照してください。

プロパティ・グラフの作成方法は、次の表を参照してください。

表13-1 CREATE PROPERTY GRAPH文のサポート

メソッド 詳細情報
oracle.pgx.api Javaパッケージを使用して、グラフ・サーバー(PGX)にプロパティ・グラフを作成する CREATE PROPERTY GRAPH文を実行するためのJava API
pypgx.api Pythonパッケージを使用して、グラフ・サーバー(PGX)にプロパティ・グラフを作成する CREATE PROPERTY GRAPH文を実行するためのPython API
Oracle Database表でPGQLプロパティ・グラフを作成する PGQLプロパティ・グラフの作成

13.1.1 BASE_GRAPHS句を使用したPGQLプロパティ・グラフの作成

既存のPGQLプロパティ・グラフのリストを指定することで、PGQLプロパティ・グラフを作成できます。

新しいPGQLプロパティ・グラフを作成する1つ以上の既存のPGQLプロパティ・グラフを指定するために、CREATE PROPERTY GRAPH DDL文にBASE GRAPHS句を指定できます。これにより、VERTEX TABLES句およびEDGE TABLES句を指定せずに、BASE GRAPHS句を指定できます。

CREATE PROPERTY GRAPH文のBASE GRAPHS句の構文は、次のとおりです:

CreatePropertyGraph   ::= 'CREATE' 'PROPERTY' 'GRAPH' GraphName
                           BaseGraphs?
                           VertexTables?
                           EdgeTables?
  
BaseGraphs            ::= 'BASE' 'GRAPHS' '(' BaseGraph ( ',' BaseGraph )* ')'
  
BaseGraph             ::= SchemaQualifiedName
  
ElementTablesClause   ::=   AllElementTables
                          | ElementTablesList
  
AllElementTables      ::= 'ALL' 'ELEMENT' 'TABLES' ExceptElementTables?
  
ExceptElementTables   ::= 'EXCEPT' '(' ElementTableReference ( ',' ElementTableReference )* ')'
  
ElementTablesList     ::= '(' ElementTable ( ',' ElementTable )* ')'
  
ElementTable          ::= ElementTableReference TableAlias?
  
ElementTableReference ::= Identifier

BASE GRAPHS句オプションを使用すると、別の名前を使用してグラフを複製できます。

CREATE PROPERTY GRAPH <new_graph>
  BASE GRAPHS (<old_graph>)
  OPTIONS ( PG_PGQL )

また、new_graphが作成されると、old_graphへの依存関係がないことに注意してください。これは、old_graphの更新または削除がnew_graphに影響しないことを意味します。

次のスキーマの例を考えます:

前述のスキーマから、次の2つのグラフsocial_networkおよびbank_transactionsが作成されているとします:

図13-2 スキーマの例から作成されたグラフ

図13-2の説明が続きます
「図13-2 スキーマの例から作成されたグラフ」の説明

BASE GRAPHS句を使用すると、次に示すように、前述の両方のグラフ間の関係を確立することで、新しいPGQLプロパティ・グラフを作成できます:

図13-3 Financial_Transactionsグラフ

図13-3の説明が続きます
「図13-3 Financial_Transactionsグラフ」の説明

social_networkグラフおよびbank_transactionsグラフに基づいてこの新しいグラフを取得するには:

  1. BASE GRAPHS句で、2つのグラフの名前social_networkおよびbank_transactionsを指定します。ベース・グラフが現在のスキーマに存在しない場合、ユーザーはスキーマ名を指定する必要があります。
  2. social_networkグラフのKnowsエッジを削除します。これを行うには、ALL ELEMENT TABLES EXCEPT句を使用して、そのエッジのtable_nameを指定します。または、ELEMENT TABLES句を使用して、2つの表(PersonsおよびCompanies)のみを指定できます。
  3. bank_transactionsグラフのAccounts頂点とsocial_networkグラフのPersons頂点の間に新しいエッジを作成します。
  4. bank_transactionsグラフのAccounts頂点とsocial_networkグラフのCompanies頂点の間に新しいエッジを作成します。

新しいPGQLプロパティ・グラフを作成するためのBASE GRAPHS句を含む最適化されたCREATE PROPERTY GRAPH文を次に示します:

CREATE PROPERTY GRAPH financial_transactions
  BASE GRAPHS(
    bank_transactions,
    social_network ALL ELEMENT TABLES EXCEPT ( knows )
  )
  EDGE TABLES(
    Accounts AS PersonOwner
      SOURCE KEY ( "number" ) REFERENCES Accounts ( "number" )
      DESTINATION Persons
      LABEL owner NO PROPERTIES,
    Accounts AS CompanyOwner
      SOURCE KEY ( "number" ) REFERENCES Accounts ( "number" )
      DESTINATION Companies
      LABEL owner NO PROPERTIES
  ) OPTIONS ( PG_PGQL )