- From: Andy Seaborne <andy@apache.org>
- Date: Mon, 06 Oct 2014 19:31:31 +0100
- To: "public-rdf-dawg-comments@w3.org >> public-rdf-dawg-comments" <public-rdf-dawg-comments@w3.org>
- Message-ID: <5432E003.1090809@apache.org>
-------- Forwarded Message -------- Subject: Re: Pattern involving BIND from 18.2.3 Examples of Mapped Graph Patterns Date: Mon, 06 Oct 2014 18:41:06 +0100 From: Andy Seaborne <andy@apache.org> To: public-sparql-dev@w3.org Bcc: public-sparql-comments because that list is where any next working group should check for comments. Added to http://www.w3.org/2013/sparql-errata Hi Rory - thank you for the report. Yes, the example is wrong and your correction is right. On 03/10/14 00:41, Rory Rother wrote: > > Hello, > > I was working through some of the spec to get a better understanding > of translating queries to SPARQL algebra and had a question about the > eleventh example in section 18.2.3 > (http://www.w3..org/TR/2013/REC-sparql11-query-20130321/#sparqlAlgebraExamples > <http://www.w3.org/TR/2013/REC-sparql11-query-20130321/#sparqlAlgebraExamples>). > > The example is > > { ?s :p ?v . {} BIND (2*?v AS ?v2) } > > and the given translation to SPARQL algebra is > > Join( > BGP(?s :p ?v), ?v2, 2*?v) , > Extend({}, ?v2, 2*?v) > ) > This is wrong in several ways: 1. BGP(?s :p ?v), ?v2, 2*?v) is nonsense. 2. Extend operates on the group so far as you have noticed. > I am having a hard time seeing how to get that translation. From my > understanding, I am starting with a GroupGraphPattern so I look to > the relevant box in section 18.2.2.6. I believe my GroupGraphPattern > has three elements: the triple pattern, the empty GroupGraphPattern, > and the BIND clause. I set G equal to the Join identity. Now I enter > the For loop by first setting E equal to the triple pattern. At the > end of the first loop, I just have G=BGP(?s :p ?v). At the start of > the second loop, I set E equal to {}. That satisfies the last If > statement so I set A equal to Translate({}). That should give me A > equal to the Join identity. Then G=Join( BGP(?s :p ?v, (the join > identity) ). So, at the end of the second loop, I just have G=BGP(?s > :p ?v). At the start of the third loop, I set E equal to the BIND > clause. That satisfies the third If statement, so I set G equal to > Extend(BGP(?s :p ?v), ?v2, 2*?v). That’s the end of the For loop so I > end up with > > Extend( BGP(?s :p ?v), ?v2, 2*?v ) > Yes. The only difference I would note is that spec description builds the whole expression then it is simplifed, not simplifying as the group elements are are collected. It creates the same algebra expression. So the correct result is via the unsimplified: extend( join({}, BGP(?s :p ?v)), ?v2, (2*?v)) > as the result. I believe the above translation gives solution > mappings different from those coming from the translation provided in > the spec. In fact, I believe the translation found in the spec would > give solution mappings to the pattern > > { > > {} > > BIND(2*?v AS ?v2) > > ?s :p ?v > > } > I think the spec would build the join in the other other, not that it matters to execution semantics. Join( Extend({}, ?v2, 2*?v) , BGP(?s :p ?v), ?v2, 2*?v) ) I recorded this pattern in the errata to stress the empty element starting point of a group that applies. { BIND(2*?v AS ?v2) ?s :p ?v } > Any insight you can provide is much appreciated. If this is not the > proper forum for such a question, then please accept my apologies (and > maybe let me know where I should be asking J). > > Rory > Thanks Andy
Received on Monday, 6 October 2014 18:32:01 UTC