9.1 Oracle Database表でのPGQLプロパティ・グラフの作成
PGQLのCREATE PROPERTY GRAPH文を使用すると、グラフに関するメタデータを含むビューのようなオブジェクトを作成できます。このグラフはPGQLを使用して問い合せることができます。
PGQLプロパティ・グラフは、リレーショナル・データベース表に存在するデータに対して直接作成されます。これらのグラフはデータベース表に格納されるため、スキーマがあります。
PGQLプロパティ・グラフの主な利点の1つは、データベース表に対するすべての更新がすぐにグラフに反映されることです。
PGQLプロパティ・グラフのメタデータ表
CREATE PROPERTY GRAPH
文が実行されるたびに、ユーザー独自のスキーマにメタデータ表が作成されます。
次の表では、CREATE PROPERTY GRAPH
文の実行時にグラフごとに作成されるメタデータ表のセットについて説明します。
表9-1で下線が付いているすべての列は、表の主キーの一部です。また、すべての列にNOT NULL
制約があります。
表9-1 PGQLプロパティ・グラフのメタデータ表
表名 | 説明 |
---|---|
graphName_ELEM_TABLE$ |
グラフ要素(頂点/エッジ)表のメタデータ(要素表ごとに1行):
|
graphName_LABEL $
|
要素表のラベルのメタデータ(ラベルごとに1行、要素表ごとに1ラベル):
|
graphName_PROPERTY$ |
ラベルを介して公開される列を記述するメタデータ(プロパティごとに1行)
|
graphName_KEY$ |
頂点/エッジ・キーを記述するメタデータ(キーの列ごとに1行)
|
graphName_SRC_DST_KEY$ |
エッジのソース/宛先キーを記述するメタデータ(キーの列ごとに1行):
ノート: 現在、サポートされているのはSOURCE KEY ( ... ) REFERENCES T1 のみです。そのため、エッジのソース/宛先キーのみが格納されます。
|
例9-1 PGQLプロパティ・グラフを作成するには
次のCREATE PROPERTY GRAPH
文について考えます。
CREATE PROPERTY GRAPH student_network
VERTEX TABLES(
person
KEY ( id )
LABEL student
PROPERTIES( name ),
university
KEY ( id )
PROPERTIES( name )
)
EDGE TABLES(
knows
key (person1, person2)
SOURCE KEY ( person1 ) REFERENCES person (id)
DESTINATION KEY ( person2 ) REFERENCES person (id)
NO PROPERTIES,
person AS studentOf
key (id, university)
SOURCE KEY ( id ) REFERENCES person (id)
DESTINATION KEY ( university ) REFERENCES university (id)
NO PROPERTIES
)
OPTIONS (PG_PGQL)
OPTIONS
句を使用すると、PGQLプロパティ・グラフを作成できます。単純にCREATE PROPERTY GRAPH
文をexecute
メソッドに渡す必要があります。
ノート:
- RDBMS Java APIまたはSQLclを使用して、PGQLプロパティ・グラフを作成できます。
- グラフ・ビジュアライゼーション・ツールまたはSQLclを使用して、PGQLプロパティ・グラフを問い合せることができます。
stmt.execute("CREATE PROPERTY GRAPH student_network ...");
これにより、次のメタデータ表が作成されます。
SQL> SELECT * FROM STUDENT_NETWORK_ELEM_TABLE$;
ET_NAME ET_TYPE SCHEMA_NAME TABLE_NAME
--------------- ---------- --------------- ---------------
PERSON VERTEX SCOTT PERSON
UNIVERSITY VERTEX SCOTT UNIVERSITY
KNOWS EDGE SCOTT KNOWS
STUDENTOF EDGE SCOTT PERSON
SQL> SELECT * FROM STUDENT_NETWORK_LABEL$;
LABEL_NAME ET_NAME ET_TYPE
--------------- --------------- ----------
STUDENT PERSON VERTEX
UNIVERSITY UNIVERSITY VERTEX
KNOWS KNOWS EDGE
STUDENTOF STUDENTOF EDGE
SQL> SELECT * FROM STUDENT_NETWORK_PROPERTY$;
PROPERTY_NAME ET_NAME ET_TYPE LABEL_NAME COLUMN_NAME
--------------- --------------- ---------- --------------- ---------------
NAME PERSON VERTEX STUDENT NAME
NAME UNIVERSITY VERTEX UNIVERSITY NAME
SQL> SELECT * FROM STUDENT_NETWORK_KEY$;
COLUMN_NAME COLUMN_NUMBER KEY_TY ET_NAME
--------------- ------------- ------ ---------------
ID 1 VERTEX PERSON
ID 1 VERTEX UNIVERSITY
PERSON1 1 EDGE KNOWS
PERSON2 2 EDGE KNOWS
ID 1 EDGE STUDENTOF
UNIVERSITY 2 EDGE STUDENTOF
SQL> SELECT * FROM STUDENT_NETWORK_SRC_DST_KEY$;
ET_NAME VT_NAME KEY_TYPE ET_COLUMN_NAME ET_COLUMN_NUMBER
--------------- ---------- ---------------- --------------- ----------------
KNOWS PERSON EDGE_SOURCE PERSON1 1
KNOWS PERSON EDGE_DESTINATION PERSON2 1
STUDENTOF PERSON EDGE_SOURCE ID 1
STUDENTOF UNIVERSITY EDGE_DESTINATION UNIVERSITY 1
student_network
PGQLプロパティ・グラフでPGQL問合せを実行できるようになりました。
PGQLプロパティ・グラフを作成、問合せおよび削除する方法の詳細は、PGQLプロパティ・グラフ・ビューに対するPGQL問合せの実行を参照してください。
- PGQLプロパティ・グラフのメタデータの取得
PGQL問合せで組込みPROPERTY_GRAPH_METADATA
グラフを使用して、データベースに作成されたPGQLプロパティ・グラフのメタデータを取得できます。 - PGQLプロパティ・グラフの操作権限
PGQLプロパティ・グラフの操作に必要な権限について学習します。
親トピック: PGQLプロパティ・グラフについて
9.1.1 PGQLプロパティ・グラフのメタデータの取得
PGQL問合せで組込みPROPERTY_GRAPH_METADATA
グラフを使用して、データベースに作成されたPGQLプロパティ・グラフのメタデータを取得できます。
PROPERTY_GRAPH_METADATA
グラフ構造(プロパティを含む)を次に示します。
前述のメタデータ・グラフの設計を次に記述します。
PROPERTY_GRAPH -[:HAS_VERTEX_TABLE]-> VERTEX_TABLE
-[:HAS_EDGE_TABLE]-> EDGE_TABLE
VERTEX_TABLE -[:HAS_KEY_COLUMN]-> KEY_COLUMN
-[:HAS_LABEL]-> LABEL
EDGE_TABLE -[:HAS_KEY_COLUMN]-> KEY_COLUMN
-[:HAS_LABEL]-> LABEL
-[:HAS_SOURCE_TABLE]-> VERTEX_TABLE
-[:HAS_DESTINATION_TABLE]-> VERTEX_TABLE
LABEL -[:HAS_PROPERTY]-> PROPERTY
PGQL問合せでPROPERTY_GRAPH_METADATA
を使用するときは、次の点に注意してください。
- PGQL問合せで初めてアクセスしようとすると、
PROPERTY_GRAPH_METADATA
グラフが自動的に作成され、更新されます。 PROPERTY_GRAPH_METADATA
グラフはPGQLプロパティ・グラフに類似しており、その構造を記述するメタデータ表の独自のセットがあります。表9-1で説明されているPGQLプロパティ・グラフのメタデータ表に加えて、PROPERTY_GRAPH_METADATA
のグラフ・データも、次の表に示すデータベース・オブジェクトに格納されます。表9-2 その他のメタデータ表
表名 説明 PROPERTY_GRAPH_METADATA_GRAPH_LIST$
現在のユーザーがアクセスできるPGQLプロパティ・グラフのリストを説明するメタデータ表 PROPERTY_GRAPH_METADATA_EDGE_KEY_COLUMNS$
エッジ・キー列を説明するメタデータ表 PROPERTY_GRAPH_METADATA_EDGE_LABELS$
エッジ・ラベルを説明するメタデータ表 PROPERTY_GRAPH_METADATA_EDGE_TABLES$
エッジ表を説明するメタデータ表 PROPERTY_GRAPH_METADATA_LABEL_PROPERTIES$
頂点およびエッジ・ラベルのプロパティを説明するメタデータ表 PROPERTY_GRAPH_METADATA_LABELS$
頂点およびエッジ・ラベルを説明するメタデータ表 PROPERTY_GRAPH_METADATA_VERTEX_KEY_COLUMNS$
頂点キー列を説明するメタデータ表 PROPERTY_GRAPH_METADATA_VERTEX_LABELS$
頂点ラベルを説明するメタデータ表 PROPERTY_GRAPH_METADATA_VERTEX_TABLES$
頂点表を説明するメタデータ表 ノート:
PROPERTY_GRAPH_METADATA
グラフのメタデータ表のいずれかを変更または削除しないことが重要です。- Java APIを使用してPGQL問合せを実行する場合は、JDBC接続で自動コミットを無効(
conn.setAutoCommit(false)
)にする必要があります。これにより、必ずPROPERTY_GRAPH_METADATA
グラフが自動的に作成されます。
次の例に、PGQL問合せでPROPERTY_GRAPH_METADATA
を使用して必要なメタデータを取得する方法を示します。
次のように、アクセス権があるグラフのリストを取得できます。
opg4j> String pgql =
...> "SELECT g.graph_name "
...> +"FROM MATCH (g:property_graph) ON property_graph_metadata "
...> +"ORDER BY g.graph_name"
pgql ==> "SELECT g.graph_name FROM MATCH (g:property_graph) ON property_graph_metadata ORDER BY g.graph_name"
opg4j> pgqlStmt.executeQuery(pgql).print()
String pgql = "SELECT g.graph_name "+
"FROM MATCH (g:property_graph) ON property_graph_metadata "+
"ORDER BY g.graph_name";
PgqlResultSet rs = pgqlStmt.executeQuery(pgql);
rs.print();
>>> pgql = '''
... SELECT g.graph_name
... FROM MATCH (g:property_graph) ON property_graph_metadata
... ORDER BY g.graph_name
... '''
>>> pgql_statement.execute_query(pgql).print()
実行すると、前述の問合せによって次の結果が生成されます。
+------------------------+
| GRAPH_NAME |
+------------------------+
| BANK_GRAPH_VIEW |
| FINANCIAL_TRANSACTIONS |
| FRIENDS |
+------------------------+
次のように、グラフの頂点プロパティを取得できます。
opg4j> String pgql =
...> "SELECT p.property_name "
...> +"FROM MATCH(g:property_graph)-[:has_vertex_table]->(v)-[:has_label]->(l:label)-[:has_property]->(p:property) "
...> +"ON property_graph_metadata "
...> +"WHERE g.graph_name = 'FRIENDS' "
pgql ==> "SELECT p.property_name FROM MATCH(g:property_graph)-[:has_vertex_table]->(v)-[:has_label]->(l:label)-[:has_property]->(p:property) ON property_graph_metadata WHERE g.graph_name = 'FRIENDS' "
opg4j> pgqlStmt.executeQuery(pgql).print()
String pgql = "SELECT p.property_name "+
"FROM MATCH(g:property_graph)-[:has_vertex_table]->(v)-[:has_label]->(l:label)-[:has_property]->(p:property) "+
"ON property_graph_metadata "+
"WHERE g.graph_name = 'FRIENDS' ";
PgqlResultSet rs = pgqlStmt.executeQuery(pgql);
rs.print();
>>> pgql = '''
... SELECT p.property_name
... FROM MATCH(g:property_graph)-[:has_vertex_table]->(v)-[:has_label]->(l:label)-[:has_property]->(p:property)
... ON property_graph_metadata
... WHERE g.graph_name = 'FRIENDS'
... '''
>>> pgql_statement.execute_query(pgql).print()
実行すると、前述の問合せによって次の結果が生成されます。
+---------------+
| PROPERTY_NAME |
+---------------+
| BIRTHDATE |
| HEIGHT |
| NAME |
+---------------+
9.1.2 PGQLプロパティ・グラフの操作権限
PGQLプロパティ・グラフの操作に必要な権限について学習します。
PGQLプロパティ・グラフを作成するには、次の権限があることを確認します。
CREATE SESSION
CREATE TABLE
これらの権限は、ユーザーに直接付与できます。
GRANT CREATE SESSION, CREATE TABLE TO <graphuser>
または、適切なロールを介して間接的に付与することもできます。
GRANT CREATE SESSION, CREATE TABLE TO GRAPH_DEVELOPER
別のユーザーが作成したPGQLプロパティ・グラフをグラフ・サーバー(PGX)にロードするには、次のものが必要です。