我想我对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
的成员。但就成为:Class1
的成员而言,我对:Ind1
的看法并不相同。
我怀疑这与开放世界假设有关,并且:Ind1
可能还有另一个:prop1
断言。所以有几个问题:
- 我是否正确诊断了问题
- 我能举一个例子,说明我如何在不明确断言的情况下,让我的目标隐士推断
:Ind1
是:Class1
的成员吗
感谢
前提
OWL语义是在开放世界假设下定义的,因此您无法检查某个属性的基数是否正是N,因为即使没有声明,也可能存在其他属性实例。
更准确地说,这些是你可以做的检查:
基数检查 | 可能的答案 | 声音完成 |
---|---|---|
至少N |
是(如果N或更多( 我不知道(否则( | 是否 |
确切的N |
否(如果N+1或更多( 我不知道(否则( | 是否 |
最多N |
否(如果N+1或更多( 我不知道(否则( | 是否 |
感谢@horcurus提供提示。最后成功的是还将属性声明为owl:FunctionalProperty
。将属性声明编辑为:
:prop1 a owl:DatatypeProperty, owl:FunctionalProperty .
:prop2 a owl:DatatypeProperty, owl:FunctionalProperty .
这不需要在每个单独的声明中添加额外的限制。