受保护:DL 查询和 SPARQL 查询之间的不同结果
Protégé: Différent results between DL Query and SPARQL Query
Here is a small ontology 称为 wildlife.owl
,由 Protégé 创建,其中我有 classes animal
、carnivore
、herbivore
、lion
、giraffe
,以及个人 Léo
(一个 lion
)、Gigi
(一个 giraffe
)和 Giginou
(也是一个 giraffe
).在 ontology 我只声明 lion ⊏ carnivore ⊏ animal
.
当我在 Protégé 的 DL 查询选项卡中请求 animal
的实例时,除其他外,我得到 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 查询进行推理(允许我获得 Léo
作为 animal
class 的实例)而不是 SPARQL 查询?
如何才能在 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 获取此查询?
调用推理器时,Owlready 不保留琐碎的推理,例如 is-a 传递性(例如狮子是动物这一事实)。
对于简单的推理,您应该使用 SPARQL,如下例所示。由于 SubclassOf*
SPARQL 语法(*
表示传递性),?any_animal
变量包含所有动物子 classes(包括 animal
本身)。然后,我们采用 ?any_animal
class.
的任何实例
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 .
}""")))
Here is a small ontology 称为 wildlife.owl
,由 Protégé 创建,其中我有 classes animal
、carnivore
、herbivore
、lion
、giraffe
,以及个人 Léo
(一个 lion
)、Gigi
(一个 giraffe
)和 Giginou
(也是一个 giraffe
).在 ontology 我只声明 lion ⊏ carnivore ⊏ animal
.
当我在 Protégé 的 DL 查询选项卡中请求 animal
的实例时,除其他外,我得到 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 查询进行推理(允许我获得 Léo
作为 animal
class 的实例)而不是 SPARQL 查询?
如何才能在 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 获取此查询?
调用推理器时,Owlready 不保留琐碎的推理,例如 is-a 传递性(例如狮子是动物这一事实)。
对于简单的推理,您应该使用 SPARQL,如下例所示。由于 SubclassOf*
SPARQL 语法(*
表示传递性),?any_animal
变量包含所有动物子 classes(包括 animal
本身)。然后,我们采用 ?any_animal
class.
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 .
}""")))