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

时间:2015-04-14 19:47:12

标签: sparql jena fuseki

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

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

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

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

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

1 个答案:

答案 0 :(得分:6)

  

我们希望(至少我这样做)查询应返回空结果。   并且Virtuoso实际上返回空结果,您可以使用DBpedia   要检查的SPARQL端点。

     

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

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

  

18.5.1.4 Avg

     

Avg set函数计算表达式的平均值   一群人它以Sum和Count来定义。

     

定义:平均数字平均值(multiset M)

     

平均(M)=&#34; 0&#34; ^^ 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 |
===========
|         |
-----------