6.1 readGraphByName APIを使用したSQLプロパティ・グラフのロード

SQLプロパティ・グラフをグラフ・サーバー(PGX)にロードするには、PgxSessionオブジェクトでreadGraphByName APIをコールします。

SQLプロパティ・グラフをグラフ・サーバー(PGX)にロードする場合、完全なグラフ・スキーマが決定され、グラフ構成にマップされます。グラフはパーティション化されたグラフとしてロードされ、各頂点またはエッジ表が同じ名前のそれぞれの頂点またはエッジ・プロバイダにマップされます。ラベルおよびプロパティも定義のとおりロードされます。

ただし、SQLグラフをグラフ・サーバー(PGX)にロードするためにサポートされているラベルは、頂点またはエッジ表ごとに1つのみです。

たとえば、次のSQLプロパティ・グラフについて検討します。

CREATE PROPERTY GRAPH student_network
  VERTEX TABLES (
    persons KEY (person_id)
      LABEL person
        PROPERTIES (person_id, name, birthdate AS dob)
  )
  EDGE TABLES (
    friendships AS friends
      KEY (friendship_id)
      SOURCE KEY (person_a) REFERENCES persons(person_id)
      DESTINATION KEY (person_b) REFERENCES persons(person_id)
      PROPERTIES (friendship_id, meeting_date)
  );

次のように、このSQLグラフをメモリーにロードできます。

opg4j> var graph = session.readGraphByName ("STUDENT_NETWORK",GraphSource.PG_SQL)
graph ==> PgxGraph[name=STUDENTS_NETWORK,N=4,E=4,created=1681007796946]
PgxGraph graph = session.readGraphByName("STUDENT_NETWORK", GraphSource.PG_SQL);
>>> graph = session.read_graph_by_name("STUDENT_NETWORK", "pg_sql")
>>> graph
PgxGraph(name: STUDENTS_NETWORK, v: 4, e: 4, directed: True, memory(Mb): 0)

6.1.1 別のスキーマからのSQLプロパティ・グラフのロード

readGraphByName APIを使用してSQLプロパティ・グラフをロードするときにスキーマ名を指定できます。

readGraphByName APIのコール時にのみグラフ名を指定する場合、グラフは現在のユーザーが所有しているとみなされます。ただし、別のユーザーが所有するグラフをロードする場合は、スキーマ名も指定する必要があります。また、SQLグラフとその基礎となるすべてのデータ表に対してSELECT権限があることを確認します。

次の例では、GRAPHUSERスキーマからSQLプロパティ・グラフをロードします。

opg4j> var graph = session.readGraphByName("GRAPHUSER", "STUDENT_NETWORK", GraphSource.PG_SQL)
graph ==> PgxGraph[name=STUDENT_NETWORK,N=4,E=4,created=1680769031393]
PgxGraph graph = session.readGraphByName("GRAPHUSER", "STUDENT_NETWORK", GraphSource.PG_SQL);
>>> graph = session.read_graph_by_name("STUDENT_NETWORK", "pg_sql", "GRAPHUSER")
>>> graph
PgxGraph(name: STUDENT_NETWORK_2, v: 4, e: 4, directed: True, memory(Mb): 0)

6.1.2 グラフ最適化オプションを使用したSQLプロパティ・グラフのロード

グラフ最適化オプションを使用してSQLプロパティ・グラフをロードする場合は、読取りまたは更新のパフォーマンスを最適化できます。

次の例は、READ操作用に最適化されたSQLプロパティ・グラフのロードを示しています:

