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

Should variable bound in SELECT clause be accessible in ORDER BY?

这应该是有效的 SPARQL 吗?

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

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

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

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

一个 SPARQL 查询(实际上,查询的一个级别,即 SELECT)拆分为模式 pattern 和对模式结果的操作。这些操作称为修饰符。

它们按顺序发生:

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 可以使用它进行排序。