- From: Jeremy Carroll <jjc@hpl.hp.com>
- Date: Wed, 30 Nov 2005 15:58:17 +0000
- To: public-rdf-dawg@w3.org
- CC: SWBPD <public-swbp-wg@w3.org>
This question concerns your document: http://www.w3.org/TR/2005/WD-rdf-sparql-query-20051123/ In SWBPD WG, we have been discussing the semantics of typed literals. In particular, we are trying to decide between the three possibilities outlined in: http://www.w3.org/TR/2005/WD-swbp-xsch-datatypes-20050427/#sec-values The third of these (True Values) has not received any support. The second solution, based around XPath eq, is motivated to try and give a smoother experience to end users who may find data for which the choices between say xsd:double and xsd:decimal have not been consistent. Advocates of the first solution (Primitive Equality), which treats xsd:decimal and xsd:double as disjoint, have argued that the same end user functionality can be achieved by combining the first solution with SPARQL. The purpose of this e-mail is to confirm that line of argument with you. In this first solution (Primitive Equality) equality of typed literals is determined by comparing literals using their primitive base type, and treating all primitive base types as different. In this "1.3"^^xsd:float "1.3"^^xsd:double "1.3"^^xsd:decimal "1"^^xsd:float "1"^^xsd:double "1"^^xsd:decimal all have different values. My understanding is that SPARQL does not specify whether the store being queried is required or not to treat two literals with the same value but different syntactic form as the same or different. If we have two stores A and B where A compares literals syntactically, but B compares literal by value, and the value comparisons are done with the Primitive Equality semantics described as above, then my understanding is that the following results would hold. If the following triples are loaded into both A and B <eg:decimal> <eg:p> "1.3"^^xsd:decimal . <eg:float> <eg:p> "1.3"^^xsd:float . <eg:double> <eg:p> "1.3"^^xsd:double . <eg:decimal2> <eg:p> "1.300"^^xsd:decimal . Then: SELECT ?s, ?p WHERE { ?s, ?p, 1.3 } . would match <eg:decimal> <eg:p> "1.3"^^xsd:decimal . in A and <eg:decimal> <eg:p> "1.3"^^xsd:decimal . <eg:decimal2> <eg:p> "1.300"^^xsd:decimal . in B Whereas: SELECT ?s, ?p WHERE { ?s, ?p, ?o . FILTER (?size = 1.3) . } . would match all four triples for both A and B, since = is interpreted as in fn:numeric-equals() and type promotions apply to give equality in all cases. However, SELECT ?s, ?p WHERE { ?s, ?p, ?o . FILTER (?size = 1.3e0) . } . would match the following triples <eg:decimal> <eg:p> "1.3"^^xsd:decimal . <eg:double> <eg:p> "1.3"^^xsd:double . <eg:decimal2> <eg:p> "1.300"^^xsd:decimal . because the numeric rules would cast "1.3"^^xsd:float to the nearest double, which is not "1.3"^^xsd:double. If an application wanted to explicitly do the equality with floating point precision (rather than double precision), I understand the following query could be used: SELECT ?s, ?p WHERE { ?s, ?p, ?o . FILTER (xsd:float(?size) = xsd:float(1.3) ) . } . using explicit casts. This would return all four triples. Please indicate whether these examples are correct. thanks Jeremy Carroll PS I am arguing in the SWBPD WG, that since SPARQL adequately addresses the needs to make looser comparisons of the sorts above, where float and decimal and doubles are treated equivalently, then the next version of http://www.w3.org/TR/2005/WD-swbp-xsch-datatypes-20050427/ should be presenting primitive equality as the preferred semantics, and any further equivalences required by an application to be ones for the application to determine, for example, by use of queries such as those given here. PPS Note I am pleased to see the greater clarity in your latest WD concerning the type of '1.3' in SPARQL. I found it hard to tell in the earlier draft which datatype was intended. Personally I have no opinion as to which datatype is better, but I support the "in progress" change highlighted at the beginning of section 3 from an editorial point of view.
Received on Wednesday, 30 November 2005 16:01:20 UTC