如何将带注释的公理序列化为 RDF 形式?

How to serialize an annotated axiom to the RDF form?

让我们采用公理 SubClassOf( DataAllValuesFrom( <d> xsd:boolean ) ObjectSomeValuesFrom( <o> owl:Thing ) Annotation( rdfs:comment "comm"^^xsd:string ) ).

这个公理在 RDF 的形式下应该是什么样的?

如果我理解 the specification 正确, 只有一种方法:

示例 1:

@prefix rdf:   <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .
@prefix owl:   <http://www.w3.org/2002/07/owl#> .
@prefix xsd:   <http://www.w3.org/2001/XMLSchema#> .
@prefix rdfs:  <http://www.w3.org/2000/01/rdf-schema#> .

<o>     a       owl:ObjectProperty .

[ a                      owl:Axiom ;
  rdfs:comment           "comm" ;
  owl:annotatedProperty  rdfs:subClassOf ;
  owl:annotatedSource    [ a                  owl:Restriction ;
                           rdfs:subClassOf    _:c2 ;
                           owl:allValuesFrom  xsd:boolean ;
                           owl:onProperty     <d>
                         ] ;
  owl:annotatedTarget    _:c2
] .

<d>     a       owl:DatatypeProperty .

_:c2    a                   owl:Restriction ;
        owl:onProperty      <o> ;
        owl:someValuesFrom  owl:Thing .

但是,突然发现有人对规范有不同的理解。 而上面的公理可以甚至必须写成如下形式:

示例 2:

@prefix rdf:   <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .
@prefix owl:   <http://www.w3.org/2002/07/owl#> .
@prefix xsd:   <http://www.w3.org/2001/XMLSchema#> .
@prefix rdfs:  <http://www.w3.org/2000/01/rdf-schema#> .

<o>     a       owl:ObjectProperty .

<d>     a       owl:DatatypeProperty .

[ a                      owl:Axiom ;
  rdfs:comment           "comm" ;
  owl:annotatedProperty  rdfs:subClassOf ;
  owl:annotatedSource    [ a                   owl:Restriction ;
                           rdfs:subClassOf     [ a                  owl:Restriction ;
                                                 owl:allValuesFrom  owl:Thing ;
                                                 owl:onProperty     <o>
                                               ] ;
                           owl:onProperty      <d> ;
                           owl:someValuesFrom  xsd:boolean
                         ] ;
  owl:annotatedTarget    [ a                  owl:Restriction ;
                           owl:allValuesFrom  owl:Thing ;
                           owl:onProperty     <o>
                         ]
] .

那么,问题来了,谁是对的?哪个例子是正确的?

在我看来,第二个 RDF(示例 2)违反了对 RDF 具体化和数据连接性的理解。 但我无法将此传达给对手。 我有基于规范的参数 (稍后可能会作为答案提供), 但事实证明这些论点在他眼里是站不住脚的, 所以我在这里呼吁广泛的专家来获得新的论点, 或者,也许是为了改进我自己对这个概念的看法: 没有人(除了我)说过示例 1 是唯一正确的方法。
所以最好有规范,获得第一个(或第二个)示例正确的证明。

如果我没理解错的话,我的对手诉诸于规范中的以下短语:
In the mapping, each generated blank node (i.e., each blank node that does not correspond to an anonymous individual) is fresh in each application of a mapping rule.。 他认为,这意味着 super-class ObjectSomeValuesFrom( <o> owl:Thing ) 在写入 RDF 时必须两次获取 b 节点。
如何证明这不是真的(或真的)?

谢谢。

所以,由于还没有答案,这里是我自己的,这是基于我对官方规范的理解https://www.w3.org/TR/owl2-mapping-to-rdf/。 欢迎任何意见和改进。


1.简介

