- From: Richard Newman <rnewman@franz.com>
- Date: Sat, 5 Jul 2008 11:28:43 -0700
- To: Nuutti Kotivuori <naked@iki.fi>
- Cc: public-sparql-dev@w3.org, public-rdf-dawg@w3.org
> Second case is where the SPARQL query is:
>
> SELECT ?x where { ?x ns:p "value"^^xsd:string }
>
> In this case too, we get implementations that return just ns:b and
> implementations that return ns:a and ns:b.
This is exactly the same as the prior case; it's controlled by the
entailment regime (or bugs in the implementation!).
> The third case is a bit more complex SPARQL query:
>
> SELECT ?x where { ?x ns:p ?y FILTER (?y = "value") }
>
> This is somewhat trickier. The SPARQL specification defines that
> operator fn:compare is used to match between plain literal pairs and
> also between xsd:string pairs. I am not sure if the specification
> defines how a string literal in a filter clause should be interpreted
> - that is, if "value" is actually a plain literal or just some
> ephemeral string type.
It's a simple literal.
This query on these data involves four comparisons:
ns:a | simple literal = simple literal
ns:b | xsd:string = simple-literal
ns:c | typed literal = simple-literal # changes if we know that
dt:datatype is numeric
ns:d | literal = simple-literal
which, *in an unextended implementation*, means we call
op:numeric-equal(fn:compare(x, y, 0)
RDFterm-equal(x, y)
RDFterm-equal(x, y)
RDFterm-equal(x, y)
The result of the comparison is defined by those functions.
Note that:
1. implementations can add rows to the operator mapping table -- e.g.,
a row for xsd:string to simple-literal. This can result in additional
answers to your query. Many implementations do this (in fact, the
SPARQL test suite expects some extensions!).
2. under D-entailment, new triples will actually be considered,
producing more output rows (which might be redundant).
> The fourth case is again similar to the one before:
>
> SELECT ?x where { ?x ns:p ?y FILTER (?y = "value"^^xsd:string)
Same thing.
> The fifth case uses a yet another new operator:
>
> SELECT ?x where { ?x ns:p ?y FILTER (sameTerm(?y, "value")) }
>
> This case seems to be a clear cut decision in my opinion.
It's not an operator, which is why it's clear cut. The implementation
of sameTerm is not up for debate, so this produces well-defined
results (as would calling RDFterm-equal directly, rather than hoping
that = would yield such a call).
> However, even in this case, I found some implementations which return
> both ns:a and ns:b instead of just ns:a. These I would personally
> classify as non-conforming implementations.
I would agree.
> The sixth case is again a variation of the one before:
>
> SELECT ?x where { ?x ns:p ?y FILTER (sameTerm(?y,
> "value"^^xsd:string)) }
>
> In this case, there should be no question as to whether
> "value"^^xsd:string is a typed literal or not.
The SPARQL grammar is clear that "foo" is a simple literal.
> Even still, some implementations return both ns:a and ns:b instead of
> just ns:b in this case.
Still a bug.
HTH,
-R
Received on Saturday, 5 July 2008 18:29:33 UTC