opg4j> var graph = session.readGraphByName("STUDENT_NETWORK", GraphSource.PG_SQL,
...>     ReadGraphOption.optimizeFor(GraphOptimizedFor.READ))
graph ==> PgxGraph[name=STUDENT_NETWORK,N=4,E=4,created=1681008951415]
PgxGraph graph = session.readGraphByName("STUDENT_NETWORK", GraphSource.PG_SQL,
  ReadGraphOption.optimizeFor(GraphOptimizedFor.READ);
>>> session.read_graph_by_name('STUDENT_NETWORK', 'pg_sql', options=['optimized_for_read'])
PgxGraph(name: STUDENT_NETWORK, v: 4, e: 4, directed: True, memory(Mb): 0)

次の例は、UPDATE操作用に最適化されたSQLプロパティ・グラフのロードを示しています。また、READオプションとUPDATEオプションは同時に使用できないことに注意してください。

opg4j> var graph = session.readGraphByName("STUDENT_NETWORK", GraphSource.PG_SQL,
...>     ReadGraphOption.optimizeFor(GraphOptimizedFor.UPDATES))
graph ==> PgxGraph[name=STUDENT_NETWORK_2,N=4,E=4,created=1681009073501]
PgxGraph graph = session.readGraphByName("STUDENT_NETWORK", GraphSource.PG_SQL,
  ReadGraphOption.optimizeFor(GraphOptimizedFor.UPDATES));
>>> session.read_graph_by_name('STUDENT_NETWORK', 'pg_sql', options=['optimized_for_updates'])
PgxGraph(name: STUDENT_NETWORK, v: 4, e: 4, directed: True, memory(Mb): 0)

次の例は、SYNCHRONIZABLE最適化オプションを使用したSQLプロパティ・グラフのロードを示しています。このオプションは、READおよびUPDATEオプションと組み合せて使用できます。

opg4j> var graph = session.readGraphByName("STUDENT_NETWORK", GraphSource.PG_SQL,
...>                            ReadGraphOption.SYNCHRONIZABLE)
graph ==> PgxGraph[name=STUDENT_NETWORK,N=4,E=4,created=1696341305374]
PgxGraph graph = session.readGraphByName("STUDENT_NETWORK", GraphSource.PG_SQL,
  ReadGraphOption.SYNCHRONIZABLE);
>>> session.read_graph_by_name('STUDENT_NETWORK', 'pg_sql', options=['synchronizable'])
PgxGraph(name: STUDENT_NETWORK_2, v: 4, e: 4, directed: True, memory(Mb): 0)

関連項目:

詳細は、「グラフ最適化オプションの使用」を参照してください。

6.1.3 OnMissingVertexオプションを使用したSQLプロパティ・グラフのロード

エッジのソース頂点または宛先頂点のいずれか、あるいはその両方が欠落している場合は、OnMissingVertexOptionを使用して、頂点が欠落しているエッジを処理するための動作を指定できます。

サポートされる値は次のとおりです。
  • OnMissingVertex.ERROR (デフォルト): ソースまたは宛先の頂点が欠落しているエッジに対してエラーをスローする必要があることを指定します。
  • OnMissingVertex.IGNORE_EDGE: 欠落したソースまたは宛先の頂点のエッジを無視する必要があることを指定します。
  • OnMissingVertex.IGNORE_EDGE_LOG: 欠落したソースまたは宛先の頂点のエッジを無視し、無視されたすべてのエッジをログに記録する必要があることを指定します。
  • OnMissingVertex.IGNORE_EDGE_LOG_ONCE: 欠落したソースまたは宛先の頂点のエッジを無視し、無視された最初のエッジのみをログに記録する必要があることを指定します。

次の例では、頂点が欠落しているエッジを無視し、無視された最初のエッジのみをログに記録することによって、SQLプロパティ・グラフをロードします。

opg4j> session.readGraphByName("STUDENT_NETWORK", GraphSource.PG_SQL,
...>      ReadGraphOption.onMissingVertex(OnMissingVertex.IGNORE_EDGE_LOG_ONCE))
$2 ==> PgxGraph[name=STUDENT_NETWORK_2,N=4,E=4,created=1697264084059]
PgxGraph graph = session.readGraphByName("STUDENT_NETWORK", GraphSource.PG_SQL,
  ReadGraphOption.onMissingVertex(OnMissingVertex.IGNORE_EDGE_LOG_ONCE));
>>> session.read_graph_by_name('STUDENT_NETWORK', 'pg_sql',
    options=['on_missing_vertex_ignore_edge_log_once'])
PgxGraph(name: STUDENT_NETWORK, v: 4, e: 4, directed: True, memory(Mb): 0)

6.1.4 CLOBデータ型の列にプロパティがマップされているSQLプロパティ・グラフのロード

CLOBデータ型の列があるデータベース表からグラフ・サーバー(PGX)にSQLプロパティ・グラフをロードできます。

CLOBデータ型の列は、グラフ・サーバー(PGX)においてStringプロパティとして処理されます。

たとえば、データベース内の次のサンプル・データについて考えてみましょう:

CREATE TABLE depts (
  dept_id       NUMBER,
  dept_name     VARCHAR2 (10),
  emp_details   CLOB,
  CONSTRAINT employees_pk PRIMARY KEY (dept_id)
);

INSERT INTO depts
VALUES (1, 'HR', '
<employees>
  <employee empNo="1234" eName="SMITH" hireDate="17-DEC-1990"></employee>
  <employee empNo="5678" ename="ALLEN" hireDate="02-JAN-1981"></employee>
  </employees>
');
INSERT INTO depts
VALUES (2, 'IT', '
<employees>
  <employee empNo="5628" ename="JONES" hireDate="13-MAR-1986"></employee>>
  <employee empNo="5628" ename="TOM"   hireDate="13-MAR-1986"></employee>>
  </employees>
');

CREATE PROPERTY GRAPH DDL文を使用してSQLプロパティ・グラフを作成します。


CREATE PROPERTY GRAPH dept
VERTEX TABLES ( 
  DEPTS KEY (dept_id)
  LABEL dept
    PROPERTIES (dept_id, dept_name, emp_details)
)

次のように、グラフをグラフ・サーバー(PGX)にロードします:

opg4j> var g = session.readGraphByName("DEPT", GraphSource.PG_SQL)
g ==> PgxGraph[name=DEPT,N=2,E=0,created=1727242485228]
opg4j> g.queryPgql("SELECT n.* FROM MATCH (n:dept)").print()
+--------------------------------------------------------------------------------------------------
| DEPT_ID | DEPT_NAME | EMP_DETAILS
| 2.0     | IT        | <employees>
                          <employee empNo="5628" ename="JONES" hireDate="13-MAR-1986"></employee>>
                          <employee empNo="5628" ename="TOM"   hireDate="13-MAR-1986"></employee>>
                        </employees>                                                               |
| 1.0     | HR        | <employees>
                          <employee empNo="1234" eName="SMITH" hireDate="17-DEC-1990"></employee>
                          <employee empNo="5678" ename="ALLEN" hireDate="02-JAN-1981"></employee>
                        </employees>
                                                                                                   |
+--------------------------------------------------------------------------------------------------
PgxGraph g = session.readGraphByName("DEPT", GraphSource.PG_SQL);
PgqlResultSet rs = g.queryPgql("SELECT n.* FROM MATCH (n:dept)");
rs.print();
>>> g = session.read_graph_by_name("DEPT", "pg_sql")
>>> g.query_pgql("SELECT n.* FROM MATCH (n:dept)").print()

+--------------------------------------------------------------------------------------------------
| DEPT_ID | DEPT_NAME | EMP_DETAILS
| 2.0     | IT        | <employees>
                          <employee empNo="5628" ename="JONES" hireDate="13-MAR-1986"></employee>>
                          <employee empNo="5628" ename="TOM"   hireDate="13-MAR-1986"></employee>>
                        </employees>                                                               |
| 1.0     | HR        | <employees>
                          <employee empNo="1234" eName="SMITH" hireDate="17-DEC-1990"></employee>
                          <employee empNo="5678" ename="ALLEN" hireDate="02-JAN-1981"></employee>
                        </employees>
                                                                                                   |
+--------------------------------------------------------------------------------------------------