- From: Eric Prud'hommeaux <eric@w3.org>
- Date: Thu, 8 Dec 2005 19:30:59 -0500
- To: Jeremy Carroll <jjc@hpl.hp.com>
- Cc: public-rdf-dawg@w3.org, SWBPD <public-swbp-wg@w3.org>
- Message-ID: <20051209003059.GA7513@w3.org>
On Mon, Dec 05, 2005 at 05:48:31AM -0500, Eric Prud'hommeaux wrote: > On Wed, Nov 30, 2005 at 03:58:17PM +0000, Jeremy Carroll wrote: > > > > > > 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. > > For graph matching, B compares literal by value, therefor, B's > database contains all of the extra triples stemming from the known > equivilences. SPARQL's graph matching is matched against this larger > set of triples. > > For FILTERS, the semantics are entirely defined in SPARQL, so no extra > clever database will give you extra clever FILTERS. > > > 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 > > Agreed > > > Whereas: > > > > SELECT ?s, ?p > > WHERE { ?s, ?p, ?o . > > FILTER (?o = 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 (?o = 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 . > > @FLOAT@ > > > > > because the numeric rules would cast "1.3"^^xsd:float to the nearest > > double, which is not "1.3"^^xsd:double. > > I've been scratching my head about this for a while. > Is this a last-bit-might-be-wrong problem, or something more related > to type promotion voodoo? I've confirmed that Jeremy is describing a precision problem. While my implementation won't reveal the existence or frequency of it, it does make sense to me. > > 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(?o) = xsd:float(1.3) ) . } . > > > > using explicit casts. > > This would return all four triples. > > > > Please indicate whether these examples are correct. Correct. > I don't have a rigorous enforcement of numeric types in my > implementation (I rely on perl to do all the numeric comparisons). > However, all this seems consistent except for my not understanding > the lack of "1.3"^^xsd:float at the @FLOAT@ marker (above). > > > 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. > > Andy, take a bow. -- -eric office: +81.466.49.1170 W3C, Keio Research Institute at SFC, Shonan Fujisawa Campus, Keio University, 5322 Endo, Fujisawa, Kanagawa 252-8520 JAPAN +1.617.258.5741 NE43-344, MIT, Cambridge, MA 02144 USA cell: +81.90.6533.3882 (eric@w3.org) Feel free to forward this message to any list for any purpose other than email address distribution.
Received on Friday, 9 December 2005 00:31:08 UTC