Java
lod
備忘録
SPARQL
jena

Jena&SPARQLで取得したデータを変数ごとに見たい時の覚書。

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());
}

ソースを解説すると…
1. SQLでのResultSetの様にhasNext()でのループが可能。
2. 結果1つ分をQuerySolutionオブジェクトとして取得
3. 各変数の値はRDFNodeオブジェクトで取得
4. データはリソースならasResource()、リテラルならasLiteral()で取得
5. Resource又はLiteralオブジェクトのgetterで値が取得可能。

私が調べた範囲では、このように取得できるようです。
もし、使い方が間違っていたらご指摘ください。m(_"_m)