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プロパティ・グラフの作成
任意のプロパティ式にマップされた頂点およびエッジ・プロパティを持つ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 ::= IdentifierBASE 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を使用したプロパティ・グラフの作成
13.1.2 任意のプロパティ式を使用したPGQLプロパティ・グラフの作成
任意のプロパティ式にマップされた頂点およびエッジ・プロパティを持つPGQLプロパティ・グラフを作成できます。
たとえば、次のデータ例で考えてみます。表には、JSON列としてemp_dtlsが含まれています。
CREATE TABLE emp_data (
emp_id NUMBER GENERATED ALWAYS AS IDENTITY (START WITH 1 INCREMENT BY 1),
emp_dtls JSON,
CONSTRAINT emp_pk PRIMARY KEY (emp_id));
INSERT INTO emp_data (emp_dtls)
VALUES ('{"name":"John","department":"IT","role":"Software Developer"}');
INSERT INTO emp_data (emp_dtls)
VALUES ('{"name":"Mary","department":"HR","role":"HR Manager"}');
INSERT INTO emp_data (emp_dtls)
VALUES ('{"name":"Bob","department":"IT","role":"Technical Consultant"}');
INSERT INTO emp_data (emp_dtls)
VALUES ('{"name":"Alice","department":"HR","role":"HR Assistant"}');ここで、JSON_VALUE関数を使用して、JSONデータにマップされた頂点およびエッジ・プロパティを持つPGQLプロパティ・グラフを作成できます。
CREATE PROPERTY GRAPH g
VERTEX TABLES (
emp_data PROPERTIES (
JSON_VALUE(emp_dtls, '$.name') AS name,
JSON_VALUE(emp_dtls, '$.department') AS department,
JSON_VALUE(emp_dtls, '$.role') AS role)
) OPTIONS(PG_PGQL)最後に、グラフの頂点およびエッジ・プロパティを次のように問い合せることができます:
SELECT *
FROM GRAPH_TABLE ( g
MATCH (n IS emp_data)
COLUMNS (n.name, n.department, n.role) )問合せの出力は次のようになります。
+-------------------------------------------+
| NAME | DEPARTMENT | ROLE |
+-------------------------------------------+
| John | IT | Software Developer |
| Mary | HR | HR Manager |
| Bob | IT | Technical Consultant |
| Alice | HR | HR Assistant |
+-------------------------------------------+親トピック: PGQLを使用したプロパティ・グラフの作成


