我阅读了这篇博客文章,RDF 模型的问题:空白节点,其中提到使用空白节点会使数据处理复杂化。
你能举个例子,为什么使用空白节点很难执行 SPARQL 查询?我不明白空白节点的复杂性。你能解释一下存在变量的含义和语义吗?我不清楚 RDF 语义建议1.5 中给出的解释。空白节点作为存在变量。
我阅读了这篇博客文章,RDF 模型的问题:空白节点,其中提到使用空白节点会使数据处理复杂化。
你能举个例子,为什么使用空白节点很难执行 SPARQL 查询?我不明白空白节点的复杂性。你能解释一下存在变量的含义和语义吗?我不清楚 RDF 语义建议1.5 中给出的解释。空白节点作为存在变量。
在(一阶)谓词演算中,存在量化可以让我们对存在的事物做出断言,而无需说(或者,可能不知道)我们实际上在谈论的领域中的哪些特定个体。例如,像这样的句子
hasUserId(约书亚泰勒,1281433)
包含句子
∃ x .hasUserId( x ,1281433)
当然,在很多情况下,第二句话可能是真的,而第一句话是真的。从这个意义上说,第二句话给我们的信息比第一句话少。同样重要的是要注意第二句中的变量x没有提供任何方法来找出话语域中的哪个元素实际上具有给定的 userId。它也没有声称只有一个这样的东西具有给定的用户 ID。为了更清楚地说明这一点,我们可以举一个例子:
∃ y .hasAge(y,29)
这大概是真的,因为外面的某个人或某事是 29 岁。请注意,我们不能将y称为29 岁的个体,因为可能有很多。这句话告诉我们的是至少有一个。
尽管我们在两个句子中使用了不同的变量,但没有什么可以说具有指定属性的个体可能不一样。这在嵌套量化中尤为重要,例如,
∃ x .∃ y .likes( x , y )
这句话可能是真的,因为在这个领域中有一个人喜欢自己。仅仅因为x和y在句子中具有不同的名称并不意味着它们可能不指代同一个人。
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