2017-02-15 26 views
1

Я сделал эту модель совы. Существует два класса Sensor и Location, а Location - список классов.SPARQL Query Printing Enumerate Class с JENA JAVA

:Sensor rdf:type owl:Class; 
:Location rdf:type owl:Class ; 
       owl:equivalentClass [ rdf:type owl:Class ; 
             owl:oneOf (:Bathroom 
                :Bedroom 
               ) 
            ] . 
:hasLocation rdf:type owl:ObjectProperty ; 
        rdfs:domain [ rdf:type owl:Class ; 
            :Sensor 
           ] ; 
        rdfs:range :Location . 
:Bathing rdf:type owl:NamedIndividual , 
         ADLOntology:Bathing . 
:Bathroom rdf:type owl:NamedIndividual , 
          ADLOntology:Location . 
:Window rdf:type owl:NamedIndividual , 
          :Sensor ; 
        :hasLocation :Bedroom; 
        :hasId "55"^^xsd:int ; . 

Я пытаюсь получить местоположение каждого датчика с их идентификационным номером. Я написал свой запрос в Protege, и он отлично работает. Но на JENA он печатает нуль для местоположения. Я использовал Ресурс для печати датчика, но для местоположения он печатает нуль. Я не мог понять, как правильно напечатать местоположение.

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

ответ

1

Это не имеет никакого отношения к перечислению в OWL.

Запрос просто ищет сопоставление в графе RDF. В вашем примере он будет работать, как только вы тщательно проверите , как генерируется запрос SPARQL. Обратите внимание, что вы объединяете String в Java и должны использоваться разрывы строк или пробелы. Ваш запрос отсутствует как после переменной ?location в части SELECT, таким образом, это приведет к ?locationWHERE.

Решение:

добавить недостающее пространство, т.е.

String queryString = "PREFIX : <http://semanticweb.org/sensor#>" + 
        "SELECT ?sensor ?location " + 
        "WHERE {?sensor :hasId \"55"\^^xsd:int." + 
          "?sensor :hasLocation ?location}"; 

или разрыв линии

String queryString = "PREFIX : <http://semanticweb.org/sensor#>" + 
        "SELECT ?sensor ?location\n" + 
        "WHERE {?sensor :hasId \"55"\^^xsd:int." + 
          "?sensor :hasLocation ?location}"; 
+0

спасибо, есть ли хорошие учебники, вы можете рекомендовать – Ali