Как делать рассуждения в Йене через Sparql Query
Я использую Jena и Sparql для запроса файла онтологии.
я имею
- Класс Tag с двумя подклассами: C++ и Java.
- Предмет класса с несколькими подклассами, которые обозначают определенные предметы университета: "Программирование на C++", "Системное программирование", "Программирование на Java" и т. д.
- ObjectProperty "hasTags" домен: Предметный диапазон: тег. У каждого субъекта класса есть какой-то тег типа "Java", "C++".
При выполнении запроса
SELECT ?subject
WHERE
{ ?subject owl:equivalentClass ?restriction .
?restriction owl:onProperty ont:hasTags .
?restriction ?restrictType ont:Java
}
который обозначает получение всех предметов с тегом "Java", у меня получается.
Итак, цель состоит в том, чтобы получить все темы, помеченные "Java" и "C++", с помощью запроса "Tag", например:
SELECT ?subject
WHERE
{ ?subject owl:equivalentClass ?restriction .
?restriction owl:onProperty ont:hasTags .
?restriction ?restrictType ont:Tag
}
Я предполагал, что этот запрос вернет все сущности, помеченные "Java" или "C++", но ничего не возвращает.
Я хочу получать объекты с тегами "Java" или "C++", написав просто "Tag" в запросе. Что мне нужно сделать, чтобы достичь этого, и возможно ли это с помощью Jena API?
UPD: вот мой файл онтологии в синтаксисе RDF/XML.
<?xml version="1.0"?>
<!DOCTYPE rdf:RDF [
<!ENTITY owl "http://www.w3.org/2002/07/owl#" >
<!ENTITY xsd "http://www.w3.org/2001/XMLSchema#" >
<!ENTITY rdfs "http://www.w3.org/2000/01/rdf-schema#" >
<!ENTITY rdf "http://www.w3.org/1999/02/22-rdf-syntax-ns#" >
]>
<rdf:RDF xmlns="http://www.semanticweb.org/man/ontologies/2014/5/untitled-ontology-11#"
xml:base="http://www.semanticweb.org/man/ontologies/2014/5/untitled-ontology-11"
xmlns:rdfs="http://www.w3.org/2000/01/rdf-schema#"
xmlns:owl="http://www.w3.org/2002/07/owl#"
xmlns:xsd="http://www.w3.org/2001/XMLSchema#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#">
<owl:Ontology rdf:about="http://www.semanticweb.org/man/ontologies/2014/5/untitled-ontology-11">
<rdfs:label>University subjects ontology
</rdfs:label>
</owl:Ontology>
<!--
///////////////////////////////////////////////////////////////////////////////////////
//
// Object Properties
//
///////////////////////////////////////////////////////////////////////////////////////
-->
<!-- http://www.semanticweb.org/man/ontologies/2014/5/untitled-ontology-11#hasTags -->
<owl:ObjectProperty rdf:about="http://www.semanticweb.org/man/ontologies/2014/5/untitled-ontology-11#hasTags">
<rdf:type rdf:resource="&owl;TransitiveProperty"/>
<rdfs:domain rdf:resource="http://www.semanticweb.org/man/ontologies/2014/5/untitled-ontology-11#Subject"/>
<rdfs:range rdf:resource="http://www.semanticweb.org/man/ontologies/2014/5/untitled-ontology-11#Tag"/>
</owl:ObjectProperty>
<!--
///////////////////////////////////////////////////////////////////////////////////////
//
// Classes
//
///////////////////////////////////////////////////////////////////////////////////////
-->
<!-- http://www.semanticweb.org/man/ontologies/2014/5/untitled-ontology-11#C++ -->
<owl:Class rdf:about="http://www.semanticweb.org/man/ontologies/2014/5/untitled-ontology-11#C++">
<rdfs:subClassOf rdf:resource="http://www.semanticweb.org/man/ontologies/2014/5/untitled-ontology-11#Programming"/>
</owl:Class>
<!-- http://www.semanticweb.org/man/ontologies/2014/5/untitled-ontology-11#C++_programming -->
<owl:Class rdf:about="http://www.semanticweb.org/man/ontologies/2014/5/untitled-ontology-11#C++_programming">
<owl:equivalentClass>
<owl:Restriction>
<owl:onProperty rdf:resource="http://www.semanticweb.org/man/ontologies/2014/5/untitled-ontology-11#hasTags"/>
<owl:someValuesFrom rdf:resource="http://www.semanticweb.org/man/ontologies/2014/5/untitled-ontology-11#C++"/>
</owl:Restriction>
</owl:equivalentClass>
<rdfs:subClassOf rdf:resource="http://www.semanticweb.org/man/ontologies/2014/5/untitled-ontology-11#Subject"/>
</owl:Class>
<!-- http://www.semanticweb.org/man/ontologies/2014/5/untitled-ontology-11#Java -->
<owl:Class rdf:about="http://www.semanticweb.org/man/ontologies/2014/5/untitled-ontology-11#Java">
<rdfs:subClassOf rdf:resource="http://www.semanticweb.org/man/ontologies/2014/5/untitled-ontology-11#Programming"/>
</owl:Class>
<!-- http://www.semanticweb.org/man/ontologies/2014/5/untitled-ontology-11#Java_programming -->
<owl:Class rdf:about="http://www.semanticweb.org/man/ontologies/2014/5/untitled-ontology-11#Java_programming">
<owl:equivalentClass>
<owl:Restriction>
<owl:onProperty rdf:resource="http://www.semanticweb.org/man/ontologies/2014/5/untitled-ontology-11#hasTags"/>
<owl:someValuesFrom rdf:resource="http://www.semanticweb.org/man/ontologies/2014/5/untitled-ontology-11#Java"/>
</owl:Restriction>
</owl:equivalentClass>
<rdfs:subClassOf rdf:resource="http://www.semanticweb.org/man/ontologies/2014/5/untitled-ontology-11#Subject"/>
</owl:Class>
<!-- http://www.semanticweb.org/man/ontologies/2014/5/untitled-ontology-11#Programming -->
<owl:Class rdf:about="http://www.semanticweb.org/man/ontologies/2014/5/untitled-ontology-11#Programming">
<rdfs:subClassOf rdf:resource="http://www.semanticweb.org/man/ontologies/2014/5/untitled-ontology-11#Tag"/>
</owl:Class>
<!-- http://www.semanticweb.org/man/ontologies/2014/5/untitled-ontology-11#Subject -->
<owl:Class rdf:about="http://www.semanticweb.org/man/ontologies/2014/5/untitled-ontology-11#Subject"/>
<!-- http://www.semanticweb.org/man/ontologies/2014/5/untitled-ontology-11#System_Programming -->
<owl:Class rdf:about="http://www.semanticweb.org/man/ontologies/2014/5/untitled-ontology-11#System_Programming">
<owl:equivalentClass>
<owl:Restriction>
<owl:onProperty rdf:resource="http://www.semanticweb.org/man/ontologies/2014/5/untitled-ontology-11#hasTags"/>
<owl:someValuesFrom rdf:resource="http://www.semanticweb.org/man/ontologies/2014/5/untitled-ontology-11#Java"/>
</owl:Restriction>
</owl:equivalentClass>
<owl:equivalentClass>
<owl:Restriction>
<owl:onProperty rdf:resource="http://www.semanticweb.org/man/ontologies/2014/5/untitled-ontology-11#hasTags"/>
<owl:someValuesFrom rdf:resource="http://www.semanticweb.org/man/ontologies/2014/5/untitled-ontology-11#C++"/>
</owl:Restriction>
</owl:equivalentClass>
<rdfs:subClassOf rdf:resource="http://www.semanticweb.org/man/ontologies/2014/5/untitled-ontology-11#Subject"/>
</owl:Class>
<!-- http://www.semanticweb.org/man/ontologies/2014/5/untitled-ontology-11#Tag -->
<owl:Class rdf:about="http://www.semanticweb.org/man/ontologies/2014/5/untitled-ontology-11#Tag"/>
</rdf:RDF>
<!-- Generated by the OWL API (version 3.4.2) http://owlapi.sourceforge.net -->
1 ответ
Вы должны спросить о вещах, которые являются подклассами Tag. Таким образом, что-то вроде
?class rdfs:subClassOf* :Tag
Знак * означает, что вам нужно соответствовать пути 0 или более вхождений rdfs:subClassOf, так что? Class может быть Tag, или подкласс Tag, или или подкласс подкласса Tag и т. Д. Полный рабочий запрос будет:
prefix : <http://www.semanticweb.org/man/ontologies/2014/5/untitled-ontology-11#>
prefix owl: <http://www.w3.org/2002/07/owl#>
prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#>
select distinct ?subject where {
?subject owl:equivalentClass ?restriction .
?restriction owl:onProperty :hasTags .
?restriction ?restrictType ?class .
?class rdfs:subClassOf* :Tag
}
-------------------------------------------------------------------------------------------
| subject |
===========================================================================================
| :Java_programming |
| <http://www.semanticweb.org/man/ontologies/2014/5/untitled-ontology-11#C++_programming> |
| :System_Programming |
-------------------------------------------------------------------------------------------