5.4.7 新しいデータの既存のプロパティ・グラフへのマージ

グラフ・データのOracle Databaseの空のプロパティ・グラフへのロードに加えて、新しいグラフ・データを既存の(空のまたは空でない)グラフにマージできます。データのロードと同様に、データのマージも、入力頂点およびエッジを複数のチャンクに分割し、それらをデータベースの既存のグラフにパラレルにマージします。

マージを実行中のフローは、新しいグラフ・データと既存のグラフ・データの間に重複があるかどうかによって異なります。ここでの重複とは、グラフ要素の同じキーが、新しいグラフ・データと既存のグラフ・データとで異なる値を持つ可能性があるという意味です。たとえば、ID 1の頂点のキーweightは、新しいグラフ・データでは値0.8を、既存のグラフ・データでは値0.5を持つ可能性があります。この場合、新しい値または既存の値をキーに使用する必要があるかを指定する必要があります。

次のオプションがグラフ・データのマージに使用できます。JDBベース、外部表ベース、SQL loaderベースのマージ。

  • JDBCベースのグラフ・データのマージ

  • 外部表ベースのデータのマージ

  • SQL*Loaderベースのデータのマージ

JDBCベースのグラフ・データのマージ

JDBCベースのデータのマージでは、Java Database Connectivity (JDBC) APIを使用して、新しいグラフ・データをOracle Databaseにロードしてから、新しいグラフ・データを既存のグラフにマージします。

次の例は、DOP(並列度)が48、バッチ・サイズが1000で、データのマージ・オプションを指定した、JDBCベースのデータ・マージを使用し、Oracle定義のフラット・ファイル形式の頂点およびエッジ・ファイルszOPVFileおよびszOPEFileからの新しいグラフ・データを、opgという名前の既存のグラフにマージします。

String szOPVFile = "../../data/connectionsNew.opv"; 
String szOPEFile = "../../data/connectionsNew.ope"; 
OraclePropertyGraphDataLoader opgdl = OraclePropertyGraphDataLoader.getInstance(); 
opgdl.mergeData(opg, szOPVFile, szOPEFile, 
     48 /*DOP*/, 
     1000 /*Batch Size*/, 
     true /*Rebuild index*/,  
     "pdml=t, pddl=t, no_dup=t, use_new_val_for_dup_key=t" /*Merge options*/);

データのマージ操作のパフォーマンスを最適化するために、JDBCベースのデータのマージを呼び出すときに、フラグやヒントのセットをマージ・オプション・パラメータに指定できます。これらのヒントとしては次のものがあります。

  • DOP: データのマージ時に使用する並列度。このパラメータは、データをプロパティ・グラフVT$およびGE$表にマージするときに使用するローダー・スレッドの数と同様に、ファイルの分割時に生成するチャンクの数を決定します。

  • バッチ・サイズ:バッチ・モードでOracleのJDBC文で使用するバッチ・サイズを指定する整数。

  • 索引の再作成: trueに設定されている場合、データ・ローダーは、データがロードされるプロパティ・グラフで定義されたすべての索引および制約を無効にします。すべてのデータがプロパティ・グラフにマージされた後、すべての元の索引および制約は再作成され、有効化されます。

  • マージ・オプション: データのマージ操作を最適化するための1つのオプション(またはカンマで区切った複数のオプション)。これらのオプションとしては次のものがあります。

    • PDML=T: データ・ローダーで使用されるデータベース・セッションでのDML操作のパラレル実行を有効にします。このヒントは、長時間実行するバッチ・ジョブのパフォーマンスを向上するのに使用されます。

    • PDDL=T: データ・ローダーで使用されるデータベース・セッションでのDDL操作のパラレル実行を有効にします。このヒントは、長時間実行するバッチ・ジョブのパフォーマンスを向上するのに使用されます。

    • NO_DUP=T: 新しい入力グラフ・データに無効な重複がないことを前提にしています。有効なプロパティ・グラフでは、各頂点(またはエッジ)は指定したプロパティ・キーに対し最大で1つの値を持つことができます。無効なプロパティ・グラフでは、各頂点(またはエッジ)は特定のキーに対し2つ以上の値を持つことがあります。例として、頂点vには2つのキー/値ペア、name/"John"およびname/"Johnny"があり、同じキーを共有しています。

    • OVERLAP=F: 新しいグラフ・データと既存のグラフ・データの間に重複がないことを前提とします。つまり、新しいグラフ・データと既存のグラフ・データに複数の異なる値を持つキーはありません。

    • USE_NEW_VAL_FOR_DUP_KEY=T: 新しいグラフ・データと既存のグラフ・データの間に重複がある場合、新しいグラフ・データの値を使用します。そうでなければ、既存のグラフ・データの値を使用します。

