当我导入该Virtuoso三重存储的转储“ PathwayCommons12.All.BIOPAX.owl.gz”(从此页面链接)时,我注意到在各种URI的前缀之后插入了“#”。
特别是,以下查询在原始端点上运行:
# Query 1
PREFIX pfx: <http://pathwaycommons.org/pc12/>
select ?pw
where {
?pw a bp:Pathway
values ?pw {pfx:Pathway_c2fd3d95c8c65552a0514393ede60c37}
}
但是要使其在本地端点(导入的owl dump)上运行,我必须在pfx:
like的末尾添加一个“#” :
# Query 2
PREFIX pfx: <http://pathwaycommons.org/pc12/#>
select ?pw
where {
?pw a bp:Pathway
values ?pw {pfx:Pathway_c2fd3d95c8c65552a0514393ede60c37}
}
请注意,查询1仅在原始端点上起作用,而查询2仅在本地端点上起作用。
这里发生了什么?
如果我们查看该大型RDF / XML文件的前几行,则会看到:
<?xml version="1.0" encoding="UTF-8"?>
<rdf:RDF
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:owl="http://www.w3.org/2002/07/owl#"
xmlns:xsd="http://www.w3.org/2001/XMLSchema#"
xmlns:bp="http://www.biopax.org/release/biopax-level3.owl#"
xml:base="http://pathwaycommons.org/pc12/">
<owl:Ontology rdf:about="">
<owl:imports rdf:resource="http://www.biopax.org/release/biopax-level3.owl#" />
</owl:Ontology>
<bp:ExperimentalForm rdf:ID="ExperimentalForm_ee10aeab-1129-49ad-8217-4193f4fbf7e0">
<bp:comment rdf:datatype = "http://www.w3.org/2001/XMLSchema#string">[ExperimentalFormVocabulary_bait]</bp:comment>
<bp:experimentalFormDescription rdf:resource="#ExperimentalFormVocabulary_701737e5cf53d06134cbd3ee59611827" />
</bp:ExperimentalForm>
注意rdf:ID
此处的属性值:“ ExperimentalForm_ee10aeab-1129-49ad-8217-4193f4fbf7e0”。这是一个相对URI,需要针对基本URI(在文档标头中声明的“ http://pathwaycommons.org/pc12/”声明)进行解析。RDF / XML语法规范的2.14节中描述了这种解析是如何发生的:
可以使用节点元素(不是属性元素,它具有另一种含义)上的rdf:ID属性代替rdf:about,并给出与#等效的相对IRI与rdf:ID属性值串联。因此,例如,如果rdf:ID =“ name”,则等效于rdf:about =“#name”。
(强调我的)
规范中的示例16进一步说明了这一点。
归结为,在解析此RDF / XML时,作为rdf:ID
属性提供的值全部解析为http://pathwaycommons.org/pc12/#<ID>
。因此,你在GraphDB中获得的结果对于给定的输入是正确的。我不知道为什么它在Virtuoso端点中有所不同:要么他们使用了不同的输入文件,要么他们的解析器中有错误,或者用于生成此转储文件的任何工具都包含了错误。
可以肯定地说,创建转储文件的人的意图是
rdf:ID="ExperimentalForm_ee10aeab-1129-49ad-8217-4193f4fbf7e0"
将解析为IRI http://pathwaycommons.org/pc12/ExperimentalForm_ee10aeab-1129-49ad-8217-4193f4fbf7e0
(即没有添加#
字符)。有几种方法在文件中解决这个问题:要么更换所有出现rdf:ID
用rdf:about
,否则不依赖于相对URI分辨率,只是使用完整的URI的rdf:ID
值。
谢谢,这是非常有帮助的。还有两个问题:1)假设人们通常打算像ex16那样使用“ base#<ID>”形式的资源,那我是正确的吗?2)如果是这样,那么用virtuoso配置弄乱某些东西的可能性是,它会吐出缺少“#”而不是转储的资源?像,您是否曾经在其他端点看到过“#”的故意遗漏?
我不确定用户使用rdf:ID时通常会打算做什么,但是RDF / XML语法规范指出,当您使用rdf:ID且其值还不是绝对IRI时,唯一可能的结果是带有#的IRI。
在RDF / XML中处理rdf:about和rdf:ID属性值之间的细微差别是解析器和编写器中错误的一个众所周知的原因-包括我以前看到的一些解析器忘记在#后面附加#的情况。 rdf:解析前的ID值。在我看来,这很可能是原因:工具链中某处存在RDF / XML解析器或编写器,错误地认为您可以从基本URI和rdf:ID值创建绝对IRI,而无需在两者之间添加#。
可以说RDF / XML是一种很难正确使用的语法形式,通常使用乌龟或n-三联之类的东西效果更好。