为什么在 RDF 中为对象使用代码而不是字符串?

Why is a code instead of the string used in RDF for an object?

例如:

entity:f06574 rdfs:label "Orioles"

或者这样的格式:

:tt0268252 a :Movie .

在任何一种情况下,f06574tt0268252 都是代码,而不是实体或实例的实际字符串。一个原因可能是因为同一个字符串可能指的是不同的东西,但是在RDF世界中,某物的标识符总是以其唯一的URI为前缀,所以即使使用一个字符串,也不会造成歧义,等等可读且不透明的代码。

出现这种表现形式的真正原因是什么? Freebase 中的三元组是相似的。

这个类似于关系数据库理论中的surrogate keys。代理键不是从应用程序数据中派生出来的,因此没有语义意义。这与从应用程序数据派生的自然键相反。

代理键的主要优点是,如果应用程序数据发生变化,则不需要对数据的引用进行更改。在自然键的情况下,如果应用程序数据发生变化,将导致对数据的引用发生变化。因此,所有外键都需要相应更新。

在语义网中,如果我们本质上希望标签从 Movie 变为 Film,那么任何引用 tt0268252 的三元组都不需要更新。如果我们使用像 http://awesome/movie 这样的字符串并且它需要更改为电影,我们将需要更改我们的 IRI http://awesome/film,这将违反语义网的原则(IRI 不应更改)。或者我们将不得不忍受 http://awesome/moviehttp://awesome/movie rdfs:label "Film"。这可能会导致更多的混乱而不是不透明的代码。

顺便说一句,这就是为什么有些人更喜欢使用 Persistent uniform resource locators 在底层网络资源发生变化时提供弹性的原因。以类似的方式,这些 "codes" 在应用程序数据更改时提供弹性。