Re: Questions on evaluation of unbound variables.

On Sat, Jul 01, 2006 at 04:03:19PM -0700, Dave Beckett wrote:
> 
> I was looking for the references that told me what to do when an
> unbound variable appears in a FILTER expression but I've been having
> trouble with locating them.  Maybe you can point me at the right
> places.

In 1.20, I took a conservative approach and added
    <li>Apart from <a href="#func-bound">BOUND</a>, all functions and operators operate on RDF Terms and will produce a type error if any arguments are unbound.</li>

to 11.2 Filter Evaluation [EVAL] and
  <li>All other arguments, including unbound arguments, produce a type error.</li>
                         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
to 11.2.2 Effective Boolean Value. This has not been approved by the DAWG.

This represents a potential curtailment of extensibility in that
extensions may not see the variable name or anything else about a
variable. I think this is reasonable for this version of SPARQL.
Looking at your test cases, I believe this wording addresses them.

[EVAL] http://www.w3.org/2001/sw/DataAccess/rq23/rq24#evaluation
[EBV] http://www.w3.org/2001/sw/DataAccess/rq23/rq24#ebv

> RDF Data (data.rdf) - the empty graph:
> <?xml version="1.0"?>
> <rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#">
> </rdf:RDF>
> 
> 
> Query 1: optional test
> PREFIX ex: <http://example.org/>
> SELECT ?s
> FROM <data.rdf>
> WHERE {
>   OPTIONAL { ex:a ex:b ?s }
> }
> 
> The answer to this is a well defined result set with 1 answer:
>   ?s=unbound
> 
> 
> Query 2: BOUND test
> PREFIX ex: <http://example.org/>
> SELECT ?s
> FROM <data.rdf>
> WHERE {
>   OPTIONAL { ex:a ex:b ?s }
>   FILTER BOUND(?s)
> }
> 
> This also has well defined answer - the empty result set - since
> BOUND takes a variable type argument and can check for variable
> boundness.
> 
> 
> Query 3: unbound variable
> PREFIX ex: <http://example.org/>
> SELECT ?s
> FROM <data.rdf>
> WHERE {
>   OPTIONAL { ex:a ex:b ?s }
>   FILTER (?s)
> }
> 
> What result should this give?

EBV of unbound now a type error

> My analysis: ?s is evaluated acording to Sec 11: Testing Values
> http://www.w3.org/TR/2006/CR-rdf-sparql-query-20060406/#tests
> which describes this as evaluating an expression; here that is ?s
> it says:
>   [[FILTERs eliminate any solutions that, when substituted into the
>   expression, result in either an effective boolean value of false or
>   produce an error. ]]
> 
> Does ?s with no binding for s evaluate to false or error?
> Is this a type error or another kind of error?
> 
> I couldn't find a section in the document to answer this.
> 
> The result set is the same in either case here but may not in other
> cases.  If the result is error, it may allow shortcutting some
> expression evaluation since the error value will propogate e.g
> in arithmetic expressions like
>   ?s / foo:bar(....)
> where foo:bar is something expensive to compute
> it need not be evaluated if ?s returns an error

(my usual example of this breaking is by putting not (!) around it)

> Query 4: unbound variable in expression evaluation
> PREFIX ex: <http://example.org/>
> SELECT ?s
> FROM <data.rdf>
> WHERE {
>   OPTIONAL { ex:a ex:b ?s }
>   FILTER (?s = FALSE)
> }

Also covered by EBV

> Depending on the answer to the question above, this filter expression
> will return Error if unbound ?s evaluates to Error or True if unbound
> ?s evaluates to False.
> 
> Which means different numbers of results will be given, either none or 1.
> So this query is a test for how current implementations evaluate
> this.
> 
> My reasoning for this is based on the T,F,E table in
>   http://www.w3.org/TR/2006/CR-rdf-sparql-query-20060406/#evaluation
> and
>   [[Any expression other than logical or (||) or logical and (&&) that
>    encounters an error will produce that error. ]]
>   -- ibid
> which applies here to the equal(=) function.
> 
> 
> Can you pass an unbound variable to an (extension) function?  I'm
> guessing not since
>   http://www.w3.org/TR/2006/CR-rdf-sparql-query-20060406/#extensionFunctions
> says the arguments are RDF terms.
> 
> 
> Query 5: unbound variable in an extension function
> PREFIX ex: <http://example.org/>
> PREFIX foo: <http://example.org/foo#>
> 
> SELECT ?s
> FROM <data.rdf>
> WHERE {
>   OPTIONAL { ex:a ex:b ?s }
>   FILTER foo:bar(?s)
> }

is not the BOUND operator so now a type error

> What does this return?
> 
> Does it do this without evaluating the extension function?
> 
> 
> This issue applies to Constructor Functions evaluating over undefined
> variables, which are defined in a different section:
> http://www.w3.org/TR/2006/CR-rdf-sparql-query-20060406/#FunctionMapping
> 
> 
> Query 6: unbound variable in constructor function
> 
> PREFIX ex: <http://example.org/>
> PREFIX xsd: <http://www.w3.org/2001/XMLSchema#>
> 
> SELECT ?s
> FROM <data.rdf>
> WHERE {
>   OPTIONAL { ex:a ex:b ?s }
>   FILTER (xsd:decimal(?s) = 0)
> }

ditto

> What does this return?
> 
> (using casting defined in
> http://www.w3.org/TR/xpath-functions/#casting-to-numerics
> )
> 
> ---
> 
> While checking these I found ARQ evaluates unbound ?s to Error, not
> False so that the answers to queries 3-6 are all the empty set.  I
> didn't test query 5 without having an extension function handy to use.
> 
> Dave

-- 
-eric

home-office: +1.617.395.1213 (usually 900-2300 CET)
	    +33.1.45.35.62.14
cell:       +33.6.73.84.87.26

(eric@w3.org)
Feel free to forward this message to any list for any purpose other than
email address distribution.

Received on Friday, 8 September 2006 12:27:08 UTC