【问题标题】:Protégé: Différent results between DL Query and SPARQL QueryProtégé:DL Query 和 SPARQL Query 的结果不同
【发布时间】:2020-07-03 04:15:22
【问题描述】:

Here is a small ontology 称为 wildlife.owl,由 Protégé 创建,其中我有课程 animalcarnivoreherbivoreliongiraffe 和个人 Léo (a lion )、Gigigiraffe)和Giginou(也是giraffe)。在本体中我只声明lion ⊏ carnivore ⊏ animal

当我在 Protégé 的 DL Query 选项卡中询问 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 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 获取此查询?

【问题讨论】:

  • DL 查询选项卡使用 OWL 推理器(如果启用),而 SPARQL 选项卡不使用。 Snap SPARQL 插件也使用 OWL 推理器,但有一些限制 w.r.t。 SPARQL 语法。
  • 谢谢!如何让 Owlreader2 使用 OWL 推理器?
  • 我在 Python Owlreader2 代码中尝试了sync_reasoner(),但没有任何改变。
  • 在 Python 的 RDFlib 集合中的 RDF 工具是 OWL-RL,它可以进行 RDFS 或 RL 推理,但不能进行 DL。
  • API 被称为“owlready2”而不是“Owlreader2” - 请务必在提交之前检查您的文本,否则事情会变得混乱。

标签: sparql owl protege rdflib owlready


【解决方案1】:

在调用推理器时,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 .
    }""")))

【讨论】:

  • 非常感谢!我还有一个问题:在我得到[[wildlife.Léo], [wildlife.lion1], [wildlife.Gigi], [wildlife.Giginou]]的结果中,据我所知没有一个叫wildlife.lion1的人,这是从哪里来的?
  • 我的例子,lion1 来自“lion()”。在创建个体时,如果他们的 IRI 没有明确给出,Owlready 会生成一个新的 IRI,方法是使用小写的类 IRI,并添加一个数字(从 1 开始,如这里)。
猜你喜欢
  • 2016-07-25
  • 2015-01-11
  • 1970-01-01
  • 2016-06-03
  • 1970-01-01
  • 1970-01-01
  • 2016-09-05
  • 2016-11-12
  • 1970-01-01
相关资源
最近更新 更多