10.4.1 PGQLベースのサブグラフのロード

PgViewSubgraphReader#fromPgView APIを使用し、一連のPGQL問合せを使用してPGQLプロパティ・グラフからインメモリー・サブグラフを作成できます。

これらのPGQL問合せは、サブグラフにロードされる頂点およびエッジを定義します。複数のPGQL問合せを使用することもでき、結果の出力グラフはサブグラフを結合したものであり、それぞれが各PGQL問合せによって別々にロードされます。

ノート:

  • 非コンポジットの頂点およびエッジ・キーのみがサポートされています。
  • 数値エッジ・キーのみがサポートされています。
  • PGQLプロパティ・グラフからのサブグラフのロードでは、GROUP BY句またはORDER BY句を指定したPGQL問合せはサポートされていません。

次の例では、複数のPGQL問合せを使用してPGQLプロパティ・グラフからサブグラフを作成します。

opg4j> var graph = session.readSubgraph().
...>                    fromPgView("FRIENDS").
...>                    queryPgql("MATCH (v1:Person)-[e:FRIENDOF]->(v2:Person) WHERE id(v1) = 'PERSONS(1)'").
...>                    queryPgql("MATCH (v:Person) WHERE id(v) = 'PERSONS(2)'").
...>                    load()
graph ==> PgxGraph[name=FRIENDS,N=3,E=1,created=1646726883194]
PgxGraph graph = session.readSubgraph()
                       .fromPgView("FRIENDS")
                       .queryPgql("MATCH (v1:Person)-[e:FRIENDOF]->(v2:Person) WHERE id(v1) = 'PERSONS(1)'")
                       .queryPgql("MATCH (v:Person) WHERE id(v) = 'PERSONS(2)'")
                       .load();
>>> graph = session.read_subgraph_from_pg_view("FRIENDS", ["MATCH (v1:Person)-[e:FRIENDOF]->(v2:Person) WHERE id(v1) = 'PERSONS(1)'",
...                           "MATCH (v:Person) WHERE id(v) = 'PERSONS(2)'"])
>>> graph
PgxGraph(name: FRIENDS, v: 3, e: 1, directed: True, memory(Mb): 0)

グラフ・ビジュアライゼーション・ツールを使用した前述のPGQL問合せの出力を次に示します。

図10-1 サブグラフ・ビジュアライゼーション

図10-1の説明が続きます
「図10-1 サブグラフ・ビジュアライゼーション」の説明

カスタム名によるサブグラフのロード

デフォルトでは、新しいサブグラフはPGQLプロパティ・グラフと同じ名前で作成されます。あるいは、カスタム名でサブグラフをロードする場合は、次のようにサブグラフ名を構成できます。

opg4j> var graph = session.readSubgraph().
...>                  fromPgView("FRIENDS").
...>                  queryPgql("MATCH (v1:Person)-[e:FRIENDOF]->(v2:Person) WHERE id(v1) = 'PERSONS(1)'").
...>                  queryPgql("MATCH (v:Person) WHERE id(v) = 'PERSONS(2)'").
...>                  load("friends_network")
graph ==> PgxGraph[name=friends_network,N=3,E=1,created=1664458398090]
PgxGraph graph = session.readSubgraph()
                       .fromPgView("FRIENDS")
                       .queryPgql("MATCH (v1:Person)-[e:FRIENDOF]->(v2:Person) WHERE id(v1) = 'PERSONS(1)'")
                       .queryPgql("MATCH (v:Person) WHERE id(v) = 'PERSONS(2)'")
                       .load("friends_network");
>>> graph = session.read_subgraph_from_pg_view("FRIENDS",
...                   ["MATCH (v1:Person)-[e:FRIENDOF]->(v2:Person) WHERE id(v1) = 'PERSONS(1)'",
...                    "MATCH (v:Person) WHERE id(v) = 'PERSONS(2)'"],
...                   graph_name="friends_network")
>>> graph
PgxGraph(name: friends_network, v: 3, e: 1, directed: True, memory(Mb): 0)

スキーマ名の明示的な指定によるサブグラフのロード

別のスキーマからPGQLプロパティ・グラフを読み取ることでサブグラフをロードする場合は、さらにPgViewSubgraphReader#fromPgView APIの引数としてスキーマ名を指定できます。また、PGQLプロパティ・グラフの基礎となるすべてのメタデータおよびデータ表に対するREAD権限を持っていることも確認する必要があります。

たとえば:

opg4j> var graph = session.readSubgraph()
...> .fromPgView("GRAPHUSER", "FRIENDS")
...> .queryPgql("MATCH (v:Person) WHERE id(v) = 'PERSONS(2)'")
...> .load()
graph ==> PgxGraph[name=FRIENDS,N=1,E=0,created=1672743755511]
PgxGraph graph = session.readSubgraph()
                       .fromPgView("GRAPHUSER", "FRIENDS")
                       .queryPgql("MATCH (v:Person) WHERE id(v) = 'PERSONS(2)'")
                       .load();
>>> graph = session.read_subgraph_from_pg_view("FRIENDS",
...  ["MATCH (v:Person) WHERE id(v) = 'PERSONS(2)'"],
...  schema="GRAPHUSER")