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行):
  • ET_NAME: 要素表の名前(別名)
  • ET_TYPE: VERTEXまたはEDGE
  • SCHEMA_NAME: 基礎となる表のスキーマの名前
  • TABLE_NAME: 基礎となる表の名前
graphName_LABEL$ 要素表のラベルのメタデータ(ラベルごとに1行、要素表ごとに1ラベル):
  • LABEL_NAME: ラベルの名前
  • ET_NAME: 要素表の名前(別名)
  • ET_TYPE: VERTEXまたはEDGE
graphName_PROPERTY$

ラベルを介して公開される列を記述するメタデータ(プロパティごとに1行)

  • PROPERTY_NAME: プロパティの名前
  • ET_NAME: 要素表の名前(別名)
  • ET_TYPE: VERTEXまたはEDGE
  • LABEL_NAME: このプロパティが属するラベルの名前
  • COLUMN_NAME: 列の名前(最初は、プロパティ名が列名と等しいケースのみが許可されます)
graphName_KEY$

頂点/エッジ・キーを記述するメタデータ(キーの列ごとに1行)

  • COLUMN_NAME: キーの列の名前
  • COLUMN_NUMBER: キー内の列の番号

    たとえば、KEY ( a, b, c )では、aの番号は1、bの番号は2、cの番号は3です。

  • KEY_TYPE: VERTEXまたはEDGE
  • ET_NAME: 要素表の名前(別名)

graphName_SRC_DST_KEY$

エッジのソース/宛先キーを記述するメタデータ(キーの列ごとに1行):

  • ET_NAME: 常にエッジ表である要素表の名前(別名)
  • VT_NAME: 頂点表の名前
  • KEY_TYPE: EDGE_SOURCEまたはEDGE_DESTINATION
  • ET_COLUMN_NAME: キー列の名前
  • ET_COLUMN_NUMBER: キー内の列の番号

    たとえば、KEY ( a, b, c )では、aの番号は1、bの番号は2、cの番号は3です。

ノート:

現在、サポートされているのは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問合せの実行を参照してください。

9.1.1 PGQLプロパティ・グラフのメタデータの取得

PGQL問合せで組込みPROPERTY_GRAPH_METADATAグラフを使用して、データベースに作成されたPGQLプロパティ・グラフのメタデータを取得できます。

PROPERTY_GRAPH_METADATAグラフ構造(プロパティを含む)を次に示します。

図9-1 PROPERTY_GRAPH_METADATAグラフ設計

図9-1の説明が続きます
「図9-1 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)にロードするには、次のものが必要です。

  • 基礎となるソース・データベースの表またはビューに対するSELECT権限。
  • PGQLプロパティ・グラフで使用されるメタデータ表に対するSELECT権限。

    メタデータ表の詳細は、表9-1および表9-2を参照してください。