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为给定查询返回空结果?如果是这样,那怎么样?
我们期望(至少我这样做)查询应返回空结果.而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)