2017-02-13 1 views
0
を使用したSPARQLクエリ印刷リテラル

このowlモデルのクエリを作成しようとしています。JARA JAVA

センサー名を取得するためにsensor-idを使用します。 これは私のJavaクエリですが、何も印刷されない理由はわかりません。私は私の質問が正しいことを知っていました。なぜなら、私はプロテジェで答えを得るからです。

String file = "C:/users/src/data.ttl"; 
Model model = FileManager.get().loadModel(file); 
String queryString = "PREFIX : <http://semanticweb.org/sensor#>" + 
        "SELECT ?sensor" + 
        "WHERE {?sensor :hasId \"55"\^^<xsd:int>}"; 
Query query = QueryFactory.create(queryString); 
try (QueryExecution qexec = QueryExecutionFactory.create(query, model)) { 
      ResultSet result = qexec.execSelect(); 
      for (; result.hasNext();) { 
        QuerySolution soln = result.nextSolution(); 
        Resource r = soln.getResource("sensor"); 
        System.out.println(r); 
      } 
} 
+0

あなたは、変数「センサー」のために照会されています。次に、 "Valr"のリテラルを取得します。あなたは代わりに "センサー"のリテラルを取得しようとしましたか?つまり、soln.getLiteral( "sensor"); –

+0

実際、私は自分のコードに大きな問題があることに気付きました。ループは実行されません。つまり、「結果」は空です。私は自分のコードを更新しますが、私は問題が何であるか把握できません。 – Ali

答えて

2

SPARQLクエリでのリテラルの使用が間違っています。どちらかあなたは

  1. リテラルのための接頭辞URI、すなわち"55"^^xsd:int、または
  2. あなたは角括弧の中に完全なURIを入れ、すなわち"55"\^^<http://www.w3.org/2001/XMLSchema#int>

ではなく、両方の混合物を使用しています。常に

そして、すべてのSPARQLサービス全体で適切な解析を確実にするためにSPARQLクエリの最初にすべてのPREFIX宣言を追加することを好む:

PREFIX : <http://semanticweb.org/sensor#> 
PREFIX xsd: <http://www.w3.org/2001/XMLSchema#> 
SELECT ?sensor 
WHERE { 
    ?sensor :hasId "55"^^xsd:int 
} 
+0

私はカメを使用していますが、あなたが言いたいのは正しい方法だと知っていましたが、このエラーが出ています: 'org.apache.jena.query.QueryParseException:2行目、63列目:未解決の接頭辞:xsd: int ' しかし、あなたが言及する2番目の方法は働いていますが、単にnullを出力します。なぜなのかご存知ですか? – Ali

+1

SPARQLクエリの先頭にすべてのプレフィックスを宣言する必要があるためです。 API /ツールではいくつかの事前定義済みプレフィックスを提供することがありますが、どこでも動作させるためには、クエリで使用されるすべてのプレフィックスを追加することをお勧めします: 'PREFIX xsd: '私は将来の参照のために私の答えにこれを加えました。 – AKSW

+0

ありがとうございます。あなたはなぜ私がnullになっているのか知っていますか?私は答えを得ていますが、ここで私はこのクエリのためにnullを取得しています。 – Ali