- From: Seaborne, Andy <andy.seaborne@hp.com>
- Date: Fri, 23 Jun 2006 15:10:17 +0100
- To: Fred Zemke <fred.zemke@oracle.com>
- CC: public-rdf-dawg@w3.org
Fred Zemke wrote: > In my paper attached to > http://lists.w3.org/Archives/Public/public-rdf-dawg/2006AprJun/0170.html > on page 15, I posed the question of how to interpret queries of the form > { P1 } UNION {P2} OPTIONAL {P3}. > I maintained that the first operand of OPTIONAL must be an > empty pattern, based on BNF rule [20] GraphPattern, which > shows that an OptionalGraphPattern is necessarily preceded by > a FilteredBasicGraphPattern, which I took to be the first operand. > In private communication Andy Seaborne pointed me to the SPARQLer validator > at http://www.sparql.org/validator.html . > Since Andy pointed me at it, I assume the group regards it as a guide for > interpreting the draft. So I played around with it. My observation of > its behavior is as follows: > > 1. If an OPTIONAL is the very first token within a GroupGraphPattern, > then an implicit empty FilteredBasicGraphPattern is taken as its > first operand. This is in rq23 as { {} OPTIONAL { P } }. (and there is an editorial action to put in that {} is one result of no bindings.) > > 2. Otherwise the GroupGraphPattern is of the form { GraphPattern } > where the GraphPattern, according to rule [20], expands recursively > into something of the form > > Filtered1 NotTriples1 Filtered2 NotTriples2 ... Filteredn NotTriplesn > > where Filteredi is a FilteredBasicGraphPattern and NotTriplesi is a > GraphPatternNotTriples. Let j be the subscript of the particular > NotTriplesj that is the OptionalGraphPattern whose first operand is sought. > There are two subcases: > > a) Possibly Filteredj is not an empty pattern. In that case, Filteredj > is taken as the first operand of the OPTIONAL. > > b) If Filteredj is the empty pattern, then note that j cannot be 1 > (otherwise rule 1 above would apply). > Therefore NotTriples(j-1) exists, and if we examine the BNF > for NotTriples, we see that it can never be an empty pattern. > So we take NotTriples(j-1) as the first operand of OPTIONAL. > > Examples: > > 1. WHERE { OPTIONAL { P1 } } > > In this example, OPTIONAL is the first keyword within a GroupGraphPattern > so rule 1 applies. > > 2. WHERE { ?x ?y ?z OPTIONAL { P2 } } > > In this example, the OPTIONAL is preceded by a non-empty > FilteredBasicGraphPattern, which is the operand of the OPTIONAL > by rule 2)a) > > 3. WHERE { ?x ?y ?z { OPTIONAL { P2 } } } > > This example nests the OPTIONAL inside of braces, making it the > first token within a GroupGraphPattern. Therefore its first operand > is an implicit empty pattern. > > 4. WHERE { {P1} UNION {P2} OPTIONAL {P3} } > > In this example, the OPTIONAL is preceded by a NotTriples, the UNION. > Therefore {P1} UNION {P2} is the first operand of OPTIONAL > > 5. WHERE { {P1} UNION { {P2} OPTIONAL {P3} } } > > This example shows how to use {} to regroup example 4, forcing > {P2} as the operand of OPTIONAL, rather than the UNION. > > Examples 4 and 5 show tricky cases. Note that in 4, the use of > rule 2)b) does not make {P2} the operand of OPTIONAL, > because {P2} is nested within the NotTriple that is the UNION. > > 6. WHERE { ?x ?y ?z OPTIONAL {P2} OPTIONAL {P3} } > > The first operand of the first OPTIONAL is "?x ?y ?z". > For the first operand of the second OPTIONAL, it is preceded > by a NotTriple which is the first OPTIONAL. So the > first OPTIONAL is the first operand of the second OPTIONAL. > > Can other people confirm or deny that I have correctly stated > the intention? It looks right. I experimented by shuffling the grammar around and moving Optional into GraphPattern to see if that is clearer. GroupGraphPattern ::= <LBRACE> GraphPattern ( ( OptionalGraphPattern (<DOT>)? )+ GraphPattern )? <RBRACE> and taking Optional out of GraphPatternNotTriples. Parses the same language (I reran the syntax tests on this variant). It would make a slightly different abstract syntax tree but the same conceptual query because (Group A (Optional B C) ) # Prefix notation has the same results as (Group (Optional {A B} C) ) by expanding out the definition of optional. A and B not both FilteredGraphPatterns. Which is a group of one item: (Optional {A B} C) so implementations have choices in how they split parsing from internal representation of a query. There are some other ways to express the binary nature of OPTIONAL that I'd like to try out including what I believe will give exactly the same AST at the expense of a slightly more complicated grammar. Andy > > Fred > > >
Received on Friday, 23 June 2006 14:10:34 UTC