LoginSignup
1
0

More than 5 years have passed since last update.

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

Last updated at Posted at 2017-07-25

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)

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0