您可以使用通用子类公理在 OWL 中表示一些相当复杂的条件句。让我们看几个例子。如果您尝试更简单的事情,请说
Students with at least five dogs have at least one cat.
这是量化条件的简写“对于所有 x,如果x 是一个至少有五只狗的学生,那么x 至少有一只猫,你可以在 OWL 中使用
(Student and hasPet min 5 Dog) subClassOf (hasPet some Cat)
这些都是匿名类表达式,但您可以定义一些等效的类来简化一些事情:
StudentWithAtLeastFiveDogs equivalentClass (Student and hasPet min 5 Dogs)
CatOwner equivalentClass (hasPet some Cat)
StudentWithAtLeastFiveDogs subClassOf CatOwner
现在,您的示例是Bob 是一名学生,如果 Bob 有 5 条狗,那么他至少有 1 只猫。 那里有两句话。第一个很容易编码
Bob a Student
第二个有点复杂。你是说鲍勃是这样一类事物的一员,如果他们至少有五只狗,那么他们至少有一只猫。A(物质)条件“If P then Q”在逻辑上等价于析取“(not P) or Q”。所以我们说 Bob 属于没有至少五个点或至少有一只猫的事物类别。类表达式是
(not (hasPet min 5 Dog)) or (hasPet some Cat)
现在我们对 Bob 的了解是
Bob a Student
Bob a (not (hasPet min 5 Dog)) or (hasPet some Cat)
您可以为该匿名类表达式定义一个等效类,但我怀疑它会在大多数语言中非常自然地呈现。这是包含关于 Bob 的知识的本体的样子(N3 格式):
@prefix : <http://www.example.com/example#> .
@prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> .
@prefix owl: <http://www.w3.org/2002/07/owl#> .
@prefix xsd: <http://www.w3.org/2001/XMLSchema#> .
@prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .
<http://www.example.com/example>
a owl:Ontology .
:Cat a owl:Class .
:Student
a owl:Class .
:Dog a owl:Class .
:hasPet
a owl:ObjectProperty .
:Bob a :Student , owl:NamedIndividual ;
a [ a owl:Class ;
owl:unionOf ([ a owl:Class ;
owl:complementOf
[ a owl:Restriction ;
owl:minQualifiedCardinality
"5"^^xsd:nonNegativeInteger ;
owl:onClass :Dog ;
owl:onProperty :hasPet
]
] [ a owl:Restriction ;
owl:onProperty :hasPet ;
owl:someValuesFrom :Cat
])
] .
同样的方法可用于数据类型属性和对其值的限制。例如,如果说“如果 Bob 体重至少 60 公斤,那么他至少有 180 厘米高”,我们可以说 Bob 是这样一类事物的一个元素,如果它们的体重至少为 60 公斤,那么它们至少是180 厘米高,或同等重量,重量不超过 60 公斤或至少 180 厘米高的物品类别。在曼彻斯特语法中,类表达式看起来像
(not (hasWeight some int[>= 60])) or (hasHeight some int[>= 180])
本体 N3 序列化的相关部分是:
:Bob a [ a owl:Class ;
owl:unionOf ([ a owl:Class ;
owl:complementOf
[ a owl:Restriction ;
owl:onProperty :hasWeight ;
owl:someValuesFrom
[ a rdfs:Datatype ;
owl:onDatatype xsd:int ;
owl:withRestrictions
([ xsd:minInclusive 60
])
]
]
] [ a owl:Restriction ;
owl:onProperty :hasHeight ;
owl:someValuesFrom
[ a rdfs:Datatype ;
owl:onDatatype xsd:int ;
owl:withRestrictions
([ xsd:minInclusive 180
])
]
])
] .