- プロパティ・グラフのグラフ開発者ガイド
- グラフ・サーバー(PGX)の使用
- グラフ分析を使用したアプリケーションの開発
- Oracle Databaseのグラフとグラフ・サーバーの同期の維持
- PGビュー・グラフの同期
15.3.1 PGビュー・グラフの同期
プロパティ・グラフ・ビュー(PGビュー)からグラフ・サーバー(PGX)にロードされたグラフを、データベース内のグラフに加えられた変更と同期できます。
次の例に、FlashbackSynchronizer APIを使用してPGビューを同期するステップを示します。
- 次のように、
readGraphByName()
APIを使用してPGビュー・グラフをグラフ・サーバー(PGX)にロードします。opg4j> var graph = session.readGraphByName("BANK_GRAPH_VIEW",GraphSource.PG_VIEW, ReadGraphOption.optimizeFor(GraphOptimizedFor.UPDATES),ReadGraphOption.synchronizable()) graph ==> PgxGraph[name=BANK_GRAPH_VIEW,N=999,E=4993,created=1660275936010]
PgxGraph graph = session.readGraphByName("BANK_GRAPH_VIEW",GraphSource.PG_VIEW, ReadGraphOption.optimizeFor(GraphOptimizedFor.UPDATES),ReadGraphOption.synchronizable());
>>> graph = session.read_graph_by_name('BANK_GRAPH_VIEW','pg_view')
- データベースへの新しいJDBC接続を開き、PGビュー・グラフの基礎となるデータベース表のデータを変更します。たとえば、次のコードでは、エッジ・プロパティのいずれかについてデータベース値を更新します。
opg4j> var conn = DriverManager.getConnection(<jdbcUrl>,<username>,<password>) conn ==> oracle.jdbc.driver.T4CConnection@60f7261f opg4j> var stmt = conn.createStatement() stmt ==> oracle.jdbc.driver.OracleStatementWrapper@1a914a00 opg4j> stmt.executeQuery("UPDATE bank_txns SET amount=4000 WHERE txn_id=3") $5 ==> oracle.jdbc.driver.ForwardOnlyResultSet@627d5f99 opg4j> conn.setAutoCommit(false) opg4j> conn.commit()
Connection conn = DriverManager.getConnection(<jdbcUrl>,<username>,<password>); Statement stmt = conn.createStatement(); stmt.executeQuery("UPDATE bank_txns SET amount=4000 WHERE txn_id=3"); conn.setAutoCommit(false); conn.commit();
>>> conn = opg4py.pgql.get_connection(<username>,<password>, <jdbcUrl>).get_jdbc_connection() >>> conn.prepareStatement("UPDATE bank_txns SET amount=4000 WHERE txn_id=3").execute() False >>> conn.commit()
データベースの変更をコミットすると、メモリー内のグラフがデータベースのソース表と同期しなくなります。 - 次のコードに示すように、新しいシンクロナイザ・オブジェクトを作成することで、インメモリー・グラフとデータベースを同期します。
Synchronizer synchronizer = new Synchronizer.Builder<FlashbackSynchronizer>() .setType(FlashbackSynchronizer.class) .setGraph(graph) .setConnection(conn) .build();
内部的に、グラフ・サーバーは、現在のグラフ・スナップショットが属するOracleシステム変更番号(SCN)をトラッキングします。シンクロナイザはデータベースに接続するクライアント側コンポーネントであり、フラッシュバック・メカニズムを介して現在のSCNを使用して元の入力表の状態を比較することで変更を検出し、その後、変更セットAPIを使用して、グラフ・サーバーにすべての変更を送信します。これを行うには、シンクロナイザによって、データベースへの接続方法(
conn
パラメータ)および同期を維持するグラフ(graph
パラメータ)が認識される必要があります。あるいは、次のように同等のショートカットを使用することもできます。
opg4j> var synchronizer = graph.createSynchronizer(FlashbackSynchronizer.class, conn) synchronizer ==> oracle.pgx.api.FlashbackSynchronizer@4ac2b4c6
Synchronizer synchronizer = graph.createSynchronizer(FlashbackSynchronizer.class, conn);
>>> synchronizer = graph.create_synchronizer(synchronizer_class='oracle.pgx.api.FlashbackSynchronizer', connection=conn)
- sync()関数をコールしてデータベースの変更をフェッチして適用し、新しいインメモリー・グラフ・スナップショットを作成します。
opg4j> graph=synchronizer.sync() g ==> PgxGraph[name=BANK_GRAPH_VIEW,N=999,E=4993,created=1660308128037]
graph=synchronizer.sync();
>>> graph = synchronizer.sync()
Synchronizer
オブジェクトは、セッションごとに1回のみ作成する必要があります。作成後は、synchronizer.sync()
操作を複数回実行して、データベースの変更に対応する最新のグラフ・スナップショットを生成できます。変更のフェッチおよび適用の分割
前述のコードで
synchronizer.sync()
を呼び出すと、1回のコールで変更のフェッチと適用が行われます。しかし、このプロセスを別個のfetch()
呼出しとapply()
呼出しに分割することで、より複雑な更新ロジックをエンコードできます。たとえば:synchronizer.fetch(); // fetches changes from the database if (synchronizer.getGraphDelta().getTotalNumberOfChanges() > 100) { // only create snapshot if there have been more than 100 changes synchronizer.apply(); }
- グラフを問い合せて、エッジ・プロパティの更新を確認します。
opg4j> graph.queryPgql("SELECT e.amount FROM MATCH (v1:Accounts)-[e:Transfers]->(v2:Accounts) WHERE e.from_acct_id = 179 AND e.to_acct_id=688").print()
graph.queryPgql("SELECT e.amount FROM MATCH (v1:Accounts)-[e:Transfers]->(v2:Accounts) WHERE e.from_acct_id = 179 AND e.to_acct_id=688").print();
>>> graph.query_pgql("SELECT e.amount FROM MATCH (v1:Accounts)-[e:Transfers]->(v2:Accounts) WHERE e.from_acct_id = 179 AND e.to_acct_id=688").print()
実行すると、前述の例では次の出力が生成されます。+--------+ | amount | +--------+ | 4000.0 | +--------+