#Jena&SPARQLでググッてみると…
大抵こういう風に書いています。
JenaSample.java
String queryString = "(SPARQL)";
Query query = QueryFactory.create(queryString);
QueryExecution qe = QueryExecutionFactory.sparqlService(service, query);
ResultSet results = qe.execSelect();
ResultSetFormatter.out(System.out,results, query);
結果は一覧表で表示され、めでたしめだたし。
と、言いたいところですが…変数ごとに値を取得したいときはどうしたらよいのかしら?
#ResourceクラスとLiteralクラス
例えば、食品成分LOD SPARQLエンドポイントに要求した場合。
食品成分LOD
SPARQLはこんな感じ。
SPARQL
PREFIX schema: <http://schema.org/>
PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
PREFIX cc: <http://creativecommons.org/ns#>
PREFIX dc: <http://purl.org/dc/elements/1.1/>
PREFIX xsd: <http://www.w3.org/2001/XMLSchema#>
SELECT DISTINCT ?name ?calories ?sodiumContent ?nutritionType ?title
WHERE {
?s schema:category "魚介類";
schema:name ?name;
schema:nutrition ?nutrition;
cc:attributionName ?attributionName.
?nutrition schema:calories ?calories;
schema:sodiumContent ?sodiumContent;
rdf:type ?nutritionType.
?attributionName dc:title ?title.
}
LIMIT 10
Javaではこう取り出してみる。
JenaSample2.java
Query query = QueryFactory.create(queryString);
QueryExecution qe = QueryExecutionFactory.sparqlService(service, query);
ResultSet results = qe.execSelect();
while (results.hasNext()) {
QuerySolution qs = results.next();
RDFNode node = qs.get("s");
Resource resource = node.asResource();
System.out.println(resource.getURI());
RDFNode node2 = qs.get("calories");
Literal literal = node2.asLiteral();
System.out.println(literal.getInt());
}
ソースを解説すると…
- SQLでのResultSetの様にhasNext()でのループが可能。
- 結果1つ分をQuerySolutionオブジェクトとして取得
- 各変数の値はRDFNodeオブジェクトで取得
- データはリソースならasResource()、リテラルならasLiteral()で取得
- Resource又はLiteralオブジェクトのgetterで値が取得可能。
私が調べた範囲では、このように取得できるようです。
もし、使い方が間違っていたらご指摘ください。m(_"_m)