- From: Andy Seaborne <andy.seaborne@epimorphics.com>
- Date: Mon, 17 Jan 2011 21:53:42 +0000
- To: Birte Glimm <birte.glimm@comlab.ox.ac.uk>
- CC: SPARQL Working Group <public-rdf-dawg@w3.org>
On 17/01/11 18:44, Birte Glimm wrote: > Hi all, > I am just wondering how to interpret the not yet fully complete > definition of the translation to the SPARQL algebra, but going back to > the 1.0 spec also doesn't really help :-( > > I assume the query pattern > { triple1 OPTIONAL { BGP } triple 2 } > is ok according to the grammar. > > Now the question is whether optional applies to both triples or only > to the first one. In the former case I would get: > Join(LeftJoin(Bgp(triple1), Bgp(BGP), true), Bgp(triple2)) > whereas in the latter case it would be: > LeftJoin(Join(Bgp(triple1), Bgp(triple2)), Bgp(BGP), true), > both already with Z simplified away. > I tend to assume the former since my understanding is that I work from > left to right, but I couldn't see that from the spec (also the 1.0 > spec since this is not even 1.1 stuff and this bits in 1.1 are still > not finalized at least according to the @@ marks in the relevant > places) > > Similarly, I wonder how { triple1 {} triple2 } would be translated. > triple1 {} triple2 is not a BGP/triples block (is it?), so I guess I > would have use the description for GroupGraphPattern to translate the > three elements. For the first element (triple1) that gives Join(Z, > Bgp(triple1)), where I got Bgp(triple1) from Translate(triple1) where > I treat triple1 as TriplesBlock. The next element is, however, the > empty group, for which I also would have to obtain Translate({}), but > now {} is not a TriplesBlock but a group, so I go back into the > algorithm for GroupGraphPatterns, which again requires me to compute > translate({}), etc. I think it is assumed that I implicitly take the > elements out of the group to translate them, but then I have to > explicitly do that for groups whereas I don't have to do it from > things that are already just blocks of triples. Furthermore, it is not > said AFAICT that in this case TriplesBlock translates into Z. > > I have to say that the triples that are not in a group give me a bit > of a headache :-( > > Thanks for any clarification, > Birte > Birte, At http://www.w3.org/TR/rdf-sparql-query/#convertGraphPattern there isa a tranlsation step that goes: "For each element E in the GroupGraphPattern" GroupGraphPattern is the syntactic element between {} so { triple1 OPTIONAL { BGP } triple 2 } is iterating over triple1 OPTIONAL triple 2 (in syntax terms OPTIONAL is just a word followed by a {} in the abstract syntax tree - it hasn't become a binary operator yet). Let G := the empty pattern Z First time round loop: E = triple1 G := Join(G, A) => we have join(Z , triple1) Second time round loop: E = OPTIONAL { BGP } G := LeftJoin(G, A2, F) => we have LeftJoin(join(Z , triple1), OPTIONAL { BGP }) Third time round loop: E = triple2 G := Join(G, A) => join( LeftJoin(join(Z , triple1), OPTIONAL { BGP }) triple2) Now for { triple1 {} triple2 } 3 syntax elements, only immediately adjacent triples become a BGP and so {} splits. {} is Z by recursion (it is a GroupGraphPattern of zero elements so it's Z and no time round the "E in the GroupGraphPattern" loop. join( join( join(Z,triple1) , {}), triple2) Andy
Received on Monday, 17 January 2011 21:54:19 UTC