这里有一个名为wildlife.owl
的小本体,由Protégé创建,其中我有类animal
、carmivore
、lion
、giraffe
和个体léo
(lion
)、gigi
(giraffe
)和giginou
(也是giraffe
)。在本体论中,我只声明lion carnivore animal
。
当我在Protégé的DL Query选项卡中请求animal
的实例时,我得到的是Léo
(它是狮子
,因此是食肉动物
,因此是动物
)。
但当我编写以下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
类的实例),而不是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推理器得到这个查询?
当调用推理器时,Owlready不保留琐碎的推理,例如is-a传递性(例如lion是动物的事实)。
对于琐碎的推断,您应该使用SPARQL,如下例所示。由于子类*
SPARQL语法(*
表示可传递性),?any_animal
变量包含所有动物子类(包括animal
本身)。然后,我们取?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 .
}""")))
要运行查询,在工具栏中点击 运行 。如果查询语句是正确的,该查询将被运行,如果该查询应该返回数据,结果 选项卡会打开查询返回的数据。如果运行查询时发生错误,运行停止,显示相应的错误信息。 结果 选项卡以网格显示查询返回的结果数据。数据可以用两种模式显示:网格查看 和 表单查看。详细信息请看表查看 器。 提示:Navicat 支持返回 10 个结果集。 注意:你可以通过选择 查看 -> 显示结果 -
你可以在任何的服务器运行查询。在工具栏的下拉式列表中选择目标服务器和数据库。然后点击 “运行”。如果该查询语句是正确的,它将被运行。如果该查询应该返回数据,“结果”选项卡会打开并显示返回的数据。如果运行查询时发生错误,运行会停止并显示相应的错误信息。 “结果”选项卡以网格显示查询返回的结果数据。数据可以用三种模式显示:网格视图、树视图和 JSON 视图。详细信息请参阅数据查看器。 【注意】Navi
你可以在任何的服务器运行查询。在工具栏的下拉式列表中选择目标服务器、数据库和/或模式。然后点击 “运行”。如果该查询语句是正确的,它将被运行。如果该查询应该返回数据,“结果”选项卡会打开并显示返回的数据。如果运行查询时发生错误,运行会停止并显示相应的错误信息。 “结果”选项卡以网格显示查询返回的结果数据。数据可以用两种模式显示:网格视图和表单视图。详细信息请参阅数据查看器。 【注意】Navicat
你可以在任何的服务器运行查询。在工具栏的下拉式列表中选择目标服务器和数据库。然后点击 。如果该查询语句是正确的,它将被运行。如果该查询应该返回数据,“结果”选项卡会打开并显示返回的数据。如果运行查询时发生错误,运行会停止并显示相应的错误信息。 “结果”选项卡以网格显示查询返回的结果数据。数据可以用三种模式显示:网格视图、树视图和 JSON 视图。详细信息请参阅数据查看器。 【注意】Navicat
你可以在任何的服务器运行查询。在工具栏中,从下拉式菜单选择目标服务器、数据库和/或模式。然后点击 。如果该查询语句是正确的,它将被运行。如果该查询应该返回数据,“结果”选项卡会打开并显示返回的数据。如果运行查询时发生错误,运行会停止并显示相应的错误信息。 “结果”选项卡以网格显示查询返回的结果数据。数据可以用两种模式显示:网格视图和表单视图。详细信息请参阅数据查看器。 【注意】Navicat 支持
你可以在任何的服务器运行查询。在工具栏的下拉式列表中选择目标服务器和数据库。然后点击 “运行”。如果该查询语句是正确的,它将被运行。如果该查询应该返回数据,“结果”选项卡会打开并显示返回的数据。如果运行查询时发生错误,运行会停止并显示相应的错误信息。 “结果”选项卡以网格显示查询返回的结果数据。数据可以用三种模式显示:网格视图、树视图和 JSON 视图。详细信息请参阅数据查看器。 【注意】Navi