2

我有一个使用 AVG() 运算符的查询:

SELECT (AVG(?z) AS ?avg) { ?x <http://ex.com/value> ?z }

假设三元组存储没有与给定三元组模式匹配的三元组,那么我们期望(至少我有)查询应该返回空结果。而 Virtuoso 实际上返回的是空结果,您可以使用 DBpedia 的 SPARQL 端点来检查(执行)。

但是 Fuseki 和 Jena ARQ 返回非空结果:0. 您可以在 sparql.org (执行) 上查看它。

是否可以配置 Jena ARQ 为给定查询返回空结果?如果是这样,那怎么办?

4

1 回答 1

6

我们期望(至少我这样做)查询应该返回空结果。而 Virtuoso 实际上返回的是空结果,您可以使用 DBpedia 的 SPARQL 端点来检查。

但是 Fuseki 和 Jena ARQ 返回非空结果:0。您可以在 sparql.org 上查看。

我不知道您是否可以更改avg的行为,但您可能不应该这样做,因为 Jena 在这里做的是正确的事情,而 Virtuoso(DBpedia 的端点)做错了。SPARQL 1.1 标准特别定义了avg在组为空时返回:

18.5.1.4 平均

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 |
===========
|         |
-----------
于 2015-04-14T20:28:55.913 回答