我已就该主题研究SPARQL specification,并发现this answer相当有趣。但是定义很复杂,所以我仍然没有看到我的问题的答案。
我找不到任何查询示例,其中空白节点返回的结果与使用变量代替空白节点的同一查询不同。
例如,以下查询返回不同结果时会出现这种情况:
SELECT ?a ?b
WHERE {
?a :predicate _:blankNode .
_:blankNode :otherPredicate ?b .
}
SELECT ?a ?b
WHERE {
?a :predicate ?variable .
?variable :otherPredicate ?b .
}
也许有更复杂的查询会导致不同的行为?
特别是我想知道在没有空白节点的RDF图上执行的查询的不同结果的任何示例。
感谢。
PS。是的,我知道空白节点只能在一个BasicGraphPattern中使用而不是变量。但这不是我所说的差异。
答案 0 :(得分:13)
您链接的答案是关于正在查询的数据中的空白节点,而不是查询中的空白节点。你是绝对正确的,查询中的空白节点就像变量一样。规范说明了这一点(重点补充):
4.1.4 Syntax for Blank Nodes
图表模式中的空白节点充当变量,而非作为参考 正在查询的数据中的特定空白节点。
空白节点由标签表单指示,例如“_:abc”, 或缩写形式“[]”。仅在一个中使用的空白节点 可以用[]表示查询语法中的位置。独特的空白 节点将用于形成三重模式。空白节点标签是 写为“_:abc”表示标签为“abc”的空白节点。同样的空白 节点标签不能用于两种不同的基本图形模式中 相同的查询。
因此,您的查询
SELECT ?a ?b
WHERE {
?a :predicate _:blankNode .
_:blankNode :otherPredicate ?b .
}
SELECT ?a ?b
WHERE {
?a :predicate ?variable .
?variable :otherPredicate ?b .
}
行为相同。使用空节点而不是变量的好处是您可以使用更紧凑的语法。在这种情况下,您可以写:
SELECT ?a ?b
WHERE {
?a :predicate [ :otherPredicate ?b ] .
}
实际上,在这种情况下,由于您只是在空白节点匹配的东西上寻找一个属性,您可以使用属性路径:
SELECT ?a ?b
WHERE {
?a :predicate/:otherPredicate ?b .
}
答案 1 :(得分:3)
对于大多数蕴涵制度,空白节点是基本图形模式中的变量。对于OWL-DL(以及其他人),您可以获得更多答案(例如“小房子”和“俄狄浦斯”示例 - 描述逻辑手册有详细信息)。
在简单蕴涵SPARQL http://www.w3.org/TR/sparql11-query/#BasicGraphPattern的定义中,实例映射σ(b)的行为就像解映射μ(v)一样。