4

次のSPARQLクエリは、2つの一般的なSDK(JenaSesame / 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)
}

最新バージョンのイエナの結果は私には理にかなっています(読みやすくするためにフォーマットされています):

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標準を正しく実装するという意味で)?

4

1 に答える 1

2

この違いは、Sesameの除算演算子の実装で採用されている異なる丸め/スケーリング戦略によって説明されます。

最初の演算子:

1 / 3 as ?v

2つの整数値を除算し、結果を?vにバインドします。これは、decimal型の値になります。

1/3は小数展開が終了しない分数であるため、結果を丸める必要があります。ただし、2つの入力変数のスケール(つまり、小数点以下の桁数)がゼロであるため、SesameのMathUtilは結果のスケールもゼロに設定し、除算の結果(0.3333 ...)は0桁にスケーリングされます。丸められ、結果は0になります。

入力値にスケールを明示的に追加することで、Sesameでこれを回避できます。例えば:

SELECT  ?v1 
WHERE
{
    BIND ( 1.0000 / 3 as ?v1)
}

結果は次のようになります。

?v1:  "0.3333"^^<http://www.w3.org/2001/XMLSchema#decimal>    

ここで実際に行うことは、入力値の1つを整数から小数に変更することであることに注意してください。これは、Javaで1/3を実行すると0になる方法と多少似ていますが、doubleにキャストすることで回避できます。

XPath仕様(SPARQLが再利用する除算演算子を定義する)からわかる限り、数値演算でのスケーリング数の選択は実装によって定義されるため、JenaとSesameの両方が仕様に準拠して動作します。

もちろん、それは、セサミが除算を行うときにそのような繰り返し分数に対して実際により高い精度を使用した場合、より実用的ではないということではありません。http://www.openrdf.org/issues/browse/SES-1063に改善リクエストとして記録されていますが、これは簡単なことなので、次のリリースでサポートされる予定です。それまでの間、上記の方法で適切な回避策が得られることを願っています。

于 2012-07-19T00:34:34.957 に答える