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は、列
id
、name
が含まれる表です。新しい口座ごとに、この表に行が追加されます。 - BANK_TXNSは、列
txn_id
、from_acct_id
、to_acct_id
、description
および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プロパティ・グラフの作成 |
- BASE_GRAPHS句を使用したPGQLプロパティ・グラフの作成
既存のPGQLプロパティ・グラフのリストを指定することで、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
が作成されているとします:
BASE GRAPHS
句を使用すると、次に示すように、前述の両方のグラフ間の関係を確立することで、新しいPGQLプロパティ・グラフを作成できます:
social_network
グラフおよびbank_transactions
グラフに基づいてこの新しいグラフを取得するには:
BASE GRAPHS
句で、2つのグラフの名前social_network
およびbank_transactions
を指定します。ベース・グラフが現在のスキーマに存在しない場合、ユーザーはスキーマ名を指定する必要があります。social_network
グラフのKnows
エッジを削除します。これを行うには、ALL ELEMENT TABLES EXCEPT
句を使用して、そのエッジのtable_name
を指定します。または、ELEMENT TABLES
句を使用して、2つの表(Persons
およびCompanies
)のみを指定できます。bank_transactions
グラフのAccounts
頂点とsocial_network
グラフのPersons
頂点の間に新しいエッジを作成します。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 )
親トピック: PGQLを使用したプロパティ・グラフの作成