我有一个使用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配置为返回给定查询的空结果?如果是这样,那怎么样?
答案 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 |
===========
| |
-----------