我很难理解来自 w3.org 的一段话。令人困惑的段落可能是一个错误,或者我可能只是感到困惑。
以下是RDF 概念规范的第 6.6 节,
6.6 空白节点
RDF 图中的空白节点是从无限集合中绘制的。这组空白节点、所有 RDF URI 引用的集合和所有文字的集合是成对不相交的。
否则,这组空白节点是任意的。
RDF 不参考空白节点的任何内部结构。给定两个空白节点,可以确定它们是否相同。
所以,我很困惑的是:如果没有办法知道“空白笔记的内部结构”,如何区分它们?这是一个错字吗?
我很难理解来自 w3.org 的一段话。令人困惑的段落可能是一个错误,或者我可能只是感到困惑。
以下是RDF 概念规范的第 6.6 节,
6.6 空白节点
RDF 图中的空白节点是从无限集合中绘制的。这组空白节点、所有 RDF URI 引用的集合和所有文字的集合是成对不相交的。
否则,这组空白节点是任意的。
RDF 不参考空白节点的任何内部结构。给定两个空白节点,可以确定它们是否相同。
所以,我很困惑的是:如果没有办法知道“空白笔记的内部结构”,如何区分它们?这是一个错字吗?
这不是一个错字,我同意,这不是直截了当的理解。这也是一个反复出现的问题。存在空白节点是因为有时无法创建 URI 来表示节点。例如,在构建约束时,这种情况一直在 OWL 中发生。
通常,在解析 RDF 文件时会创建一个空白节点 ID,并且它必须是唯一的。因此,根据定义,您不应该找到两个具有相同标识符的空白节点。区分两个空白节点的一种方法是查看所有传入/传出谓词及其对象/主题,以查看连接的子图是否相同。这很难实现,并且计算大型图可能非常昂贵。
这个问题已经在与查找 RDF 图之间的差异有关的过程中得到了广泛的讨论。一篇非常有趣的文章是 TimBL 的设计问题之一Delta: an ontology for the distribution of Differences between RDF 图。还可以查看How to diff RDF graphs wiki from the w3c。
If you are the data publisher then try to avoid blank nodes if posible. If you need blank nodes then try to come up with a hash function that gives you a unique ID for different blank node constructions in such a way that two different blank nodes with the same graph structure will have the same ID and therefore you can put them appart.
请注意,在 2014 年 2 月标准化的 RDF 1.1 稍微编辑了以下文本:
空白节点与 IRI 和文字不相交。否则,可能的空白节点集是任意的。RDF 不参考空白节点的任何内部结构。
并添加关于空白节点标识符的注释:
注意:空白节点标识符是在一些具体的 RDF 语法或 RDF 存储实现中使用的本地标识符。它们总是在本地限定为文件或 RDF 存储,并且不是空白节点的持久或可移植标识符。空白节点标识符不是 RDF 抽象语法的一部分,而是完全依赖于具体的语法或实现。因此,对空白节点标识符的语法限制(如果有)也取决于具体的 RDF 语法或实现。在具体语法中处理空白节点标识符的实现需要注意不要从同一空白节点标识符的多次出现中创建相同的空白节点,除非语法支持这一点。
还有一个新的规范推荐了一个用于空白节点管理的 skolemisation 方案。
无论如何,你说:
没有办法知道“空白节点的内部结构”
但这不是规范所说的。规范只是说它没有定义这种方式,这意味着实现者有责任决定他们希望如何在内部表示和识别空白节点。但我同意 2004 年规范的措辞令人困惑。
在这份 W3C 社区组报告草案中讨论了一种算法:
RDF 数据集规范化
一种标准的 RDF 数据集归一化算法
...
本文档概述了在给定RDF 数据集作为输入的情况下生成规范化RDF 数据集的算法。该算法称为Universal RDF Dataset Normalization Algorithm 2015或URDNA2015。
...
该规范定义了一种算法,用于为不同的序列化创建稳定的空白节点标识符,可能使用同一 RDF 图(数据集)的个性化空白节点标识符,通过将每个空白节点通过其连接的节点接地,本质上创建 Skolem空白节点标识符。因此,可以通过对生成的归一化数据集的规范序列化进行哈希处理来获得图签名,允许同构和数字签名用例。由于即使对图形(数据集)进行了其他更改,空白节点标识符也可以保持稳定,因此在某些情况下,可以计算两个图形(数据集)之间的差异,例如,如果仅对地面三元组进行更改,或者如果新的空白引入了不会与其他现有空白节点产生自同构混淆的节点。