SPARQL Query Printing Класс перечисления с помощью JENA JAVA

Я сделал эту модель совы. Существует два класса Sensor и Location, а Location — перечисляемый класс.

: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 для местоположения печатается ноль. Я использовал Resource для печати датчика, но для местоположения он печатает null. Я не мог понять, как правильно распечатать местоположение.

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

person Ali    schedule 15.02.2017    source источник


Ответы (1)


Это не имеет ничего общего с перечислением в OWL.

Запрос просто ищет сопоставления в графе RDF. В вашем примере это сработает, если вы тщательно проверите, как генерируется запрос SPARQL. Обратите внимание, что вы объединяете строку в 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}";
person UninformedUser    schedule 15.02.2017
comment
Большое спасибо, есть ли какие-нибудь хорошие учебники, которые вы можете порекомендовать - person Ali; 15.02.2017