0

这是一个名为的小型本体wildlife.owl,由 Protégé 创建,其中我有类animalcarnivoreherbivoreliongiraffe和个体Léo(a lion)、Gigi(a giraffe) 和Giginou(also a giraffe)。在本体中我只声明lion ⊏ carnivore ⊏ animal.

animal当我在 Protégé 的 DL Query 选项卡中询问 的实例时,我得到除其他外Léo(这是 a lion,因此是 a ,因此是carnivorean 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 查询中获得相同的结果?


感谢@UninformedUser 的回答,我现在知道我必须使用 Snap SPARQL 查询而不是 SPARQL 查询。

我的下一个问题与 Python 有关:当我使用 Owlready2 和 RDFlib 发送 SPARQL 查询时,我再次没有得到任何结果:

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 获取此查询?

4

1 回答 1

2

在调用推理器时,Owlready 不保留琐事推理,例如 is-a 及物性(例如狮子是动物的事实)。

对于琐碎的推论,您应该使用 SPARQL,如下例所示。由于SPARQL 语法(表示传递性) ,该?any_animal变量包含所有动物子类(包括animal其自身)。然后,我们采用任何类的实例。SubclassOf**?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 .
    }""")))
于 2020-03-23T09:24:35.423 回答