这里有一些不同的约束,但它们都可以在 OWL 中表示。让我们一次解决一个约束。
- X 的每个实例必须至少参与与属性 P1 或 P3 之一的关系。
这表示对于每个 x,要么有一个 y 使得 P1(x,y),要么有一个 z 使得 P2(x,z)。在 OWL 中,这表示为
X SubClassOf ((P1 some Thing) or (P2 some Thing))
类表达式P1 some Thing 表示由P1 与某个实体相关的事物的类。 P2 some Thing 也是如此。整个 subClassOf 公理说:“如果某物是 X,那么它要么是 P1 some Thing 要么是 P2 some Thing。” (如果您愿意,也可以使用P min 1 而不是P some Thing。这没有显着差异。)
- 参与与 P2 的关系的每个 X 实例也必须参与与 P1 的关系。
这表示对于每个 x,if 都有一个 y 使得 P2(x,y),那么还有一个 z 使得 P1(x,z)。另一种说法是“对于每个 x,如果 x 是一个 X 并且存在一个 y使得 P2(x,y),那么还有一个 z 使得 P1(x,z)。”这可以用另一个子类公理来表达:
(X and (P2 some Thing)) SubClassOf (P1 some Thing)
(为了概括起见,我在这个子类公理的左侧使用了X and (P2 some Thing)。在这个特定的情况下,由于X是P2的域,我们可以推断出P2 some Thing 是X 的子类,所以我们也可以只使用左边的P2 some Thing。)
- 但 X 的每个实例只能参与与 P1 和 P2 的关系或与 P3 的关系。
这表示如果某个 x 是一个 X 并且存在一个 y 使得 P3(x,y),则不存在 z,如 P1(x,z) 或 P2(x,y),反之亦然。您可以通过几种方式表示这一点。你可以使用两个子类公理:
(X and (P3 some Thing)) SubClassOf ((P1 max 0) and (P2 max 0))
(X and ((P1 some Thing) or (P2 some Thing))) SubClassOf (P3 max 0)
你也可以使用一个不相交的类公理(注意 X 出现在两边)
(X and (P3 some Thing)) DisjointWith (X and ((P1 some Thing) or (P2 some Thing)))
(正如我在前一个案例中所指出的,由于属性的域是 X,所以类 X and (P3 some Thing) 等价于 P3 some Thing。这些子类公理的左侧也可以是只需P3 some Thing 和(P1 some Thing) or (P2 some Thing),不相交公理中的类可以是P3 some Thing 和(P1 some Thing) or (P2 some Thing)。)
这是本体中的类和公理的样子(N3 格式):
:X a owl:Class ;
rdfs:subClassOf
[ a owl:Class ;
owl:unionOf ([ a owl:Restriction ;
owl:onProperty :P1 ;
owl:someValuesFrom owl:Thing
] [ a owl:Restriction ;
owl:onProperty :P2 ;
owl:someValuesFrom owl:Thing
])
] .
[] a owl:Class ;
rdfs:subClassOf
[ a owl:Restriction ;
owl:onProperty :P1 ;
owl:someValuesFrom owl:Thing
] ;
owl:intersectionOf (:X [ a owl:Restriction ;
owl:onProperty :P2 ;
owl:someValuesFrom owl:Thing
]) .
[] a owl:Class ;
owl:disjointWith
[ a owl:Class ;
owl:intersectionOf (:X [ a owl:Restriction ;
owl:onProperty :P3 ;
owl:someValuesFrom owl:Thing
])
] ;
owl:intersectionOf (:X [ a owl:Class ;
owl:unionOf ([ a owl:Restriction ;
owl:onProperty :P1 ;
owl:someValuesFrom owl:Thing
] [ a owl:Restriction ;
owl:onProperty :P2 ;
owl:someValuesFrom owl:Thing
])
]) .
空白节点使用说明
正如cmets中所指出的,上面的本体使用空白节点表示的类表达式作为两个“一般类公理”的主体,即关联两个类表达式的子类公理,两者都不是简单类标识符。原始的OWL Web Ontology Language
Reference 在附录 E:OWL DL 本体的经验法则中包括:
避免孤立的空白节点
一般来说,图中出现的空白节点要么代表未命名的个人,要么应该是以下之一:
- rdfs:subClassOf、owl:equivalentClass、owl:disjointWith、owl:someValuesFrom、owl:allValuesFrom 或 rdf:type 三元组的对象。
- 带有对象 owl:AllDifferent 的 rdf:type 三元组的主题。
- rdf:List 中的一个元素。
孤立的空白节点,即那些不是三元组对象的节点,通常是不允许的(除了上面描述的 owl:AllDifferent 情况)。
乍一看,上面提供的本体似乎违反了这一点,因为“一般类公理”(主语不是类标识符的类公理)将类表达式作为它们的主语。但是,3.2 Class Axioms 部分给出了语法,例如,rdfs:subClassOf axioms as
AXIOM SCHEMA:类描述 rdfs:subClassOf 类描述
该部分还包括注释:
注意:在 OWL Lite 中,rdfs:subClassOf 语句的主题必须是类标识符。对象必须是类标识符或属性限制。
这表明 附录 E 错误地忽略了某些允许“孤立空白节点”的情况。当然,这个建议并不规范。它以介绍开头:
以下规则给出了 RDF 图成为 DL 本体的条件的非正式表征。这并不是要取代 S&AS 中给出的特征,而是提供一些一般性的指示——如果你坚持这些指导方针,你更有可能生成 OWL DL 本体。 [强调]
为了确认,我们需要查看8. OWL Full, OWL DL and OWL Lite 部分,它描述了 OWL Full、OWL DL 和 Owl Lite 本体中允许的精确构造。该部分重申,在 OWL Lite 中,
rdfs:subClassOf 三元组的主题是类名,而 rdfs:subClassOf 三元组的对象是类名或限制;
但对 OWL DL 本体没有这样的限制。第 8 节确实要求,对于 OWL DL 本体,
所有公理都必须格式正确,没有遗漏或多余的组件,并且必须形成树状结构。最后一个约束意味着一个人引用的所有类和属性都分别显式类型化为 OWL 类或属性。
这表明
[] rdfs:subClassOf :Foo .
不是有效的 OWL DL,但
[] a owl:Class ;
rdfs:subClassOf :Foo .
是(当然,前提是:Foo 是owl:Class)。非规范的附录 E 只是错过了可以使用“孤立空白节点”的情况。一般类公理并不经常被使用,除非需要表示一些特别复杂的句子,所以这不是一个很难犯的错误。
有关一般类公理的更多信息,请参阅Being complex on the left-hand-side: General Concept Inclusions。