第4章 RDFグラフのロード

目次

RDFグラフ機能を使用したパラレル・ロード

RDFグラフ機能では、Oracle NoSQL Databaseのデフォルト・グラフまたは名前付きグラフにRDFトリプル・データをロードできます。RDFデータをグラフにロードするには、2つの方法があります。graph.add(Triple.create()) APIを使用すると、トリプルを増分的に挿入できます。例は、「Example1.java: デフォルト・グラフの作成とトリプルの追加/削除」「Example1b.java: 名前付きグラフの作成とトリプルの追加/削除」を参照してください。

DatasetGraphNoSql.load() APIを使用すると、トリプルをRDFファイルにバルク・ロードできます。例は、「Example2.java: RDFファイルのロード」「RDFデータの同時ロード」を参照してください。

RDFグラフ機能を使用したパラレル・ロード

数千から数百万ものレコードを含むRDFデータ・ファイルをOracle NoSQL Databaseにロードする場合には、RDFグラフ機能の同時ロードを使用してタスクの速度を上げることができます。

同時ロード(パラレル・ロード)は、RDFデータ機能におけるデータ・ロードの最適なソリューションです。トリプルがバッチとして編成され、バッチがフルになるか、すべてのトリプルがRDFファイルからロードされた場合にのみロードが実行されます。バッチがフルになった場合、Oracle NoSQL Databaseへの書込み処理のパフォーマンスを引き上げるために、複数のスレッドと接続を使用して複数のトリプルをOracle NoSQL Databaseに格納します。

パラレル・ロードを使用するには、並列度(ロード処理に使用されるスレッドの数)と、OracleDatasetGraphNoSqlクラスでロード・メソッドを呼び出すときに管理されるバッチのサイズを指定します。

次の例は、パラレル・ロードを使用してOracle NoSQL DatabaseでRDFデータ・ファイルをロードします。使用される並列度とバッチ・サイズは、それぞれ入力パラメータiDOPおよびiBatchSizeによって制御されます。

CPUが4コア以上でバランスのとれているハードウェア設定であれば、DOPを8 (または16)に設定すると、多数のトリプルを処理するときロード処理の速度が大幅に向上します。

public static void main(String[] args) throws Exception
{
String szStoreName  = args[0];
String szHostName   = args[1];
String szHostPort   = args[2];
int iBatchSize      = Integer.parseInt(args[3]);
int iDOP            = Integer.parseInt(args[4]);

// Create Oracle NoSQL connection
OracleNoSqlConnection conn 
= OracleNoSqlConnection.createInstance(szStoreName,
                                       szHostName, 
                                       szHostPort);
     
// Create Oracle NoSQL datasetgraph
OracleGraphNoSql graph = new OracleGraphNoSql(conn);
DatasetGraphNoSql datasetGraph = DatasetGraphNoSql.createFrom(graph);
   
// Close graph, as it is no longer needed
graph.close();
    
// Clear datasetgraph
datasetGraph.clearRepository();
    
// Load N-QUADS data from a file into the Oracle NoSQL Database
DatasetGraphNoSql.load("example.nt", 
                       Lang.NQUADS,         // data format
                       conn, 
                       "http://example.org",
                       iBatchSize,          // batch size
                       iDOP);               // degree of parallelism
    
// Create dataset from Oracle NoSQL datasetgraph to execute
Dataset ds = DatasetImpl.wrap(datasetGraph);
   
String szQuery = "select * where { graph ?g { ?s ?p ?o }  }";
System.out.println("Execute query " + szQuery);

Query query = QueryFactory.create(szQuery);
QueryExecution qexec = QueryExecutionFactory.create(query, ds);

try {
      ResultSet results = qexec.execSelect();
      ResultSetFormatter.out(System.out, results, query);
    }

finally {
      qexec.close();
    }

ds.close();
conn.dispose();
   }
}