外部表ベースのデータのマージ

外部表ベースのデータのマージでは、外部表を使用して、新しいグラフ・データをOracle Databaseにロードしてから、新しいグラフ・データを既存のグラフにマージします。

外部表ベースのデータのマージには、外部表により読み出されるファイルが格納されるディレクトリ・オブジェクトが必要です。このディレクトリは、次のSQL*Plus文を使用して作成できます。

create or replace directory tmp_dir as '/tmppath/';
grant read, write on directory tmp_dir to public;

次の例は、DOP(並列度)が48で、マージ・オプションを指定した、外部表ベースのデータ・マージを使用し、Oracleフラット・ファイル形式の頂点およびエッジ・ファイルszOPVFileおよびszOPEFileからの新しいグラフ・データを、既存のグラフopgにマージします。

String szOPVFile = "../../data/connectionsNew.opv"; 
String szOPEFile = "../../data/connectionsNew.ope"; 
String szExtDir = "tmp_dir";
OraclePropertyGraphDataLoader opgdl = OraclePropertyGraphDataLoader.getInstance(); 
opgdl.mergeDataWithExtTab(opg, szOPVFile, szOPEFile, 
     48 /*DOP*/, 
     true /*Use Named Pipe for splitting*/, 
     szExtDir /*database directory object*/, 
     true /*Rebuild index*/,  
     "pdml=t, pddl=t, no_dup=t, use_new_val_for_dup_key=t" /*Merge options*/);

SQL*Loaderベースのデータのマージ

SQLローダー・ベースのデータのマージでは、Oracle SQL*Loaderを使用して、新しいグラフ・データをOracle Databaseにロードしてから、新しいグラフ・データを既存のグラフにマージします。

次の例は、DOP(並列度)が48で、マージ・オプションを指定した、SQLローダー・ベースのデータ・マージを使用し、Oracleフラット・ファイル形式の頂点およびエッジ・ファイルszOPVFileおよびszOPEFileからの新しいグラフ・データを、既存のグラフopgにマージします。APIを使用するには、SQL*Loaderへのパスを指定する必要があります。

String szUser = "username";
String szPassword = "password";
String szDbId = "db18c"; /*service name of the database*/ 
String szOPVFile = "../../data/connectionsNew.opv"; 0
String szOPEFile = "../../data/connectionsNew.ope"; 
String szSQLLoaderPath = "<YOUR_ORACLE_HOME>/bin/sqlldr";    
OraclePropertyGraphDataLoader opgdl = OraclePropertyGraphDataLoader.getInstance(); 
opgdl.mergeDataWithSqlLdr(opg, szUser, szPassword, szDbId, szOPVFile, szOPEFile, 
     48 /*DOP*/, 
     true /*Use Named Pipe for splitting*/, 
     szSQLLoaderPath /* SQL*Loader path: the path to bin/sqlldr */, 
     true /*Rebuild index*/,  
     "pdml=t, pddl=t, no_dup=t, use_new_val_for_dup_key=t" /*Merge options*/);