问题描述
我想我仍然对 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 .
这不需要为每个单独的声明添加额外的限制。