OWL 基数限制的推理
Reasoning over OWL cardinality restriction
我想我对 OWL 公理还有一个根本性的误解 :(.
这是我创建的一个小测试ontology:
@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 中的隐士推理者对此进行处理时,我得到了:Ind2
的预期结果,即它是:Class2
的成员。但是关于 :Class1
.
的成员,我对 :Ind1
的看法并不相同
我怀疑这与开放世界假设有关,并且 :Ind1
可能还有另一个 :prop1
断言。那么几个问题:
- 我是否正确诊断了问题?
- 我可以举例说明如何让隐士在不明确断言的情况下推理
:Ind1
是 :Class1
的成员吗?
谢谢
前提
OWL语义是在open-world assumption下定义的,所以你不能检查某个属性的基数是否恰好N ,因为即使未声明,也可能存在其他 属性 个实例。
更准确地说,这些是您可以执行的检查:
Cardinality check
Possible answers
Sound
Complete
At-least N
Yes (if N or more)
I don't know (otherwise)
Yes
No
Exactly N
No (if N+1 or more)
I don't know (otherwise)
Yes
No
At-most N
No (if N+1 or more)
I don't know (otherwise)
Yes
No
解决方案
只有在 明确 声明 "value1"
是:Ind1
。在这种情况下 :Ind1
将成为 :Class1
.
的一部分
在 FOL 中:
∀x.(R(Ind1, x) → x = "value1")
在 DL 中:
∃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 .
这不需要对每个单独的声明添加额外的限制。
我想我对 OWL 公理还有一个根本性的误解 :(.
这是我创建的一个小测试ontology:
@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 中的隐士推理者对此进行处理时,我得到了:Ind2
的预期结果,即它是:Class2
的成员。但是关于 :Class1
.
:Ind1
的看法并不相同
我怀疑这与开放世界假设有关,并且 :Ind1
可能还有另一个 :prop1
断言。那么几个问题:
- 我是否正确诊断了问题?
- 我可以举例说明如何让隐士在不明确断言的情况下推理
:Ind1
是:Class1
的成员吗?
谢谢
前提
OWL语义是在open-world assumption下定义的,所以你不能检查某个属性的基数是否恰好N ,因为即使未声明,也可能存在其他 属性 个实例。
更准确地说,这些是您可以执行的检查:
Cardinality check | Possible answers | Sound | Complete |
---|---|---|---|
At-least N | Yes (if N or more) I don't know (otherwise) |
Yes | No |
Exactly N | No (if N+1 or more) I don't know (otherwise) |
Yes | No |
At-most N | No (if N+1 or more) I don't know (otherwise) |
Yes | No |
解决方案
只有在 明确 声明 "value1"
是:Ind1
。在这种情况下 :Ind1
将成为 :Class1
.
在 FOL 中:
∀x.(R(Ind1, x) → x = "value1")
在 DL 中:
∃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 .
这不需要对每个单独的声明添加额外的限制。