SELECT子句中的变量绑定是否可以在ORDER BY中访问?

时间:2015-06-25 16:20:22

标签: scope sparql specifications

这应该是有效的SPARQL吗?

SELECT ("text" AS ?aString)
WHERE {}
ORDER BY ?aString

我尝试了两种不同的引擎。一个返回?aString的“text”,其他错误,说是?aString没有在ORDER BY中定义。 SPARQL规范是否涵盖了这种情况?或者这只是一个实现细节,它恰好在某些引擎中工作,但不是严格可移植的?

2 个答案:

答案 0 :(得分:2)

SPARQL查询(实际上,查询的一个级别,即SELECT)在模式模式中分割,并对模式的结果进行操作。这些操作称为修饰符。

它们按顺序发生:

order - project - distinct - reduces - offset - limit 

SELECT很复杂 - 它不仅仅是一个修饰符,它不仅仅是一个投影。示例中的AS有两个方面,它像BIND一样作为最终模式阶段完成,并且还包括项目中的变量。

此查询与查询中的查询具有完全相同的SPARQL代数形式。

SELECT ?aString
WHERE {
    ...
    BIND ("text" AS ?aString)
}
ORDER BY ?aString

或在代数中:

(project (?aString)
  (order (?aString)
    (extend ((?aString "text"))
      ...)))

从里到外进行评估。

?aString在订单发生之前定义,ORDER BY可以使用它进行排序。

答案 1 :(得分:0)

Sparql.org's query validator说这是合法的。这实际上是一个非常重要的案例,因为我们希望能够做到这样的事情:

select ?min ?max ((?max - ?min) as ?range) {
  #-- ...
}
order by ?range