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つのエッジがフィルタ式と一致します。
次の図は、フィルタを適用した結果のグラフを示します。
頂点フィルタ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つのエッジがこのフィルタ式と一致します。
次の図は、フィルタを適用した結果のグラフを示します。フィルタは頂点99と1908に対応するエッジを除外するため、その頂点も除外します。
親トピック: サブグラフの作成
16.8.4 頂点集合を使用した2部サブグラフの作成
2部サブグラフは、左側に使用される頂点(ノード)集合を指定して作成できます。2部サブグラフには、左側の頂点集合と右側の頂点集合の間にのみエッジがあります。左側の2つのノード間など、これらの集合内にエッジはありません。グラフ・サーバー(PGX)では、入力および出力エッジがすべて削除されたために分離された頂点は、2部サブグラフの一部ではありません。
次の図に、2部サブグラフを示します。プロパティは示していません。
次の例では、4つの頂点と4つのエッジで構成される単純なグラフから、2部サブグラフを作成します。4つの頂点の頂点ID値は、それぞれ99
、128
、1908
および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部サブグラフに存在しません。これは、エッジは左から右にしか移動できないためです(右から左ではありません)。
親トピック: サブグラフの作成