【问题标题】:Why is this DL-Query not returning any individuals?为什么这个 DL-Query 没有返回任何个人?
【发布时间】:2013-05-26 08:00:16
【问题描述】:

此 DL-Query 未返回任何个人:

  • 查询(Protégé 语法):hasPet exactly 1 DomesticAnimal

这是本体的一部分:

:hasPet a           owl:ObjectProperty;
        rdfs:domain :Human;
        rdfs:range  :DomesticAnimal;
        owl:inverseOf : petOf;


:Joe    a           :Human;
        hasPet      :Lassy.

:Bob    a           :Human;
        hasPet      :Sparkey, Lucky.

查询:

  • petOf value Bob 返回 SparkeyLucky
  • petOf value Joe 返回Lassy
  • hasPet exactly 1 不返回任何内容。

为什么最后一个查询没有返回Joe? 我在 Protégé 中使用 Pellet、HermiT 和 FaCT++ 进行了尝试,但没有成功。

【问题讨论】:

  • 除了下面的答案,还可以看看this question的答案。

标签: rdf owl protege dlquery description-logic


【解决方案1】:

类表达式hasPet exactly 1 DomesticAnimal 恰好具有那些通过属性hasPet 与恰好一个DomesticAnimal 相关的个体作为实例。 正好一个表示至少一个不超过一个。基于三元组

:Joe :hasPet :Lassy .
:Bob :hasPet :Sparkey ;
     :hasPet :Lucky .

我们知道 Joe 和 Bob 都有至少一个宠物,但我们不知道他们可能有多少。 Joe 可能有 Lassy 以外的其他宠物,所以我们不知道 Joe 确切地有一只宠物。 Sparkey 和 Lucky 有可能碰巧是同一个人,所以 Bob 至少有一只宠物,但 Bob 拥有的宠物数量没有上限。

OWL 和 RDF 一样,生成了open world assumption,这意味着 OWL 并不假定所提供的数据是对世界上所有真实事物的详尽枚举。如果是这样,推理就没有意义了。没有s p o 的断言并不意味着NOT( s p o ),而只是对s p o 尚无判断。

不过,您可以向数据添加更多知识,以获得您想要的结论。您用以下方式描述乔:

Joe a Human ;
    hasPet Lassy ;
    hasPet only { Lassy } .

Lassy a DomesticAnimal .

由此你将能够推断出

Joe a (hasPet exactly 1 DomesticAnimal) .

对于 Bob,您似乎认为 Sparkey 和 Lucky 是不同的动物,所以您需要owl:differentFrom

Bob a Human ;
    hasPet Sparkey, Lucky .

Sparkey a DomesticAnimal .

Lucky a DomesticAnimal ; 
      owl:differentFrom Sparkey .

我没有在这些公理中包含Bob hasPet only { Sparkey, Lucky },因为它们没有必要推断 Bob 拥有不止一只宠物,但您可以包含它。我还只包含了一个可以做出的owl:differentFrom 断言。现在已知 Bob 有两个 不同 宠物,因此已知 hasPet exactly 1 DomesticAnimal。将此数据加载到 Protégé 后,DL 查询 hasPet exactly 1 DomesticAnimal 将按预期工作:

示例本体

如果您希望能够将此结构快速加载到 Protégé 中,这里有一个包含上述个体、属性和公理的本体。我没有定义petOf 属性,但您仍然可以将前两个查询分别运行为inverse hasPet value Joeinverse hasPet value Bob 并获得预期结果。

@prefix :        <http://www.example.com/owa#> .
@prefix rdfs:    <http://www.w3.org/2000/01/rdf-schema#> .
@prefix owl:     <http://www.w3.org/2002/07/owl#> .
@prefix xsd:     <http://www.w3.org/2001/XMLSchema#> .
@prefix rdf:     <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .
@prefix owa:     <http://www.example.com/owa#> .

owa:Bob
      a       owl:NamedIndividual , owa:Human ;
      owa:hasPet owa:Sparkey , owa:Lucky .

owa:Sparkey
      a       owl:NamedIndividual , owa:DomesticAnimal .

owa:Lassy
      a       owl:NamedIndividual , owa:DomesticAnimal .

[]    a       owl:AllDifferent ;
      owl:distinctMembers (owa:Lucky owa:Sparkey) .

owa:Joe
      a       owl:NamedIndividual , owa:Human ;
      a       [ a       owl:Restriction ;
                owl:allValuesFrom
                        [ a       owl:Class ;
                          owl:oneOf (owa:Lassy)
                        ] ;
                owl:onProperty owa:hasPet
              ] ;
      owa:hasPet owa:Lassy .

<http://www.example.com/owa>
      a       owl:Ontology .

owa:Lucky
      a       owl:NamedIndividual , owa:DomesticAnimal .

owa:Human
      a       owl:Class .

owa:hasPet
      a       owl:ObjectProperty .

owa:DomesticAnimal
      a       owl:Class .

【讨论】:

  • 很好的答案!我也在努力寻找解决方案——愚蠢的开放世界假设!
  • 非常感谢您的回答。 Protege 允许您一键使所有声明的个人与众不同。是否有一项功能允许您自动对每个人的断言属性创建限制以断言没有其他可能的值(即模拟封闭世界假设)?你如何开发你的本体?你都是用 Turtle 写的吗?
  • @loopasam ... 是的! not X 是否遵循 DD' ? 不。”在逻辑系统中,成为monotonic 往往要容易得多,这大致意味着,添加信息永远不会让你撤回 先前的结论。如果您有一个庞大的数据集,例如 DBpedia,并且可以从其中的一个非常小的子集证明 P,那么您真的 不需要搜索整个其余数据,以确保数据集中没有其他数据会让您撤回。
  • @Anthony 这就是我提供整个本体的原因之一。你可以保存它并在 Protégé 中打开它,看看事物是如何表示的。我在回答中使用的语法实际上非常接近。例如,一旦您定义了个人 Joe,转到 Individuals 选项卡,选择 Joe,点击 Joe 旁边的“+”按钮b>类型,转到类表达式编辑器选项卡,然后输入例如hasPet only { Lassy }。 (这取决于属性 hasPet 和已定义的单个 Lassy。)同样,您可以键入 hasPet exactly 1 DomesticAnimal
  • @Anthony Protege 输入语法大致是OWL2 Manchester Syntax,尽管您只会使用类表达式。 CO-ODE page 可能更有用。 OWL Primer 也有代码示例(但您需要使用 1.2 OWL Syntaxes 中的“显示曼彻斯特语法”按钮启用曼彻斯特语法。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-10-10
  • 2018-12-28
  • 1970-01-01
  • 2013-03-25
  • 1970-01-01
  • 2023-01-02
  • 2021-01-11
相关资源
最近更新 更多