推理 OWL 基数限制 前提解决办法

问题描述

我想我仍然对 OWL 公理有根本性的误解 :(.

这是我创建的一个小测试本体:

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

: a owl:Ontology .

:prop1 a owl:DatatypeProperty .
:prop2 a owl:DatatypeProperty .

:Class1 owl:equivalentClass [
    a owl:Restriction ;
    owl:onProperty :prop1 ;
    owl:cardinality "1"^^xsd:int
  ] .

:Ind1 a owl:Namedindividual ;
  :prop1 "value1"^^xsd:string .

:Class2 owl:equivalentClass [
    a owl:Restriction ;
    owl:onProperty :prop2 ;
    owl:minCardinality "1"^^xsd:int
  ] .

:Ind2 a owl:Namedindividual ;
  :prop2 "value2"^^xsd:string .

当我在 Protege 中运行 hermit 推理器时,我得到了 :Ind2 的预期结果,即它是 :Class2 的成员。但是对于:Ind1,我对成为:Class1 的成员的看法不一样。

我怀疑这与开放世界假设有关,并且 :Ind1 可能还有另一个 :prop1 断言。所以有几个问题:

  • 我是否正确诊断了问题?
  • 我能否举一个例子,说明如何在不明确断言的情况下让隐士推断:Ind1:Class1 的成员?

谢谢

解决方法

前提

OWL 语义是在 open-world assumption 下定义的,因此您无法检查某个属性的基数是否恰好 N,因为即使未声明,也可能存在其他属性实例。

更准确地说,您可以执行以下检查:

基数检查 可能的答案 声音 完成
至少 N (如果 N 或更多)
我不知道(否则)
没有
正好 N (如果 N+1 或更多)
我不知道(否则)
没有
至多 N (如果 N+1 或更多)
我不知道(否则)
没有

解决办法

只有当您明确声明 "value1":Ind1 的唯一值时,您才能检查基数是否恰好 1。在这种情况下,:Ind1 将成为 :Class1 的一部分。

在 FOL 中:

∀x.(R(Ind1,x) → x = "value1")

在深度学习中:

∃R⁻.{Ind1} ⊑ {"value1"}

在 OWL2 中(未测试):

:Ind1
  a owl:NamedIndividual ;
  a [ a                 owl:Restriction ;
      owl:onProperty    :prop1 ;
      owl:allValuesFrom [ a          rdfs:Datatype ;
                          owl:oneOf  ( "value1"^^xsd:string )
                        ]
    ] .
,

感谢@horcrux 提供提示。最终起作用的是还将属性声明为 owl:FunctionalProperty。将属性声明编辑为:

:prop1 a owl:DatatypeProperty,owl:FunctionalProperty .
:prop2 a owl:DatatypeProperty,owl:FunctionalProperty .

这不需要为每个单独的声明添加额外的限制。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...