owl 具体化与 rdf 具体化

owl reification vs. rdf reification

谈到具体化,最明显的解决方案是 RDF 具体化,但似乎 OWL2 对此有自己的词汇表,我想了解为什么。让我们举个例子:如果我有以下数据集(它是我们正在使用的数据集的一小部分,它使用 OWL):

@prefix :      <http://purl.bdrc.io/ontology/core/> .
@prefix owl:   <http://www.w3.org/2002/07/owl#> .
@prefix rdf:   <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .
@prefix rdfs:  <http://www.w3.org/2000/01/rdf-schema#> .

bdr:T123  a     :Topic ;
    rdfs:seeAlso    bdr:T1129 .

我可以像这样用 RDF 来具体化和注释 seeAlso 语句:

_:b0 a             rdf:Statement ;
     rdf:subject   bdr:T123 ;
     rdf:predicate rdfs:seeAlso ;
     rdf:object    bdr:T1129 ;
     rdfs:label    "reification 1" .

但很容易找到一些示例(here, here,等等),例如:

_:b1 a             owl:Axiom ;
     owl:subject   bdr:T123 ;
     owl:predicate rdfs:seeAlso ;
     owl:object    bdr:T1129 ;
     rdfs:label    "reification 2" .

第一个问题:我的理解是 owl:subject,predicate,object 被弃用了,是这样吗?

用OWL具体化和注释三元组的另一种方法似乎是:

_:b2 a                     owl:Axiom ;
     owl:annotatedSource   bdr:T123 ;
     owl:annotatedProperty rdfs:seeAlso ;
     owl:annotatedTarget   bdr:T1129 ;
     rdfs:label            "reification 3" .

(例如 Protege 使用的)但我无法理解 RDF 具体化+注释和 OWL 具体化+注释之间的区别... OWL 方式只是一个告诉推理者不要考虑具体化的方法?还有什么区别?

我相信 owl:{subject,predicate,object} 反映了对这些 RDF 属性的 URI 的早期提议。它们从来都不是任何规范的一部分,因此虽然没有正式弃用,但它们没有被使用。 owl:annotated{Source,Property,Target} URI 是 Ignazio 链接到的官方规范中的 URI。

我们有两个用于具体化的词汇表(RDF,OWL2)这一事实令人遗憾,但 OWL2 规范开发人员认为这是必要的。还有一些其他差异 - 例如OWL具体化的公理必须是空白节点。

RDF 具体化提供了一种在 RDF 中讨论语句的方法。具体化三元组说有一个类型语句的资源表达了 RDF 三元组 bdr:T123 rdfs:seeAlso bdr:T1129 所说的内容。然后你可以添加关于这个陈述的陈述,不管具体化的陈述是否真实。例如,您可以说该陈述代表 Akira 的观点,或者说该陈述在 1942 年至 2017 年间为真。

OWL 2 公理注释提供了一种添加有关公理的信息的方法。注释说明了关于公理的一些事情,而不一定是关于它所表达的内容。例如,可能会说公理是在2014年10月添加到ontology,这并不意味着该声明在2014年成立。OWL 2注释机制是根据[=18定义的=],其中一个公理注解是这样写的:

AnnotationAssertion(
    Annotation(rdfs:label "reification 1")
    rdfs:seeAlso bdr:T123 bdr:T1129
)

注意,在OWL2中,rdfs:seeAlso被定义为一个注解属性,所以原来的断言(bdr:T123 rdfs:seeAlso bdr:T1129)本身就是一个注解断言。如您所见,这里没有具体化。 As Ignazio saidowl:annotated* 项仅存在于到 RDF 图的映射中。

用编程来类比,你可以想象一个程序,其中一个人想要管理编程指令作为第一批 class 公民。例如,如果编程语言允许您编写:

MyClass.myMethod(param1,param2); // Instruction I1

并且你想要一个内存结构来告诉何时执行了这样的指令,你可以引入一个 class 来具体化指令:

Instruction ins = new Instruction(...); // Construct Instruction I1
ins.setExecutionTime("2017-08-13T10:42:42");

这类似于 RDF 具体化。现在,我也可以说指令是 Béatrice 添加到那里的代码中的。然而,这并不是说指令本身,而是它在代码中的出现。所以最好这样表达:

MyClass.myMethod(param1,param2); // this was added by Béatrice

这类似于 OWL 2 注释。