16

我研究了有关该主题的SPARQL 规范,也发现这个答案很有趣。但是定义足够复杂,所以我仍然看不到我的问题的答案。

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

例如,是否存在以下查询返回不同结果的情况:

  1. SELECT ?a ?b
    WHERE {
        ?a :predicate _:blankNode .
        _:blankNode :otherPredicate ?b .
    }
    
  2. SELECT ?a ?b
    WHERE {
        ?a :predicate ?variable .
        ?variable :otherPredicate ?b .
    }
    

也许有更复杂的查询会导致不同的行为?

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

谢谢。

PS。是的,我知道空白节点只能用于一个 BasicGraphPattern 而不是变量。但这不是我所说的区别。

4

3 回答 3

16

您链接到的答案是关于正在查询的数据中的空白节点,而不是关于查询中的空白节点。您绝对正确,查询中的空白节点就像变量一样。规范说明了这一点(强调):

4.1.4 空白节点的语法

图形模式中的空白节点充当变量,而不是对正在查询的数据中特定空白节点的引用。

空白节点由标签形式(例如“_: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 .
}
于 2014-02-17T22:15:12.787 回答
3

对于大多数蕴涵机制,空白节点是基本图形模式中的变量。对于 OWL-DL(和其他),您可以获得更多答案(示例包括“小房子”和“俄狄浦斯”示例——描述逻辑手册有详细信息)。

在 SPARQL http://www.w3.org/TR/sparql11-query/#BasicGraphPattern的定义中,对于简单的蕴涵,实例映射 σ(b) 的行为就像解决方案映射 μ(v)。

于 2014-02-17T10:23:48.647 回答
0

未明确讨论的一个重要因素是空白节点“变量”将结果限制为空白节点资源这一事实。普通变量使用所有可用值(命名资源、空白节点资源和文字)。

此外,空白节点“变量”不能在 BIND 等函数中使用,也不能用作结果中的列。

于 2021-08-24T23:48:43.157 回答