2

我认为我仍然对 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不明确做出断言的情况下让隐士推理出我的目标?

谢谢

4

2 回答 2

3

前提

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

更准确地说,这些是您可以执行的检查:

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

解决方案

仅当您明确声明这是 的唯一值时,您才能检查基数是否恰好为 1 。在这种情况下将是."value1":Ind1: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 )
                        ]
    ] .
于 2021-04-26T18:06:57.883 回答
2

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

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

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

于 2021-04-27T01:48:19.800 回答