如果没有匹配的三重模式,Jena ARQ会返回AVG()的非空结果

Max*_*hin 2 sparql jena fuseki

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

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

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

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

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

Jos*_*lor 6

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

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

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

18.5.1.4平均

平均集函数计算组上表达式的平均值.它以Sum和Count来定义.

定义:平均数字平均值(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
Run Code Online (Sandbox Code Playgroud)

-----------
| average |
===========
| 3.0     |
-----------
Run Code Online (Sandbox Code Playgroud)

并且在没有?x的值的情况下:

select (if(count(?x) = 0,?undef,avg(?x)) as ?average) where {
  values ?x {}
  values ?undef { undef }
}
group by ?undef
Run Code Online (Sandbox Code Playgroud)

-----------
| average |
===========
|         |
-----------
Run Code Online (Sandbox Code Playgroud)