7

我阅读了这篇博客文章,RDF 模型的问题:空白节点,其中提到使用空白节点会使数据处理复杂化。

你能举个例子,为什么使用空白节点很难执行 SPARQL 查询?我不明白空白节点的复杂性。你能解释一下存在变量的含义和语义吗?我不清楚 RDF 语义建议1.5 中给出的解释。空白节点作为存在变量

4

1 回答 1

14

存在变量

在(一阶)谓词演算中,存在量化可以让我们对存在的事物做出断言,而无需说(或者,可能不知道)我们实际上在谈论的领域中的哪些特定个体。例如,像这样的句子

hasUserId(约书亚泰勒,1281433)

包含句子

x .hasUserId( x ,1281433)

当然,在很多情况下,第二句话可能是真的,而第一句话是真的。从这个意义上说,第二句话给我们的信息比第一句话少。同样重要的是要注意第二句中的变量x没有提供任何方法来找出话语域中的哪个元素实际上具有给定的 userId。它也没有声称只有一个这样的东西具有给定的用户 ID。为了更清楚地说明这一点,我们可以举一个例子:

y .hasAge(y,29)

这大概是真的,因为外面的某个人或某事是 29 岁。请注意,我们不能将y称为29 岁个体,因为可能有很多。这句话告诉我们的是至少有一个。

尽管我们在两个句子中使用了不同的变量,但没有什么可以说具有指定属性的个体可能不一样。这在嵌套量化中尤为重要,例如,

x .∃ y .likes( x , y )

这句话可能是真的,因为在这个领域中有一个人喜欢自己。仅仅因为xy在句子中具有不同的名称并不意味着它们可能不指代同一个人。

空白节点作为存在变量

RDF Semantics中定义了一个已定义的 RDF 蕴涵模型。这在另一个 Stack Overflow 问题RDF Graph Entailment中有更多描述。这个想法是,RDF 图被视为对图中提到的空白节点的大存在量化。例如,如果图中的三元组是 t 1 , ..., t n,并且出现在这些三元组中的空白节点是 b 1 , ..., b m,则该图是一个公式:

∃b 1 , ..., b m .(t 1 ∧ ... ∧ t n )

根据上面对存在变量的讨论,请注意,这意味着数据中的空白节点可能指代域的相同元素或不同元素,并且并不要求恰好一个元素可以代替空白节点. 这意味着当以这种方式解释具有空白节点的图形时,提供的信息比您预期的要少得多。

真实数据中的空白节点

现在,如果人们使用空白节点作为存在变量,上面的讨论很有用。在许多情况下,作者认为它们更像是匿名的,但明确而独特的对象。例如,如果我们随便写

@prefix : <https://stackoverflow.com/q/20629437/1281433/> .

:Carol :hasAddress [ :hasNumber 4222 ;
                     :hasStreet :Clinton_Way ] .

我们可能会试图说存在具有指定属性的单个地址,但根据 RDF 蕴涵模型,这不是我们正在做的事情。

实际上,这并不是什么大问题,因为我们通常不使用 RDF 蕴涵。问题在于,由于空白变量的范围是图的本地变量,我们无法对请求 Carol 的地址的端点运行 SPARQL 查询并取回我们可以重用的 IRI。如果我们运行这样的查询:

prefix : <https://stackoverflow.com/q/20629437/1281433/>

construct {
  :Mike :hasAddress ?address
}
where {
  :Carol :hasAddress ?address
}

然后我们得到以下(无用的)图表作为结果:

@prefix :      <https://stackoverflow.com/q/20629437/1281433/> .

:Mike   :hasAddress  []  .

我们将无法获得有关地址的更多信息,因为我们现在只有一个空白节点。如果我们使用了 IRI,例如,

@prefix : <https://stackoverflow.com/q/20629437/1281433/> .

:Carol :hasAddress :address1267389 .
:address1267389 :hasNumber 4222 ;
                :hasStreet :Clinton_Way .

那么查询会产生更有用的东西:

@prefix :      <https://stackoverflow.com/q/20629437/1281433/> .

:Mike   :hasAddress  :address1267389 .

为什么这更有用?第一种情况就像拥有数据

∃ x.(hasAddress(Carol,x) ∧ hasNumber(x,4222) ∧ hasStreet(x,ClintonWay))

并得到一个结果

∃ y.hasAddress(Mike,y)

当然,迈克和卡罗尔可能有相同的地址,但从这些句子中无法确定。拥有类似的数据会更有帮助

hasAddress(Carol,address1267389)
hasNumber(address1267389,4222)
hasStreet(address1267389,ClintonWay))

并得到一个结果

有地址(迈克,地址1267389)

从这里,你知道他们有相同的地址,你可以询问有关它的事情。

结论

这将对您的数据及其消费者产生多大影响取决于典型的用例是什么。对于自动构建的图表,可能很难事先知道您以后需要参考什么样的数据,因此最好为尽可能多的资源生成 IRI。由于 IRI 是自由格式的,因此通常不会太难做到这一点。例如,如果你有一些合理的“基础”IRI,例如,

http://example.org/myData/

然后您可以轻松地附加后缀来识别您的资源。例如,

http://example.org/myData/addresses/addr1
http://example.org/myData/addresses/addr2
http://example.org/myData/addresses/addr3
http://example.org/myData/individuals/ind34
http://example.org/myData/individuals/ind35
于 2013-12-17T14:42:46.553 回答