问题描述
这个本体似乎不太符合我的想法:
@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://test/> .
:AClass a owl:Class .
:BClass a owl:Class .
# Class 1
:cclass owl:equivalentClass [
owl:intersectionOf (
:AClass
:BClass
)
] .
用隐士推理器将其加载到 protege 中,我不认为 cclass
是 AClass
或 BClass
的子类。然而,以下工作:
.
.
.
# Class 1
:cclass owl:equivalentClass [
rdf:type owl:Class ;
owl:intersectionOf (
:AClass
:BClass
)
] .
很好奇为什么我需要添加 rdf:type owl:Class
。
-
[ ... ]
不是自动属于owl:Class
类型的吗? - 或者是两个
owl:Class
的交集使它成为这样?
谢谢
解决方法
在您的第一个片段中,很明显交集必须是 OWL 类,因为它是 OWL 类的交集。因此,:CClass
也必须是 OWL 类。然而,这意味着一些基于术语定义方式的推理。 OWL 解析器不必应用推理,并且应该明确指向术语是 OWL 类、对象属性、数据类型属性、个体、本体、注释属性、数据类型还是某种其他类型的注释。在 owl:intersectionOf
公理的情况下,您可能声明的是数据类型,而不是 OWL 类。所以只有通过查看列表的内容,并找出其中的术语是如何声明的(即,:AClass
和 :BClass
),您才能最终推断出它们都是 OWL 类,因此交集是一个 OWL 类,因此它等价于一个 OWL 类,因此 :CClass
应该或可以作为一个 OWL 类出现在编辑器中。为了稳健起见,OWL 工具可以自由地进行这种推断,但 OWL 标准并未强制要求这样做。
编辑澄清:该标准定义了一种将 RDF 图映射到 OWL 的抽象语法的方法,其中使用 owl:intersectionOf
的构造可以映射到类定义或数据类型定义。标准建议区分这两种情况的唯一方法是明确添加 rdf:type owl:Class
或 rdf:type rdfs:Datatype
(参见 OWL 2 Web Ontology Language Mapping to RDF Graphs 的表 12 和表 13)。 OWL 解析器可能会超出标准推荐的范围并根据上下文推断出某些类型,但他们不必这样做。我知道 OWL API 做了一些这样的句法推断,以避免在每个无效本体上崩溃。