2017-02-13 14 views
0

Я пытаюсь написать запрос для этой модели совы.Лист печати запросов SPARQL с использованием JENA JAVA

:Sensor rdf:type owl:Class; 
:hasId rdf:type owl:DatatypeProperty, 
       rdfs:domain :Sensor; 
       rdfs:range xsd:int. 
:MedicalCountainer rdf:type :owlNamedIndividual, 
          :Sensor; 
          :hasId "55"^^xsd:int . 

Я хочу использовать идентификатор датчика для извлечения имени датчика. Это мой 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 («датчик»); –

+0

На самом деле, я замечаю, что у меня серьезная проблема в моем коде. Цикл не запускается, значит «результат» пуст. Я обновляю свой код, я не могу понять, в чем проблема. – Ali

ответ

2

Использование литерала в запросе SPARQL неверно. Либо вы используете

  1. префиксом URI для буквальным, т.е. "55"^^xsd:int или
  2. вы положили полный URI в угловые скобки, т.е. "55"\^^<http://www.w3.org/2001/XMLSchema#int>

, но не смесь обоих.

И всегда предпочитает, чтобы добавить все объявления Приставки к началу запроса SPARQL в целях обеспечения надлежащего синтаксический во всех услугах SPARQL:

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' Однако, второй способ, о котором вы говорите, работает, но я просто печатаю null. Ты знаешь почему? – Ali

+1

Потому что вы должны объявить все префиксы в начале запроса SPARQL. Иногда API/инструменты предоставляют некоторые предопределенные префиксы, но чтобы заставить его работать повсюду, лучше всего добавить все префиксы, которые используются в запросе: 'PREFIX xsd: 'Я добавил это также к моему ответу для дальнейшего использования. – AKSW

+0

Большое спасибо. Вы знаете, почему я получаю нуль? На протеже я получаю ответ, но здесь я получаю null для этого запроса. – Ali