来自RDF/XML 语法规范(修订版) [强调添加]:
为了在 XML 中编码图形,节点和谓词必须用 XML 术语表示——元素名称、属性名称、元素内容和属性值。RDF/XML 使用 XML 中的命名空间 [XML-NS] 中定义的 XML QName 来表示 RDF URI 引用。所有 QName 都有一个命名空间名称,它是一个 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 语法规范必须定义 QName 的解释方式。为什么不直接继承 XML QName 规范的含义?答案在您引用的文章中:
XML 命名空间规范没有明确说明应用程序应如何处理(URI,本地部分)对。虽然大多数应用程序将它们视为两个不同的组件,但有些应用程序希望您以不同的方式组合它们。
在 RDF/XML中,应用程序将 (URI,local part) 对视为对 URI 的引用,它是uri和local的串联,如 RDF 语法文档的初始引用中所述。当然,约定是由词汇表定义的 URI 具有公共名称空间,并且使用该名称空间作为 XML 前缀很容易编写术语,因此在实践中您不会看到那种名称空间修饰我在上面用 DCMI 术语展示的。
在 ElementTree中,QName 对应于{uri}local。这就是该应用程序处理 (URI,local part) 对的方式。
由于 RDF/XML 序列化必须是有效的 XML,因此会产生一些复杂情况。并非每个 URI 都可以表示为 QName,因为有些 URI 不能表示为 QName,因为在 QName中,对可以出现在和 中的namespace:localname
字符有限制。例如,您不能使用像它这样的漂亮 QName,因为 localname 不能以数字开头。(例如,请参阅Jena-users 邮件列表上的此线程。)namespace
name
http://127.0.0.1/789234
localhost:789234
另一个复杂或混乱的原因是除了 RDF/XML 之外还有 RDF 序列化,其中一些采用了表面上类似于 XML QNames 的前缀/后缀表示法,但放宽了其中一些约束,因此您可能会看到前缀/不是有效的 XML QNames 的后缀组合,但对于这些格式来说没问题。
DBpedia SPARQL 端点上定义的前缀突出了这个问题。从 SPARQL 标准,第4.1.1.1 节前缀名称[强调添加]:
关键字将PREFIX
前缀标签与 IRI 相关联。前缀名称是前缀标签和本地部分,用冒号分隔":"
。通过连接与前缀相关联的 IRI 和本地部分,将前缀名称映射到 IRI。前缀标签或本地部分可能为空。请注意,SPARQL 本地名称允许前导数字,而 XML 本地名称不允许。SPARQL 本地名称还允许通过反斜杠字符转义在 IRI 中使用非字母数字字符(例如ns:id\=123
)。SPARQL 本地名称比 CURIE 有更多的语法限制。
在这种情况下,虽然像这样的前缀
amz => http://webservices.amazon.com/AWSECommerceService/2005-10-05
在 RDF/XML 序列化中将毫无用处,因为您需要编写诸如amz:#something
or之类的非法内容amz:/something
,它在 SPARQL 中会很有用(如果可能不方便),您可以在其中编写amz:\#something
和amz:\/something
.