Protégé: Разные результаты между DL Query и SPARQL Query - PullRequest
0 голосов
/ 22 марта 2020

Вот небольшая онтология под названием wildlife.owl, созданная Protégé, в которой у меня есть классы animal, carnivore, herbivore, lion, giraffe и отдельные лица. Léo (lion), Gigi (giraffe) и Giginou (также giraffe). В онтологии я только заявляю, что lion ⊏ carnivore ⊏ animal.

Когда я запрашиваю экземпляры animal на вкладке DL Query в Protégé, я получаю, среди прочего, Léo (то есть lion, следовательно, carnivore, следовательно, animal).

Но когда я пишу следующий запрос SPARQ:

PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
PREFIX owl: <http://www.w3.org/2002/07/owl#>
PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>
PREFIX xsd: <http://www.w3.org/2001/XMLSchema#>
PREFIX me: <file:wildlife.owl#>
SELECT ?b
    WHERE { ?b rdf:type me:animal }

Я не получаю никакого экземпляра. Тот же результат, когда я заменяю me:animal на me:carnivore. Только когда я заменяю его на me:lion, я получаю желаемый результат Léo.

Почему DL Query делает вывод (что позволяет мне получить Léo как экземпляр класса animal), а не SPARQL Query?

Что я могу сделать, чтобы получить тот же результат в SPARQL Query? Благодаря ответу @UninformedUser теперь я знаю, что должен использовать Snap SPARQL Query, а не SPARQL Query.

Мой следующий вопрос касается Python: когда я снова отправляю SPARQL Query с использованием Owlready2 и RDFlib, снова Я не получаю результата:

from owlready2 import *
from rdflib import *
onto = get_ontology("wildlife.owl").load()
sync_reasoner([onto])
graph = default_world.as_rdflib_graph()
print(list(graph.query_owlready("""
PREFIX rdf-syntax: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
PREFIX me: <file:wildlife.owl#>
SELECT ?b WHERE {
?b rdf-syntax:type me:animal .
}""")))

Как мне получить этот запрос, используя OWL Reasoner?

1 Ответ

2 голосов
/ 23 марта 2020

При вызове рассудителя Owlready не сохраняет логические выводы, такие как транзитивность is-a (например, тот факт, что лев является животным).

Для тривиальных логических выводов лучше использовать SPARQL, как в пример ниже. Переменная ?any_animal содержит все подклассы животных (включая сам animal), благодаря синтаксису SubclassOf* SPARQL (* указывает на транзитивность). Затем мы берем любой экземпляр класса ?any_animal.

    from owlready2 import *
    from rdflib import *

    onto = get_ontology("http://test.org/wildlife.owl")

    with onto:
        class animal(Thing): pass
        class carnivore(animal): pass
        class lion(carnivore): pass

        lion()

    default_world.graph.dump()

    graph = default_world.as_rdflib_graph()

    print(list(graph.query_owlready("""
    PREFIX rdf-syntax: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
    PREFIX me: <http://test.org/wildlife.owl#>
    SELECT ?b WHERE {
    ?any_animal <http://www.w3.org/2000/01/rdf-schema#subClassOf>* me:animal .
    ?b rdf-syntax:type ?any_animal .
    }""")))
...