16.4 Oracle Databaseのグラフとグラフ・サーバーの同期の維持
FlashbackSynchronizer
APIを使用すると、データベースでのグラフに対する変更をメモリー内の対応するPgxGraph
オブジェクトに自動的に適用できるため、両方の同期が保たれます。
このAPIでは、Oracleのフラッシュバック・テクノロジを使用して最後のフェッチ以降のデータベースでの変更をフェッチし、ChangeSet
APIを使用してそれらの変更をグラフ・サーバーにプッシュします。変更が適用された後、グラフ・サーバーの通常のスナップショット・セマンティクスが適用されます。デルタ・フェッチが適用されるたびに新しいインメモリー・スナップショットが作成されます。スナップショットの作成に対して同時に実行されている問合せまたはアルゴリズムは、対応するセッションがsession.setSnapshot(graph, PgxSession.LATEST_SNAPSHOT)
プロシージャをコールしてPgxGraph
オブジェクトを最新の状態にリフレッシュするまで、変更の影響を受けません。
また、前のフェッチ操作からの変更が存在しなくなった場合、シンクロナイザは例外をスローします。これは、前のフェッチ期間がデータベースのUNDO_RETENTION
パラメータ設定より長い場合に発生します。この例外を回避するには、UNDO_RETENTION
パラメータ値より短い間隔で変更をフェッチします。UNDO_RETENTION
パラメータのデフォルト設定は900
秒です。詳細は、『Oracle Databaseリファレンス』を参照してください。
同期の前提条件
Oracleデータベースでフラッシュバックが有効になっている必要があり、同期の実行に使用するデータベース・ユーザーには次のものが必要です。
- 同期を維持する必要があるすべての表に対する読取りアクセス権。
- フラッシュバックAPIを使用するための権限。たとえば:
GRANT EXECUTE ON DBMS_FLASHBACK TO <user>
また、ユースケースに必要な時間の間変更を保持するようにデータベースを構成する必要もあります。
同期可能なグラフのタイプ
PGXのすべてのPgxGraph
オブジェクトを同期できるわけではありません。次の制限が適用されます。
-
グラフの元の作成者のみがそれを同期できます。つまり、現在のユーザーはグラフのMANAGE権限を持っている必要があります。
- データベース表からロードされたグラフ(PGQLプロパティ・グラフおよびSQLプロパティ・グラフ)のみを同期できます。他の形式から作成されたグラフ、グラフ・ビルダーAPIを使用して作成されたグラフまたはデータベース・ビューから作成されたPGQLプロパティ・グラフは同期できません。
- グラフの最新のスナップショットのみを同期できます。
同期可能な変更のタイプ
シンクロナイザでは、インメモリー・グラフ・スナップショットと次のデータベース側の変更との同期の維持がサポートされています。
- 新しい頂点とエッジの挿入
- 既存の頂点とエッジの削除
- 任意の頂点またはエッジのプロパティ値の更新
シンクロナイザでは、入力グラフに対する次のようなスキーマ・レベルの変更はサポートされていません。
- 入力頂点表またはエッジ表のリストの変更
- 任意の入力表(頂点表またはエッジ表)の任意の列の変更
さらに、シンクロナイザでは、頂点キーおよびエッジ・キーに対する更新はサポートされていません。
詳細な例は、次のトピックを参照してください。
- SQLプロパティ・グラフの同期
グラフ・サーバー(PGX)にロードされたSQLプロパティ・グラフを、データベースのグラフ・データに加えられた変更と同期できます。 - PGQLプロパティ・グラフの同期
グラフ・サーバー(PGX)にロードされたPGQLプロパティ・グラフを、データベースのグラフ・データに加えられた変更と同期できます。 - 公開済グラフの同期
公開済グラフを同期するには、グラフ・スキーマが含まれるPartitionedGraphConfig
オブジェクトとデータベース接続の詳細で、フラッシュバック・シンクロナイザを構成します。
親トピック: グラフ分析を使用したアプリケーションの開発
16.4.1 SQLプロパティ・グラフの同期
グラフ・サーバー(PGX)にロードされたSQLプロパティ・グラフを、データベースのグラフ・データに加えられた変更と同期できます。
16.4.2 PGQLプロパティ・グラフの同期
グラフ・サーバー(PGX)にロードされたPGQLプロパティ・グラフを、データベースのグラフ・データに加えられた変更と同期できます。
16.4.3 公開済グラフの同期
公開済グラフを同期するには、グラフ・スキーマが含まれるPartitionedGraphConfig
オブジェクトとデータベース接続の詳細で、フラッシュバック・シンクロナイザを構成します。
PartitionedGraphConfig
オブジェクトは、PartitionedGraphConfigBuilder
APIを使用するか、JSONファイルからグラフ構成を読み取ることで作成できます。
グラフ構成オブジェクトを使用して作成されたグラフの同期は一般的にサポートされていますが、次のいくつかの制限が適用されます。
- すべてのプロバイダがデータベース表であるパーティション化されたグラフ構成のみがサポートされます。
- 各エッジまたは頂点プロバイダ、あるいはその両方で、ユーザー名フィールドを設定して表の所有者を指定する必要があります。たとえば、ユーザー
SCOTT
が表を所有している場合は、プロバイダのユーザー名を適宜設定します。 - スナップショット・ソースは
CHANGE_SET
に設定する必要があります。 - 多数のスナップショットの作成時にメモリー不足を回避するために、更新操作用にグラフを最適化することをお薦めします。
次の例は、PartitionedGraphConfig
オブジェクトを作成するためのサンプル構成を示しています。
{
...
"optimized_for": "updates",
"vertex_providers": [
...
"username":"<username>",
...
],
"edge_providers": [
...
"username":"<username>",
...
],
"loading": {
"snapshots_source": "change_set"
}
}
GraphConfig cfg = GraphConfigBuilder.forPartitioned()
…
.setUsername("<username>")
.setSnapshotsSource(SnapshotsSource.CHANGE_SET)
.setOptimizedFor(GraphOptimizedFor.UPDATES)
...
.build();
opg4j> var graph = session.readGraphWithProperties("<path_to_json_config_file>")
graph ==> PgxGraph[name=bank_graph_analytics_fb,N=999,E=4993,created=1664310157103]
opg4j> graph.publishWithSnapshots()
PgxGraph graph = session.readGraphWithProperties("<path_to_json_config_file>");
graph.publishWithSnapshots();
>>> graph = session.read_graph_with_properties("<path_to_json_config_file>")
>>> graph.publish_with_snapshots()
これで、次のステップを実行し、JSONファイルから作成されたグラフ構成オブジェクトを使用して公開済グラフを同期できるようになります。