规范只定义了运算符T(E)TANN(ann, y),其中annAnnotation( AP av )Ey是一些对象. 规范还说:The definition of the operator T uses the operator TANN in order to translate annotations. 对于 2.1 Translation of Axioms without Annotations 部分中描述的操作 2.3 Translation of Axioms with Annotations 部分没有自己的名字。 运算符 TANNTable 22.2 Translation of Annotations 中定义, 但它是注释的注释,它正在生成一个具有根三元组 _:x rdf:type owl:Annotation 的 b 节点。 使用根三元组 _: x rdf: type owl: Axiom 创建顶级注释的运算符在 2.3.1 Axioms that Generate a Main Triple 部分中进行了描述,但也没有合适的名称。 而且,为了演示,我要为这个 "operator" 引入一个新名称:ANN。 注意 1:不要将它与 3.2.2 Parsing of Annotations 部分中的函数 ANN 混淆——我们不需要最后那个东西;这个答案只是关于映射,而不是解析。 注 2:我不是在写我自己的规范,我只是想用新的缩写来解释我的愿景。 一般情况下这种注入可能不正确,但为了演示目的,我认为它是可以的。

此外,让我们将公理 SubClassOf 视为具有两个操作数的运算符。 它在 2.1 Translation of Axioms without Annotations 部分的 Table 1 中描述如下:

SubClassOf( CE1 CE2 ) = T(CE1) rdfs:subClassOf T(CE2) .

我们还考虑一个重载运算符 SubClassOf,它有两个操作数和可变参数的注释。 SubClassOf( CE1 CE2 annotations { n > 1 } )2.3.1 Axioms that Generate a Main Triple 部分定义如下:

s p xlt .
_:x rdf:type owl:Axiom .
_:x owl:annotatedSource s .
_:x owl:annotatedProperty p .
_:x owl:annotatedTarget xlt .
TANN(annotation1, _:x)
...
TANN(annotationm, _:x) 

为简单起见,我们只讨论一种只有一个顶级注释的情况。 因此,该运算符是 SubClassOf( CE1, CE2, ann),它看起来像这样:

T(CE1) rdfs:subClassOf T(CE2) .
ANN(CE1, CE2, rdfs:subClassOf, ann) .

这是一个新的运算符ANN,类似于TANN,但接受两个定义谓词的操作数,注释和常量。 它产生根三元组 _:x rdf:type owl:Axiom 并且所有其他三元组类似于上面示例中运算符 TANN 的三元组,因此 ANN(s, xlt, p, ann) 是:

_:x rdf:type owl:Axiom .
_:x owl:annotatedSource s .
_:x owl:annotatedProperty p .
_:x owl:annotatedTarget xlt .
TANN(ann, _:x)

2.没有注释的 ontology。

现在让我们考虑问题中的示例,其中第一个操作数是 DataAllValuesFrom,第二个是 ObjectSomeValuesFrom

SubClassOf( DataAllValuesFrom( <d> xsd:boolean ) ObjectSomeValuesFrom( <o> owl:Thing ) ) .

TURTLE 中它看起来像这样:

<d>     a       owl:DatatypeProperty .
<o>     a       owl:ObjectProperty .
[ rdf:type owl:Restriction ;
                        owl:onProperty <d> ;
                        owl:allValuesFrom xsd:boolean ;
                        rdfs:subClassOf [ rdf:type owl:Restriction ;
                                          owl:onProperty <o> ;
                                          owl:someValuesFrom owl:Thing
                                        ]
                      ] ;

NTRIPLES 语法中的相同 ontology:

<d> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://www.w3.org/2002/07/owl#DatatypeProperty> .
<o> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://www.w3.org/2002/07/owl#ObjectProperty> .
_:c1 <http://www.w3.org/2000/01/rdf-schema#subClassOf> _:c2 .
_:c1 <http://www.w3.org/2002/07/owl#allValuesFrom> <http://www.w3.org/2001/XMLSchema#boolean> .
_:c1 <http://www.w3.org/2002/07/owl#onProperty> <d> .
_:c1 <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://www.w3.org/2002/07/owl#Restriction> .
_:c2 <http://www.w3.org/2002/07/owl#someValuesFrom> <http://www.w3.org/2002/07/owl#Thing> .
_:c2 <http://www.w3.org/2002/07/owl#onProperty> <o> .
_:c2 <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://www.w3.org/2002/07/owl#Restriction> .

