以下 SPARQL 查询在两个流行的 SDK(Jena和Sesame / OpenRDF)的 SPARQL 引擎上运行时会产生不同的结果:
PREFIX xsd:<http://www.w3.org/2001/XMLSchema#>
SELECT ?v1 ?v2 ?v3 ?v4 ?v5 ?v6
WHERE
{
BIND ( 1 / 3 as ?v1)
BIND ( xsd:float(1 / 3) as ?v2)
BIND ( xsd:float(1) / 3 as ?v3)
BIND ( ( 1.0 / 3) as ?v4)
BIND ( xsd:float(1.0 / 3) as ?v5)
BIND ( xsd:float(1.0) / 3 as ?v6)
}
Jena 最新版本的结果对我来说很有意义(为便于阅读而格式化):
v1: 0.333333333333333333333333
v2: "0.333333333333333333333333"^^xsd:float
v3: "0.33333334"^^xsd:float
v4: 0.333333333333333333333333
v5: "0.333333333333333333333333"^^xsd:float
v6: "0.33333334"^^xsd:float
另一方面,最新版本的 Sesame/OpenRDF 返回(为便于阅读而格式化):
v1: "0"^^<http://www.w3.org/2001/XMLSchema#decimal>
v2: "0.0"^^<http://www.w3.org/2001/XMLSchema#float>
v3: "0.33333334"^^<http://www.w3.org/2001/XMLSchema#float>
v4: "0.3"^^<http://www.w3.org/2001/XMLSchema#decimal>
v5: "0.3"^^<http://www.w3.org/2001/XMLSchema#float>
v6: "0.33333334"^^<http://www.w3.org/2001/XMLSchema#float>
强调一点:Jena 永远不会像 Sesame/OpenRDF 那样返回 0 或 0.0 或 0.3。任何人都可以解释为什么数字结果会有如此大的差异吗?以及如何对相同的 SPARQL 查询获得相同的结果?或者,哪一个是正确的(在正确实施 SPARQL 标准的意义上,无论数学正确性如何)?