16.8 サブグラフの作成

サブグラフはロードしたグラフに基づいて作成できます。フィルタ式を使用するか、2部グラフの左側のセットを指定する頂点(ノード)コレクションに基づく2部サブグラフを作成できます。

ノート:

Graph Server and Clientリリース22.3以降、フィルタ式を使用したサブグラフの作成は非推奨です。PGQLプロパティ・グラフからサブグラフをロードすることをお薦めします。詳細は、PGQLプロパティ・グラフからのサブグラフのロードを参照してください。

メモリーへのグラフの読込みの詳細は、「Oracle Databaseからグラフ・サーバー(PGX)へのグラフの読込み」で、グラフ・サーバー(PGX)にグラフをロードする様々な方法を参照してください。

16.8.1 フィルタ式について

フィルタ式は、頂点ごとかエッジごとに評価される式です。この式により、結果(この場合はサブグラフ)に含まれるために頂点またはエッジが満たす必要がある述語を定義できます。

4つの頂点(ノード)と4つのエッジで構成されるグラフの例を考えてみます。フィルタ式src.prop == 10と一致するエッジについては、元の頂点のpropプロパティが10になります。次の図に示すように、2つのエッジがフィルタ式と一致します。

図16-5 src.prop == 10と一致するエッジ

図16-5の説明が続きます
「図16-5 src.prop == 10と一致するエッジ」の説明

次の図は、フィルタを適用した結果のグラフを示します。

図16-6 簡易フィルタで作成されたグラフ

図16-6の説明が続きます
「図16-6 簡易フィルタで作成されたグラフ」の説明

頂点フィルタsrc.prop == 10は、頂点333および頂点自体に関連付けられたエッジをフィルタで除外します。

16.8.2 簡易フィルタを使用したサブグラフの作成

次の例は、「フィルタ式について」で説明したサブグラフの作成を示します。

var subgraph = graph.filter(new VertexFilter("vertex.prop == 10"))
import oracle.pgx.api.*;
import oracle.pgx.api.filter.*;

PgxGraph graph = session.readGraphWithProperties(...);
PgxGraph subgraph = graph.filter(new VertexFilter("vertex.prop == 10"));

16.8.3 複合フィルタを使用したサブグラフの作成

この例では、少し複雑なフィルタを使用しています。ここでは、識別子の出力エッジの数(出力srcまたは入力dst)を計算するoutDegree関数を使用します。次のフィルタ式は、costプロパティ値が50を超え、outDegreeが1を超える入力頂点(ノード)のエッジと一致します。

dst.outDegree() > 1 && edge.cost > 50

次の図に示すように、サンプル・グラフの1つのエッジがこのフィルタ式と一致します。

図16-7 outDegreeフィルタと一致するエッジ

図16-7の説明が続きます
「図16-7 outDegreeフィルタと一致するエッジ」の説明

次の図は、フィルタを適用した結果のグラフを示します。フィルタは頂点99と1908に対応するエッジを除外するため、その頂点も除外します。

図16-8 outDegreeフィルタで作成されたグラフ

図16-8の説明が続きます
「図16-8 outDegreeフィルタで作成されたグラフ」の説明

16.8.4 頂点集合を使用した2部サブグラフの作成

2部サブグラフは、左側に使用される頂点(ノード)集合を指定して作成できます。2部サブグラフには、左側の頂点集合と右側の頂点集合の間にのみエッジがあります。左側の2つのノード間など、これらの集合内にエッジはありません。グラフ・サーバー(PGX)では、入力および出力エッジがすべて削除されたために分離された頂点は、2部サブグラフの一部ではありません。

次の図に、2部サブグラフを示します。プロパティは示していません。

次の例では、4つの頂点と4つのエッジで構成される単純なグラフから、2部サブグラフを作成します。4つの頂点の頂点ID値は、それぞれ991281908および333です。頂点とエッジのプロパティ値の詳細(頂点間のエッジ方向など)は、「フィルタ式について」図16-5を参照してください。

最初に頂点コレクションを作成し、その左側に頂点を追加する必要があります。この例では、頂点ID値が333および99の頂点が頂点コレクションの左側に追加されます。

シェルを使用した2部サブグラフの作成

opg4j> s = graph.createVertexSet()
==> ...
opg4j> s.addAll([graph.getVertex(333), graph.getVertex(99)])
==> ...
opg4j> s.size()
==> 2
opg4j> bGraph = graph.bipartiteSubGraphFromLeftSet(s)
==> PGX Bipartite Graph named sample-sub-graph-4

Javaを使用した2部サブグラフの作成

import oracle.pgx.api.*;
 
VertexSet<Integer> s = graph.createVertexSet();
s.addAll(graph.getVertex(333), graph.getVertex(99));
BipartiteGraph bGraph = graph.bipartiteSubGraphFromLeftSet(s);

サブグラフを作成すると、グラフ・サーバー(PGX)によって、頂点が左側にあるかどうかを示すブール頂点(ノード)プロパティが自動的に作成されます。このプロパティには一意の名前を指定できます。

結果の2部サブグラフは次のようになります。

IDが1908の頂点は2部サブグラフから除外されます。頂点に繋がっている唯一のエッジは、128から1908に伸びています。エッジはサブグラフの2部プロパティに反しているため削除されています。頂点1908にはその他のエッジがないため、これも削除されています。さらに、IDが128の頂点からIDが99の頂点までのエッジは、2部サブグラフに存在しません。これは、エッジは左から右にしか移動できないためです(右から左ではありません)。