我们期望(至少我这样做)查询应该返回空结果。而 Virtuoso 实际上返回的是空结果,您可以使用 DBpedia 的 SPARQL 端点来检查。
但是 Fuseki 和 Jena ARQ 返回非空结果:0。您可以在 sparql.org 上查看。
我不知道您是否可以更改avg的行为,但您可能不应该这样做,因为 Jena 在这里做的是正确的事情,而 Virtuoso(DBpedia 的端点)做错了。SPARQL 1.1 标准特别定义了avg在组为空时返回:
Avg set 函数计算组中表达式的平均值。它是根据 Sum 和 Count 定义的。
定义:Avg numeric Avg(multiset M)
Avg(M) = "0"^^xsd: 整数,其中 Count(M) = 0
Avg(M) = Sum(M) / Count(M),其中 Count(M) > 0
也就是说,您可以使用if检查计数是否为零,并在这种情况下返回未定义的值,否则返回平均值。这也适用于任何端点,而不仅仅是 ARQ。我在这里使用值来引入具有未定义值的变量,但您也可以轻松地使用会产生错误的表达式,例如1/0。(当然,实现可能会扩展运算符的行为存在危险,因此实际上很难保证任何特定的表达式都会出错。)
select (if(count(?x) = 0,?undef,avg(?x)) as ?average) where {
values ?x { 2 3 4 }
values ?undef { undef }
}
group by ?undef
-----------
| average |
===========
| 3.0 |
-----------
在没有 ?x 值的情况下:
select (if(count(?x) = 0,?undef,avg(?x)) as ?average) where {
values ?x {}
values ?undef { undef }
}
group by ?undef
-----------
| average |
===========
| |
-----------