SPARQL查询中空白节点和变量之间的区别

时间:2014-02-17 09:14:31

标签: sparql rdf semantic-web blank-nodes

我已就该主题研究SPARQL specification,并发现this answer相当有趣。但是定义很复杂,所以我仍然没有看到我的问题的答案。

我找不到任何查询示例,其中空白节点返回的结果与使用变量代替空白节点的同一查询不同。

例如,以下查询返回不同结果时会出现这种情况:

  1. SELECT ?a ?b
    WHERE {
        ?a :predicate _:blankNode .
        _:blankNode :otherPredicate ?b .
    }
    
  2. SELECT ?a ?b
    WHERE {
        ?a :predicate ?variable .
        ?variable :otherPredicate ?b .
    }
    
  3. 也许有更复杂的查询会导致不同的行为?

    特别是我想知道在没有空白节点的RDF图上执行的查询的不同结果的任何示例。

    感谢。

    PS。是的,我知道空白节点只能在一个BasicGraphPattern中使用而不是变量。但这不是我所说的差异。

2 个答案:

答案 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)一样。