SubClassOf 是生成主三元组的公理(参见 2.3.1 Axioms that Generate a Main Triple 部分)。 所以,这里的主要三元组 (s p xlt) 是 _:c1 <http://www.w3.org/2000/01/rdf-schema#subClassOf> _:c2, 其中 s(主语,在示例 DataAllValuesFrom( <d> xsd:boolean ) 中)是 _:c1p(谓语)是 rdfs:subClassOfxltxlt代表一个空节点,一个IRI,或者一个字面量,这里是对象,例子中ObjectSomeValuesFrom( <o> owl:Thing ))是_:c2.

注意,在ONT-API中可以通过以下代码生成这样的TURTLE:

OntModel m = OntModelFactory.createModel().setNsPrefixes(OntModelFactory.STANDARD);
m.createDataAllValuesFrom(m.createDataProperty("d"), m.getDatatype(XSD.xboolean))
    .addSuperClass(m.createObjectSomeValuesFrom(m.createObjectProperty("o"), 
    m.getOWLThing()));
m.write(System.out, "ttl");

3.运算符的行为 T.

规范说:In the mapping, each generated blank node (i.e., each blank node that does not correspond to an anonymous individual) is fresh in each application of a mapping rule.。 我相信这只是关于运算符 T 的。 这个说法与Parsing OWL, Structure Sharing, OWL1 spec中所说的大致相符: In practice, this means that blank nodes (i.e. those with no name) which are produced during the transformation and represent arbitrary expressions in the abstract syntax form should not be "re-used".。 在一般情况下,对于 ONT-API 和 OWL-API 都不是问题,所有这些行为都相似。 以下代码为 OWL-API(默认实现)和 ONT-API(使用 OWL-API 接口生成相同的 RDF:

OWLOntologyManager m = OntManagers.createONT();
OWLDataFactory df = m.getOWLDataFactory();
OWLClassExpression ce = df.getOWLObjectComplementOf(df.getOWLThing());
OWLOntology o = m.createOntology();            
o.add(df.getOWLSubClassOfAxiom(ce, ce));
o.saveOntology(OntFormat.TURTLE.createOwlFormat(), System.out);

对于作为 SubClassOf( CE1, CE2 ) 操作数的两个相等 class 表达式 ObjectComplementOf( owl:Thing ),将有两个不同的 b 节点。 所以,没有人质疑 OWL 中没有对象共享 .
但是,在我看来,这一定不适用于公理及其注释之间的关系,即运算符 ANN 的情况,请参见下一段。


4.1 生成主三元组的注释公理。 SPO.

的具体化

现在让我们以我认为唯一正确的方式向 SubClassOf( DataAllValuesFrom( <d> xsd:boolean ) ObjectSomeValuesFrom( <o> owl:Thing ) ) 添加注释 Annotation( rdfs:comment "comm" )(参见上一段 2)。 请记住,运算符 SubClassOf(CE1, CE2, ann) 会生成以下 ttl:

T(CE1) rdfs:subClassOf T(CE2) .
ANN(CE1, CE2, rdfs:subClassOf, ann) .

s p xlt .
_:x rdf:type owl:Axiom .
_:x owl:annotatedSource s .
_:x owl:annotatedProperty p .
_:x owl:annotatedTarget xlt .
TANN(ann, _:x)

这里,三元组 s p xlt 是应用运算符 SubClassOf(CE1, CE2) 的结果。 在 Table 2 部分 2.2 Translation of Annotations 中,Annotation( rdfs:comment "comm"^^xsd:string ) 的运算符 TANN(Annotation( AP av ), _:x) 将给出三元组 _:x rdfs:comment "comm"^^xsd:string,因此我们有 (SubClassOf(CE1, CE2, Annotation( rdfs:comment "comm"^^xsd:string ))):

s p xlt .
_:x rdf:type owl:Axiom .
_:x owl:annotatedSource s .
_:x owl:annotatedProperty p .
_:x owl:annotatedTarget xlt .
_:x rdfs:comment "comm"^^xsd:string .

这里的三元组s p xlt_:c1 rdfs:subClassOf _:c2(见段落2); 所以最后我们得到以下带注释的公理:

_:c1 rdfs:subClassOf _:c2 .
_:x rdfs:comment "comm"^^xsd:string .
_:x rdf:type owl:Axiom .
_:x owl:annotatedSource _:c1 .
_:x owl:annotatedProperty rdfs:subClassOf .
_:x owl:annotatedTarget _:c2 .

NTRIPLES 语法中的完整 ontology(没有 ontology id)如下所示:

<o> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://www.w3.org/2002/07/owl#ObjectProperty> .
<d> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://www.w3.org/2002/07/owl#DatatypeProperty> .
_:x <http://www.w3.org/2000/01/rdf-schema#comment> "comm" .
_:x <http://www.w3.org/2002/07/owl#annotatedTarget> _:c2 .
_:x <http://www.w3.org/2002/07/owl#annotatedProperty> <http://www.w3.org/2000/01/rdf-schema#subClassOf> .
_:x <http://www.w3.org/2002/07/owl#annotatedSource> _:c1 .
_:x <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://www.w3.org/2002/07/owl#Axiom> .
_:c2 <http://www.w3.org/2002/07/owl#someValuesFrom> <http://www.w3.org/2002/07/owl#Thing> .
_:c2 <http://www.w3.org/2002/07/owl#onProperty> <o> .
_:c2 <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://www.w3.org/2002/07/owl#Restriction> .
_:c1 <http://www.w3.org/2000/01/rdf-schema#subClassOf> _:c2 .
_:c1 <http://www.w3.org/2002/07/owl#allValuesFrom> <http://www.w3.org/2001/XMLSchema#boolean> .
_:c1 <http://www.w3.org/2002/07/owl#onProperty> <d> .
_:c1 <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://www.w3.org/2002/07/owl#Restriction> .

TURTLE中的相同:

@prefix rdf:   <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .
@prefix owl:   <http://www.w3.org/2002/07/owl#> .
@prefix xsd:   <http://www.w3.org/2001/XMLSchema#> .
@prefix rdfs:  <http://www.w3.org/2000/01/rdf-schema#> .

<o>     a       owl:ObjectProperty .

[ a                      owl:Axiom ;
  rdfs:comment           "comm" ;
  owl:annotatedProperty  rdfs:subClassOf ;
  owl:annotatedSource    [ a                  owl:Restriction ;
                           rdfs:subClassOf    _:c2 ;
                           owl:allValuesFrom  xsd:boolean ;
                           owl:onProperty     <d>
                         ] ;
  owl:annotatedTarget    _:c2
] .

<d>     a       owl:DatatypeProperty .

_:c2    a                   owl:Restriction ;
        owl:onProperty      <o> ;
        owl:someValuesFrom  owl:Thing .

三元组 _:c1 rdfs:subClassOf _:c2 (SPO) 出现在图中并具有其具体化:

_:x owl:annotatedTarget _:c2 .
_:x owl:annotatedProperty rdfs:subClassOf .
_:x owl:annotatedSource _:c1 .

注意,这个ontology可以通过下面的代码生成:

OntModel m = OntModelFactory.createModel().setNsPrefixes(OntModelFactory.STANDARD);
m.createDataAllValuesFrom(m.createDataProperty("d"), m.getDatatype(XSD.xboolean))
        .addSubClassOfStatement(m.createObjectSomeValuesFrom(m.createObjectProperty("o"), m.getOWLThing()))
        .annotate(m.getRDFSComment(), "comm");
m.write(System.out, "ttl");
System.out.println(".......");
m.write(System.out, "nt");

4.2 生成主三元组的注释公理。 (S*)P(O*).

的具体化

嗯,规范也说 In the mapping, each generated blank node (i.e., each blank node that does not correspond to an anonymous individual) is fresh in each application of a mapping rule。 这是关于运算符 T,而不是运算符 TANNANNSubClassOf(CE1, CE2)SubClassOf(CE1, CE2, ann)。 但是 SubClassOf 运算符由 TANN(TANN) 组成,因此它们还必须为每个操作数隐式生成一个空白节点。 我提醒运算符 SubClassOf(CE1, CE2, ann) 最初(参见 p.1)如下所示:

T(CE1) rdfs:subClassOf T(CE2) .
ANN(CE1, CE2, rdfs:subClassOf, ann) .

但它的第二部分 - 运算符 ANN(CE1, CE2, rdfs:subClassOf, ann) 究竟应该发生什么还不完全清楚。 让我们采用我的对手的假设(据我所知),即 class 表达式即使在包括其所有注释层次结构树的整个公理内也不得共享。 这对于运算符 SubClassOf(CE1, CE2) 来说绝对正确,而对于运算符 TANN 来说是错误的,而对于运算符 ANN(包括 TANN)来说,这是有争议的主题。 但是为了实验起见,我们假设该规则也必须适用于 ANN 操作数。 因此,SubClassOf(CE1, CE2, ann) 现在定义如下:

SubClassOf(CE1, CE2) .
ANN(T(CE1), T(CE2), rdfs:subClassOf, ann) .

T(CE1) rdfs:subClassOf T(CE2) .
ANN(T(CE1), T(CE2), rdfs:subClassOf, ann) .

SubClassOf(CE1, CE2) 将给出以下 NTRIPLES(参见第 2):

<d> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://www.w3.org/2002/07/owl#DatatypeProperty> .
<o> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://www.w3.org/2002/07/owl#ObjectProperty> .
_:c2 <http://www.w3.org/2002/07/owl#someValuesFrom> <http://www.w3.org/2002/07/owl#Thing> .
_:c2 <http://www.w3.org/2002/07/owl#onProperty> <o> .
_:c2 <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://www.w3.org/2002/07/owl#Restriction> .
_:c1 <http://www.w3.org/2000/01/rdf-schema#subClassOf> _:c2 .
_:c1 <http://www.w3.org/2002/07/owl#allValuesFrom> <http://www.w3.org/2001/XMLSchema#boolean> .
_:c1 <http://www.w3.org/2002/07/owl#onProperty> <d> .
_:c1 <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://www.w3.org/2002/07/owl#Restriction> .

这里,b节点_:c1对应class表达式DataAllValuesFrom( <d> xsd:boolean ), b 节点 _:c2 对应于 ObjectSomeValuesFrom( <o> owl:Thing )

然后我们对主语(第一个操作数T(CE1))做T in ANN

_:b1 <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://www.w3.org/2002/07/owl#Restriction> .
_:b1 <http://www.w3.org/2002/07/owl#allValuesFrom> <http://www.w3.org/2001/XMLSchema#boolean> .
_:b1 <http://www.w3.org/2002/07/owl#onProperty> <d> .

并且对于对象(第二个操作数T(CE2)):

_:b2 <http://www.w3.org/2002/07/owl#someValuesFrom> <http://www.w3.org/2002/07/owl#Thing> .
_:b2 <http://www.w3.org/2002/07/owl#onProperty> <o> .
_:b2 <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://www.w3.org/2002/07/owl#Restriction> .

并打印 ANN 本身:

_:x <http://www.w3.org/2000/01/rdf-schema#comment> "comm" .
_:x <http://www.w3.org/2002/07/owl#annotatedTarget> _:b2 .
_:x <http://www.w3.org/2002/07/owl#annotatedProperty> <http://www.w3.org/2000/01/rdf-schema#subClassOf> .
_:x <http://www.w3.org/2002/07/owl#annotatedSource> _:b1 .
_:x <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://www.w3.org/2002/07/owl#Axiom> .

注意,现在我们有 CE1CE2 的新 b 节点(分别为 _:b1_:b2), 并在这两个节点的注释 (_:x) 中有一个引用。 注释图结构里面有_:b1_:b2,不是_:c1_:c2, 只是因为我们首先将运算符 T 应用于输入 class 表达式, 然后才将结果进一步传递给运算符 ANN

完整的 ontology 如下(只需连接以上所有部分)(NTRIPLES):

<o> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://www.w3.org/2002/07/owl#ObjectProperty> .
<d> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://www.w3.org/2002/07/owl#DatatypeProperty> .
_:c2 <http://www.w3.org/2002/07/owl#someValuesFrom> <http://www.w3.org/2002/07/owl#Thing> .
_:c2 <http://www.w3.org/2002/07/owl#onProperty> <o> .
_:c2 <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://www.w3.org/2002/07/owl#Restriction> .
_:c1 <http://www.w3.org/2000/01/rdf-schema#subClassOf> _:c2 .
_:c1 <http://www.w3.org/2002/07/owl#allValuesFrom> <http://www.w3.org/2001/XMLSchema#boolean> .
_:c1 <http://www.w3.org/2002/07/owl#onProperty> <d> .
_:c1 <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://www.w3.org/2002/07/owl#Restriction> .
_:x <http://www.w3.org/2000/01/rdf-schema#comment> "comm" .
_:x <http://www.w3.org/2002/07/owl#annotatedTarget> _:b2 .
_:x <http://www.w3.org/2002/07/owl#annotatedProperty> <http://www.w3.org/2000/01/rdf-schema#subClassOf> .
_:x <http://www.w3.org/2002/07/owl#annotatedSource> _:b1 .
_:x <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://www.w3.org/2002/07/owl#Axiom> .
_:b2 <http://www.w3.org/2002/07/owl#someValuesFrom> <http://www.w3.org/2002/07/owl#Thing> .
_:b2 <http://www.w3.org/2002/07/owl#onProperty> <o> .
_:b2 <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://www.w3.org/2002/07/owl#Restriction> .
_:b1 <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://www.w3.org/2002/07/owl#Restriction> .
_:b1 <http://www.w3.org/2002/07/owl#allValuesFrom> <http://www.w3.org/2001/XMLSchema#boolean> .
_:b1 <http://www.w3.org/2002/07/owl#onProperty> <d> .

TURTLE中的相同:

@prefix rdf:   <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .
@prefix owl:   <http://www.w3.org/2002/07/owl#> .
@prefix xsd:   <http://www.w3.org/2001/XMLSchema#> .
@prefix rdfs:  <http://www.w3.org/2000/01/rdf-schema#> .

<o>     a       owl:ObjectProperty .

[ a                  owl:Restriction ;
  rdfs:subClassOf    [ a                   owl:Restriction ;
                       owl:onProperty      <o> ;
                       owl:someValuesFrom  owl:Thing
                     ] ;
  owl:allValuesFrom  xsd:boolean ;
  owl:onProperty     <d>
] .

<d>     a       owl:DatatypeProperty .

[ a                      owl:Axiom ;
  rdfs:comment           "comm" ;
  owl:annotatedProperty  rdfs:subClassOf ;
  owl:annotatedSource    [ a                  owl:Restriction ;
                           owl:allValuesFrom  xsd:boolean ;
                           owl:onProperty     <d>
                         ] ;
  owl:annotatedTarget    [ a                   owl:Restriction ;
                           owl:onProperty      <o> ;
                           owl:someValuesFrom  owl:Thing
                         ]
] .

如您所见,三元组 _:c1 rdfs:subClassOf _:c2 (SPO) 出现在图中,但没有具体化。 相反,有一个三元组 _:b1 rdfs:subClassOf _:b2 ((S*)P(O*)) 的具体化,它实际上并不存在于图中:

_:x owl:annotatedTarget _:b2 .
_:x owl:annotatedProperty rdfs:subClassOf .
_:x owl:annotatedSource _:b1 .

既然三元组 _:b1 rdfs:subClassOf _:b2 不存在,那么,在我看来,这个练习展示了无效的行为。


4.3 通过OWL-API生成主三元组的注释公理。用SP(O*).

具体化

你可能猜到了,我的对手为 OWL-API (v5.1.11) 的当前行为辩护。 那么让我们看看 OWL-API 做了什么。 要生成的代码:

OWLOntologyManager man = OntManagers.createOWL();
OWLDataFactory df = man.getOWLDataFactory();
OWLAxiom a = df.getOWLSubClassOfAxiom(df.getOWLDataSomeValuesFrom(df.getOWLDataProperty("d"),
        df.getBooleanOWLDatatype()),
        df.getOWLObjectAllValuesFrom(df.getOWLObjectProperty("o"), df.getOWLThing()),
        Collections.singletonList(df.getRDFSComment("comm")));
OWLOntology o = man.createOntology();
o.add(a);
o.saveOntology(new TurtleDocumentFormat(), System.out);

NTRIPLES(Ontology ID 省略):

<o> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://www.w3.org/2002/07/owl#ObjectProperty> .
<d> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://www.w3.org/2002/07/owl#DatatypeProperty> .
_:u <http://www.w3.org/2002/07/owl#allValuesFrom> <http://www.w3.org/2002/07/owl#Thing> .
_:u <http://www.w3.org/2002/07/owl#onProperty> <o> .
_:u <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://www.w3.org/2002/07/owl#Restriction> .
_:x <http://www.w3.org/2000/01/rdf-schema#comment> "comm" .
_:x <http://www.w3.org/2002/07/owl#annotatedTarget> _:u .
_:x <http://www.w3.org/2002/07/owl#annotatedProperty> <http://www.w3.org/2000/01/rdf-schema#subClassOf> .
_:x <http://www.w3.org/2002/07/owl#annotatedSource> _:c1 .
_:x <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://www.w3.org/2002/07/owl#Axiom> .
_:c1 <http://www.w3.org/2000/01/rdf-schema#subClassOf> _:c2 .
_:c1 <http://www.w3.org/2002/07/owl#someValuesFrom> <http://www.w3.org/2001/XMLSchema#boolean> .
_:c1 <http://www.w3.org/2002/07/owl#onProperty> <d> .
_:c1 <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://www.w3.org/2002/07/owl#Restriction> .
_:c2 <http://www.w3.org/2002/07/owl#allValuesFrom> <http://www.w3.org/2002/07/owl#Thing> .
_:c2 <http://www.w3.org/2002/07/owl#onProperty> <o> .
_:c2 <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://www.w3.org/2002/07/owl#Restriction> .

原文TURTLE:

@prefix owl: <http://www.w3.org/2002/07/owl#> .
@prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .
@prefix xml: <http://www.w3.org/XML/1998/namespace> .
@prefix xsd: <http://www.w3.org/2001/XMLSchema#> .
@prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> .
@base <http://www.w3.org/2002/07/owl#> .

[ rdf:type owl:Ontology
 ] .

#################################################################
#    Object Properties
#################################################################

###  o
<o> rdf:type owl:ObjectProperty .


#################################################################
#    Data properties
#################################################################

###  d
<d> rdf:type owl:DatatypeProperty .


#################################################################
#    General axioms
#################################################################

[ rdf:type owl:Axiom ;
  owl:annotatedSource [ rdf:type owl:Restriction ;
                        owl:onProperty <d> ;
                        owl:someValuesFrom xsd:boolean ;
                        rdfs:subClassOf [ rdf:type owl:Restriction ;
                                          owl:onProperty <o> ;
                                          owl:allValuesFrom owl:Thing
                                        ]
                      ] ;
  owl:annotatedProperty rdfs:subClassOf ;
  owl:annotatedTarget [ rdf:type owl:Restriction ;
                        owl:onProperty <o> ;
                        owl:allValuesFrom owl:Thing
                      ] ;
  rdfs:comment "comm"
] .


###  Generated by the OWL API (version 5.1.11) https://github.com/owlcs/owlapi/

以及重新格式化的 TURTLE(同样,没有 ontology id):

@prefix rdf:   <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .
@prefix owl:   <http://www.w3.org/2002/07/owl#> .
@prefix xsd:   <http://www.w3.org/2001/XMLSchema#> .
@prefix rdfs:  <http://www.w3.org/2000/01/rdf-schema#> .

<o>     a       owl:ObjectProperty .

<d>     a       owl:DatatypeProperty .

[ a                      owl:Axiom ;
  rdfs:comment           "comm" ;
  owl:annotatedProperty  rdfs:subClassOf ;
  owl:annotatedSource    [ a                   owl:Restriction ;
                           rdfs:subClassOf     [ a                  owl:Restriction ;
                                                 owl:allValuesFrom  owl:Thing ;
                                                 owl:onProperty     <o>
                                               ] ;
                           owl:onProperty      <d> ;
                           owl:someValuesFrom  xsd:boolean
                         ] ;
  owl:annotatedTarget    [ a                  owl:Restriction ;
                           owl:allValuesFrom  owl:Thing ;
                           owl:onProperty     <o>
                         ]
] .

如您所见,图中出现了三元组 _:c1 rdfs:subClassOf _:c2 (SPO),但没有具体化,就像上一段 (p4.2). 相反,有一个三元组 _:c1 rdfs:subClassOf _:u (SP(O*)) 的具体化,它实际上并不存在于图中:

_:x owl:annotatedTarget _:u .
_:x owl:annotatedProperty rdfs:subClassOf .
_:x owl:annotatedSource _:c1 .

另请注意,对于此示例,运算符 SubClassOf(CE1, CE2, ann) 必须如下所示:

T(CE1) rdfs:subClassOf T(CE2) .
ANN(CE1, T(CE2), rdfs:subClassOf, ann) .

这里,第一个操作数按原样传递,但第二个操作数有 T-转换,它产生一个新的 b 节点。

由于整个图中不存在三元组_:c1 rdfs:subClassOf _:u, 这个例子也展示了错误的行为。 所以,在我看来 OWL-API (v5.1.11) 在带注释的公理由匿名表达式组成的情况下不会生成正确的 RDF。


5.结论和注释。

  • 那么,为什么这两个规范都禁止将 b 节点重新用于映射? 好吧,我看到了唯一的解释——作者希望公理是原子的。如果某些公理的组件是共享的,那么在推理时不可能单独转换 off/on 所需的公理。
  • 段落4.1中的例子是否违反了这个原则?不,注释仍然属于唯一的公理,不能引用另一个公理。
  • 段落4.24.3中的例子是错误的:相应的具体化陈述并不存在。 但是,据我所知,我的对手为 4.3 的正确性辩护,给出的论据导致 4.2 的正确性。 我想,这个奇怪的事实也是正确性的隐含证明 4.1.
  • 示例 4.3 中的运算符 SubClassOf(CE1, CE2, ann) 是不对称的。规范中没有任何线索可能导致这种不平衡的结果。为什么第二个操作数有转换 T,但第一个没有 - 这是一个问题。
  • 来源(github 问题中的评论):https://github.com/owlcs/owlapi/issues/874#issuecomment-527399645