- From: Seaborne, Andy <andy.seaborne@hp.com>
- Date: Fri, 04 Feb 2005 22:12:08 +0000
- To: RDF Data Access Working Group <public-rdf-dawg@w3.org>
A couple of people have said they found the formatting of the query results
confusing. I have redone them as text tables and inserted the equivalent
inline below in case that helps.
Andy
Seaborne, Andy wrote:
>
> Re: ACTION AndyS: to propose test case re optionals and ordering
>
> Before I get to test cases, I'd like to describe the problem.
>
>
> ==== Data:
>
> @prefix : <http://example.org/ns#> .
>
> :z :q "z-q-1" .
>
> :x :p "x-p-1" ;
> :q "x-q-1" ;
> :r "x-r-1" .
>
> :y :p "y-p-1" .
>
> == Query 1:
>
> ---------------------------
>
> PREFIX : <http://example.org/ns#>
> SELECT ?a ?v ?w
> WHERE
> ( ?a :p ?v )
> OPTIONAL ( ?a :q ?w )
>
> 1 ( ?a = :y) ( ?v = "y-p-1")
> 2 ( ?a = :x) ( ?v = "x-p-1") ( ?w = "x-q-1")
That is two solutions, one per line. As a text table:
--------------------------
| a | v | w |
==========================
| :y | "y-p-1" | |
| :x | "x-p-1" | "x-q-1" |
--------------------------
A blank cell entry means the variable is not bound in that solution.
>
> The first triple pattern has solutions
> ( ?a = :y) ( ?v = "y-p-1")
> ( ?a = :x) ( ?v = "x-p-1")
Executing just the first triple pattern gets:
PREFIX : <http://example.org/ns#>
SELECT ?a ?v ?w
WHERE
( ?a :p ?v )
-----------------------
| a | v | w |
=======================
| :y | "y-p-1" | |
| :x | "x-p-1" | |
-----------------------
The blank column for "w" is simply because it appears in the SELECT but not
in the query pattern.
> and the optional adds ( ?w = "x-q-1") to the second.
It adds the entry in the "w" column.
>
>
> Optional, but also including passing through the input solution of
> from the first triple pattern:
>
> 1 ( ?a = :y) ( ?v = "y-p-1")
> 2 ( ?a = :x) ( ?v = "x-p-1")
> 3 ( ?a = :x) ( ?v = "x-p-1") ( ?w = "x-q-1")
>
> adding the solution at line 2 which is a subset of line 3.
--------------------------
| a | v | w |
==========================
| :y | "y-p-1" | |
| :x | "x-p-1" | |
| :x | "x-p-1" | "x-q-1" |
--------------------------
>
> ---------------------------
>
> == Query 2:
> As Query 1 but with the lines in the WHERE clause reversed.
>
> PREFIX : <http://example.org/ns#>
> SELECT ?a ?v ?w
> WHERE
> OPTIONAL ( ?a :q ?w )
> ( ?a :p ?v )
>
> Optional, not passing through input if there is a match:
> Different to query 1:
>
> 1 ( ?a = :x) ( ?v = "x-p-1") ( ?w = "x-q-1")
--------------------------
| a | v | w |
==========================
| :x | "x-p-1" | "x-q-1" |
--------------------------
>
> The first pattern, the optional, creates two partial solutions:
> ( ?a = :z) ( ?w = "z-q-1")
> ( ?a = :x) ( ?w = "x-q-1")
> the first is masked by the base pattern following. It's the same as
> if there were no optional.
The query with just the optional expression:
PREFIX : <http://example.org/ns#>
SELECT ?a ?v ?w
WHERE
OPTIONAL ( ?a :q ?w )
-----------------------
| a | v | w |
=======================
| :z | | "z-q-1" |
| :x | | "x-q-1" |
-----------------------
A blank column because ?v is metioned in the SELECT but not used in query
pattern.
>
>
> Including passing through the input solutions we get the same as query 1
> when it
> passed through the input solutions:
>
> 1 ( ?a = :y) ( ?v = "y-p-1")
> 2 ( ?a = :x) ( ?v = "x-p-1")
> 3 ( ?a = :x) ( ?v = "x-p-1") ( ?w = "x-q-1")
>
> Again, solution 2 is a subset of solution 3.
--------------------------
| a | v | w |
==========================
| :y | "y-p-1" | |
| :x | "x-p-1" | |
| :x | "x-p-1" | "x-q-1" |
--------------------------
>
> --------
>
> Call the form of optional including passing through the initial solution
> "stable" as it always gets the same answer regardless of order.
>
> But there are always "unhelpful" solutions. For any optional, there is the
> original and extended solutions when the intention was more to be adding in
> additional information if available (the "useful" form).
>
>
> I have not found an algorithm to filter the results of the "stable"
> optional form to get the "useful" form which does not involve sorting
> the result set in some way. Even then, I am not convinced that it is
> right to do it by direct sorting.
>
> I consider a requirement to sort as undesirable as it breaks streaming
> and is hard to do for large results (larger than available main memory).
>
> A way to resolve this is to generalise the optional variable rule to say
> that
> the execution order must be as if any variables that can be bound by a
> fixed
> pattern are done before an optional they are used in. Another way of
> saying this: if a variable is in an optional, it must not have been used
> in later pattern if it had not been used in an earlier one. That makes
> two optionals, sharing a variable illegal.
>
>
> Much the same goes for constraints:
>
> AND ?x < 3
> (?a :p ?x)
> compared to:
> AND ?x < 3
> (?a :p ?x)
>
>
> That's an informal description - I'm working on a formal definition.
>
> There is a decision point as to whether the syntactic query is "wrong"
> if variables are out of order or whether the query is "right" and the
> execution engine has to execute in an appropriate order, but exactly the
> syntactic query order.
>
> Andy
>
>
>
Received on Friday, 4 February 2005 22:12:48 UTC