如何将带注释的公理序列化为 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)
,其中ann
是Annotation( AP av )
,E
和y
是一些对象.
规范还说: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
部分没有自己的名字。
运算符 TANN
在 Table 2
节 2.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 )
中)是 _:c1
,p
(谓语)是 rdfs:subClassOf
,xlt
(xlt
代表一个空节点,一个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
,而不是运算符 TANN
、ANN
、SubClassOf(CE1, CE2)
或 SubClassOf(CE1, CE2, ann)
。
但是 SubClassOf
运算符由 T
和 ANN
(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> .
注意,现在我们有 CE1
和 CE2
的新 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.2、4.3中的例子是错误的:相应的具体化陈述并不存在。
但是,据我所知,我的对手为 4.3 的正确性辩护,给出的论据导致 4.2 的正确性。
我想,这个奇怪的事实也是正确性的隐含证明 4.1.
- 示例 4.3 中的运算符
SubClassOf(CE1, CE2, ann)
是不对称的。规范中没有任何线索可能导致这种不平衡的结果。为什么第二个操作数有转换 T
,但第一个没有 - 这是一个问题。
- 来源(github 问题中的评论):https://github.com/owlcs/owlapi/issues/874#issuecomment-527399645
让我们采用公理
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)
,其中ann
是Annotation( AP av )
,E
和y
是一些对象.
规范还说: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
部分没有自己的名字。
运算符 TANN
在 Table 2
节 2.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 )
中)是 _:c1
,p
(谓语)是 rdfs:subClassOf
,xlt
(xlt
代表一个空节点,一个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
,而不是运算符 TANN
、ANN
、SubClassOf(CE1, CE2)
或 SubClassOf(CE1, CE2, ann)
。
但是 SubClassOf
运算符由 T
和 ANN
(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> .
注意,现在我们有 CE1
和 CE2
的新 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.2、4.3中的例子是错误的:相应的具体化陈述并不存在。 但是,据我所知,我的对手为 4.3 的正确性辩护,给出的论据导致 4.2 的正确性。 我想,这个奇怪的事实也是正确性的隐含证明 4.1.
- 示例 4.3 中的运算符
SubClassOf(CE1, CE2, ann)
是不对称的。规范中没有任何线索可能导致这种不平衡的结果。为什么第二个操作数有转换T
,但第一个没有 - 这是一个问题。 - 来源(github 问题中的评论):https://github.com/owlcs/owlapi/issues/874#issuecomment-527399645