Как делать рассуждения в Йене через Sparql Query

Я использую Jena и Sparql для запроса файла онтологии.

я имею

  1. Класс Tag с двумя подклассами: C++ и Java.
  2. Предмет класса с несколькими подклассами, которые обозначают определенные предметы университета: "Программирование на C++", "Системное программирование", "Программирование на Java" и т. д.
  3. 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                                                                     |
-------------------------------------------------------------------------------------------
Другие вопросы по тегам