JavaScript Object Notation (JSON)形式のサポート

SPARQL問合せの応答では、JavaScript Object Notation (JSON)形式がサポートされています。JSONデータ形式は単純でコンパクトであり、JavaScriptプログラムに適しています。

たとえば次のJavaコード・スニペットは、Oracle NoSQL Databaseに格納されているデータに対する問合せを実行し、ResultSetFormatter.outputAsJSON()メソッドを呼び出して問合せ結果を表示します。

OracleNoSqlConnection conn = 
                     OracleNoSqlConnection.createInstance(storeName,
                                                          hostName, 
                                                          hostPort);
OracleGraphNoSql graph = new OracleNamedGraphNoSql(graphName, conn);
OracleModelNoSql model = new OracleModelNoSql(graph); 

graph.add(new Triple(Node.createURI("http://ds1"), 
Node.createURI("http://dp1"), 
Node.createURI("http://do1"))); 

graph.add(new Triple(Node.createURI("http://ds2"), 
Node.createURI("http://dp2"), 
Node.createURI("http://do2")));

Query q = QueryFactory.create("select ?s ?p ?o where {?s ?p ?o}",
Syntax.syntaxARQ);

QueryExecution qexec = QueryExecutionFactory.create(q, model); 
ResultSet results = qexec.execSelect();
ResultSetFormatter.outputAsJSON(System.out, results);

このコードを実行すると、次のJSON出力が生成されます。

{ 
"head": { 
"vars": [ "s" , "p" , "o" ] 
} , 
"results": { 
"bindings": [ 
{ 
"s": { "type": "uri" , "value": "http://ds1" } , 
"p": { "type": "uri" , "value": "http://dp1" } , 
"o": { "type": "uri" , "value": "http://do1" } 
} , 
{ 
"s": { "type": "uri" , "value": "http://ds2" } , 
"p": { "type": "uri" , "value": "http://dp2" } , 
"o": { "type": "uri" , "value": "http://do2" } 
} 
] 
}
}

上の例を変更すると、直接Oracle NoSQL Databaseに対して実行するかわりに、リモートのSPARQLエンドポイントに対する問合せを実行できます。(リモートのSPARQLエンドポイントがファイアウォール外にある場合は、HTTPプロキシの設定が必要な場合もあります。)

Query q = QueryFactory.create("select ?s ?p ?o where {?s ?p ?o}",
Syntax.syntaxARQ);
QueryExecution qexec = 
               QueryExecutionFactory.sparqlService(sparqlURL, q);
ResultSet results = qexec.execSelect();
ResultSetFormatter.outputAsJSON(System.out, results);

この項の最初の例を名前付きグラフに拡張するために、次のコード・スニペットは同じデータセットに2つのクワッドを追加し、名前付きグラフに基づくSPARQL問合せを実行して、問合せの出力をJSON形式にシリアライズします。

DatasetGraphNoSql dsg = DatasetGraphNoSql.createFrom(graph);
graph.close(); 

dsg.add(new Quad(Node.createURI("http://g1"), 
Node.createURI("http://s1"), 
Node.createURI("http://p1"), 
Node.createURI("http://o1") ) 
);

dsg.add(new Quad(Node.createURI("http://g2"), 
                 Node.createURI("http://s2"), 
                 Node.createURI("http://p2"), 
                 Node.createURI("http://o2") ) 
        ); 

Query q1 = QueryFactory.create(
                 "select ?g ?s ?p ?o where { GRAPH ?g {?s ?p ?o} }");

QueryExecution qexec1 = 
             QueryExecutionFactory.create(q1, DatasetImpl.wrap(dsg));

ResultSet results1 = qexec1.execSelect();
ResultSetFormatter.outputAsJSON(System.out, results1);
dsg.close();
conn.dispose();

このコードの実行後に生成されるJSON出力は、次のように表示されます。

{ 
"head": { 
"vars": [ "g" , "s" , "p" , "o" ] 
} , 
"results": { 
"bindings": [ 
{ 
"g": { "type": "uri" , "value": "http://g1" } , 
"s": { "type": "uri" , "value": "http://s1" } , 
"p": { "type": "uri" , "value": "http://p1" } , 
"o": { "type": "uri" , "value": "http://o1" } 
} , 
{ 
"g": { "type": "uri" , "value": "http://g2" } , 
"s": { "type": "uri" , "value": "http://s2" } , 
"p": { "type": "uri" , "value": "http://p2" } , 
"o": { "type": "uri" , "value": "http://o2" } 
} 
] 
}
}

次の例のように、JosekiベースのSPARQLエンドポイントに対してHTTPを通じてJSON応答を取得することもできます。通常、SPARQL Webサービス・エンドポイントに対してSPARQL問合せを実行すると、Accept request-headフィールドがapplication/sparql-results+xmlに設定されます。JSON出力形式の場合は、Accept request-headフィールドをapplication/sparql-results+jsonに置き換えます。

http://hostname:7001/joseki/oracle-nosql?query=
  <URL_ENCODED_SPARQL_QUERY>&output=json