为什么需要一个空白节点来定义 OWL 中的等效类?以下两个不相等吗?
:Wine owl:equivalentClass [
a owl:Class ;
owl:unionOf (:RedWine :RoséWine :WhiteWine) ] .
和
:Wine a owl:Class .
:Wine owl:unionOf (:RedWine :RoséWine :WhiteWine) .
为什么需要一个空白节点来定义 OWL 中的等效类?以下两个不相等吗?
:Wine owl:equivalentClass [
a owl:Class ;
owl:unionOf (:RedWine :RoséWine :WhiteWine) ] .
和
:Wine a owl:Class .
:Wine owl:unionOf (:RedWine :RoséWine :WhiteWine) .
这与Why use owl:Restriction as own:EquivalenceClass's property的重复并不完全一致?,但答案大致相同:从 RDF 到 OWL 的映射是这样定义的,当您将 RDF 映射到 OWL 时,这个缩写不会产生您想要的本体。不管你最终是否会模棱两可,我不确定。但是,您最终不会得到您想要的本体。从 RDF 到 OWL 的相关翻译说,当你有:
_:x rdf:type owl:Class .
_:x owl:unionOf T(SEQ y1 ... yn) .
{ n ≥ 2 and CE(yi) ≠ ε for each 1 ≤ i ≤ n }
你得到一个类表达式,ObjectUnionOf(CE(y1) ... CE(yn))。根据3.2.4表达式解析,先解析表达式,再解析公理。重要的是,“每次匹配模式时,匹配的三元组都会从 G 中删除。” 这意味着我们解析 RDF 的表达式:
:Wine rdf:type owl:Class .
:Wine owl:unionOf (:RedWine :RoséWine :WhiteWine) .
我们得到类表达式RedWine ∪ RoseWine ∪ WhiteWine,然后从图中删除三元组。稍后,在3.2.5 Parsing of Axioms中,我们将开始寻找?x rdf:type owl:Class的实例,以获得声明 axiom Declaration(Class(?x))。但是,我们在解析 unionOf 表达式时删除了三元组:Wine rdf:type owl:Class 。现在我们没有 Wine 作为本体中的一个类。
现在,缩写不起作用的原因是因为翻译不支持它。翻译在遇到三元组时会从图中删除它们,并首先删除表达式,这将使必要的三元组无法用于声明公理。但是,我们可以想象一个翻译公理不会删除它们;它可能只是先解析表达式,然后再解析公理。我认为您所描述的缩写是
:A owl:equivalentClass :B .
:B ?p ?o .
可以替换为:
:A ?p ?o .
只要对 :B的所有?p ?o都完成了。这对于unionOf表达式可能不是问题,因为每个unionOf表达式都需要一个?p ?o(其中?p是owl:unionOf而?o是一个 RDF 列表)。但是,对于任何需要一个以上三元组的类表达式,如果有多个相同类型的等效类表达式,则可能会变得模棱两可。例如,如果你有三元组
_:x rdf:type owl:Restriction .
_:x owl:onProperty y .
_:x owl:someValuesFrom z .
要指定someValuesFrom限制,那么一旦你有两个,你就无法知道哪个owl:onProperty与哪个owl:someValuesFrom一起使用。这就是为什么使用 owl:Restriction 作为 own:EquivalenceClass 的属性中出现的问题?如果owl:unionOf的编码稍有不同,就会出现同样的问题。例如,如果 A ∪ B 被编码为:
_:x rdf:type owl:Class .
_:x owl:unionMember :A .
_:x owl:unionMember :B .
那么如果你试图对公理进行编码,你会遇到歧义:
A ≡ B ∪ C
A ≡ D ∪ E
你会得到编码:
:A rdf:type owl:Class .
:A owl:unionMember :B .
:A owl:unionMember :C .
:A owl:unionMember :D .
:A owl:unionMember :E .
您可能会读回:
A ≡ B ∪ C ∪ D ∪ E
这在逻辑上是不等价的。