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

And*_*ite 14 rdf semantic-web sparql blank-nodes

我已经研究了关于这个主题的SPARQL规范,并且发现这个答案相当有趣.但是定义很复杂,所以我仍然没有看到我的问题的答案.

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

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

  1. SELECT ?a ?b
    WHERE {
        ?a :predicate _:blankNode .
        _:blankNode :otherPredicate ?b .
    }
    
    Run Code Online (Sandbox Code Playgroud)
  2. SELECT ?a ?b
    WHERE {
        ?a :predicate ?variable .
        ?variable :otherPredicate ?b .
    }
    
    Run Code Online (Sandbox Code Playgroud)

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

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

谢谢.

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

Jos*_*lor 13

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

4.1.4空节点的语法

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

空白节点由标签形式表示,例如"_:abc"或缩写形式"[]".可以使用[]指示在查询语法中仅在一个位置使用的空白节点.将使用唯一的空白节点来形成三重模式.对于标记为"abc"的空白节点,空白节点标签写为"_:abc".相同的空白节点标签不能在同一查询中的两个不同的基本图形模式中使用.

因此,您的查询

SELECT ?a ?b
WHERE {
    ?a :predicate _:blankNode .
    _:blankNode :otherPredicate ?b .
}
Run Code Online (Sandbox Code Playgroud)
SELECT ?a ?b
WHERE {
    ?a :predicate ?variable .
    ?variable :otherPredicate ?b .
}
Run Code Online (Sandbox Code Playgroud)

表现相同.使用空节点而不是变量的好处是您可以使用更紧凑的语法.在这种情况下,你可以写:

SELECT ?a ?b
WHERE {
    ?a :predicate [ :otherPredicate ?b ] .
}
Run Code Online (Sandbox Code Playgroud)

实际上,在这种情况下,由于您只在空白节点匹配的事物上查找一个属性,因此您可以使用属性路径:

SELECT ?a ?b
WHERE {
    ?a :predicate/:otherPredicate ?b .
}
Run Code Online (Sandbox Code Playgroud)