正确地将没有定义的结束字符的xml名称空间扩展为有效的URI

时间:2013-06-21 08:25:30

标签: xml namespaces rdf semantic-web

据我所知,语义网由URI的三元组组成。命名空间缩写词广泛用于在日常使用中缩写它们。我认为,名称空间缩写将通过简单的连接扩展到URI,例如众所周知的dc:title命名空间中的着名dc:(定义为http://purl.org/dc/elements/1.1/,请注意最后一个字符是/)将被扩展为,因此语义上等于http://purl.org/dc/elements/1.1/title

然后我找到了一些名称空间定义,这些定义在结尾处缺乏合理的sepraration字符。 http://live.dbpedia.org/sparql?nsdecl

中的一些示例

以及Most common RDF namespaces列表中的一些:

如何将此类命名空间扩展为有效的链接数据URI?

W3C建议Namespaces in XML定义:“扩展名称是由namespace namelocal name组成的对。”和Fredrik Lundh {{3在元素树中,限定名称以Clark的符号存储为通用名称,它将URI和本地部分组合成一个字符串,以“{uri} local”形式给出。“这可能适用于广泛的用例,但它不符合链接数据的URI的概念,这些URI不能以{开头。

我原以为xsd:element 应该在关联数据中扩展为http://www.w3.org/2001/XMLSchemaelement {http://www.w3.org/2001/XMLSchema}element),应该是?如何正确实施?

1 个答案:

答案 0 :(得分:5)

来自RDF/XML Syntax Specification (Revised) [强调添加]:

  

为了用XML编码图形,节点和谓词必须用XML术语表示 - 元素名称,属性名称,元素内容和属性值。 RDF / XML使用XML [XML-NS]中的命名空间中定义的XML QNames来表示RDF URI引用。所有QNames都有一个名称空间名称,它是一个URI引用和一个简短的本地名称。此外,QNames可以有一个简短的前缀,也可以使用默认的名称空间声明声明,并且没有(但仍然有名称空间名称)

     

由QName表示的RDF URI引用是通过在QName的名称空间名称(URI引用)部分之后附加QName的本地名称部分来确定的。这用于缩短RDF URI所有谓词和一些节点的引用。标识主题和对象节点的RDF URI引用也可以存储为XML属性值。 RDF文字只能是对象节点,它们将成为XML元素文本内容或XML属性值。

这是简单的连接。这是重要的结果。这意味着我可以使用

@prefix dcterms: <http://purl.org/dc/terms/>
@prefix dctermsx: <http://purl.org/dc/terms/accrual>

dcterms:accrualPolicy      === http://purl.org/dc/terms/accrualPolicy
dctermsx:Policy            === http://purl.org/dc/terms/accrualPolicy
dcterms:accrualPeriodicity === http://purl.org/dc/terms/accrualPeriodicity
dctermsx:Periodicity       === http://purl.org/dc/terms/accrualPeriodicity

有趣的是,RDF / XML语法规范必须定义如何解释QNames。为什么它不继承XML QName规范的含义?你引用的答案是the article

  

XML命名空间规范没有明确说明应用程序应如何处理(URI,本地部分)对。虽然大多数应用程序将它们视为两个不同的组件,但某些应用程序希望您以不同的方式将它们组合在一起。

在RDF / XML 中,应用程序将(URI,本地部分)对视为对URI的引用,该URI是 uri local <的串联/ em>,如RDF语法文档的初始引用中所述。当然,约定是由词汇表定义的URI是这样的,即存在一个共同的命名空间,并且这些术语很容易使用该命名空间作为XML前缀来编写,所以在实践中你不会看到这种类型的命名空间错误我在上面展示了DCMI术语。

在ElementTree 中,QName对应于 {uri} local 。这就是该应用程序处理(URI,本地部分)对的方式。

由于RDF / XML序列化必须是有效的XML,因此会出现复杂情况。并非每个URI都可以表示为QName,因为有些URI不能表示为QName,因为在QName namespace:localname中,对namespace和{{{{}}中出现的字符有限制1}}。例如,name,你不能拥有像http://127.0.0.1/789234那样漂亮的QName,因为localname不能以数字开头。 (例如,请参阅Jena-users邮件列表中的this thread。)

另一个复杂或混淆源于RDF序列化不同于RDF / XML,其中一些采用表面/后缀表示法,表面上类似于XML QNames,但放宽了一些约束,所以你可以请参阅前缀/后缀组合,这些组合不是有效的XML QNames,但对于这些格式是可以的。

DBpedia SPARQL端点上定义的前缀突出显示了此问题。从SPARQL标准,4.1.1.1 Prefixed Names [强调添加]部分:

  

localhost:789234关键字将前缀标签与IRI相关联。带前缀的名称是前缀标签和本地部分,用冒号PREFIX分隔。 通过连接与前缀和本地部分关联的IRI,将前缀名称映射到IRI。前缀标签或本地部分可以为空。请注意,SPARQL本地名称允许前导数字,而XML本地名称则不允许。 SPARQL本地名称还允许IRI中允许的非字母数字字符通过反斜杠字符转义(例如":")。 SPARQL本地名称比CURIEs具有更多的语法限制。

在此上下文中,前缀为

ns:id\=123

在RDF / XML序列化中没用,因为你需要编写非法的东西,如amz => http://webservices.amazon.com/AWSECommerceService/2005-10-05 amz:#something,它在SPARQL中很有用(如果可能不方便),你在那里< em>可以amz:/somethingamz:\#something