- From: Steve Harris <steve.harris@garlik.com>
- Date: Fri, 25 Nov 2011 13:43:31 +0000
- To: birte.glimm@uni-ulm.de
- Cc: Andy Seaborne <andy.seaborne@epimorphics.com>, SPARQL Working Group <public-rdf-dawg@w3.org>
Great, thanks. I think http://www.w3.org/2009/sparql/docs/query-1.1/rq25.xml#convertGroupAggSelectExpressions now contains all these changes. It makes sense to me. I used R for aggregate and X for the expression in the end. Cheers, Steve On 2011-11-23, at 10:36, Birte Glimm wrote: > On 22 November 2011 21:37, Steve Harris <steve.harris@garlik.com> wrote: >> On 22 Nov 2011, at 18:06, Birte Glimm wrote: >> >>> On 22 November 2011 13:50, Steve Harris <steve.harris@garlik.com> wrote: > [snip] > > I just noticed the fix for unaggregated vars in expressions got lost > in my summary code, so I fix that below: > >>> ------------------------ >>> Let A := the empty sequence >>> Let Q := the query level being evaluated >>> Let P := the algebra translation of the GroupGraphPattern of the query level >>> Let E := [], a list of pairs of the form (variable, expression) >>> >>> If Q contains GROUP BY exprlist >>> Let G := Group(exprlist, P) >>> Else >>> Let G := Group((1), P) >>> End >>> >>> Let i := 1 >>> >>> For each expression E in SELECT and each HAVING(E) in Q > If E contains an unaggregated variable V > Replace V with Sample(V) >>> End >>> For each aggregate X(args ; scalarvals) now in E >>> # note scalarvals may be omitted, then it's equivalent to the empty set >>> Ai := Aggregation(args, X, scalarvals, G) >>> Replace X(...) with aggi in Q >>> i := i + 1 >>> End >>> End >>> >>> For each variable V appearing outside of an aggregate >>> Ai := Aggregation(V, Sample, {}, G) >>> E := E append (V, aggi) >>> i := i + 1 >>> End >>> >>> A := Ai, ..., Ai-1 >>> P := AggregateJoin(A) >>> >>> For each HAVING(E) in Q >>> P := Filter(E, P) >>> End >>> >>> Note: E is then used in 18.2.4.4 for the processing of select >>> expressions. > -------------------- >> OK, that seems pretty reasonable, but "Expression E" etc. probably needs some other symbol to reduce confusion. > > > Agreed. Maybe exp? X already used for aggregates. > >> I think there's a problem with SELECT though: >> >> SELECT ?x >> WHERE { ?x a <Foo> } >> GROUP BY ?x >> >> "If E does not contain an aggregate" will be true, and that will become SELECT Sample(?x), but the extend E will not be modified. > > My idea is to handle those variables in the latter for loop and I > hoped that simple variables are not expressions, but I'm probably > wrong about this. So we could strengthen the condition of the first > loop to, e.g., > > For each (Exp AS Var) in SELECT and each HAVING(Exp) in Q > If Exp contains an unaggregated variable V > Replace V with Sample(V) > End > For each aggregate X(args ; scalarvals) now in Exp > # note scalarvals may be omitted, then it's equivalent to the empty set > Ai := Aggregation(args, X, scalarvals, G) > Replace X(...) with aggi in Q > i := i + 1 > End > End > > For each variable V appearing outside of an aggregate in SELECT > Ai := Aggregation(V, Sample, {}, G) > E := E append (V, aggi) > i := i + 1 > End > > I also added *in SELECT* to the latter for loop, to clarify that the > loop only applies to selected unaggregated variables (and not > arbitrary variables in Q). Is it clear though that this should not > apply to the assigment variables such as ?x in (?y AS ?x)? This loop > is only for plain, unaggregated, selected variables as in SELECT ?x > ... > Maybe > For each selected unaggregated variable in SELECT? > or > For each selected item selItem in SELECT > If SelItem is a variable > Ai := Aggregation(SelItem, Sample, {}, G) > E := E append (SelItem, aggi) > i := i + 1 > End > End > >> "If E does not contain an aggregate, or group variable" may cover it? > > Even if the variable is grouped, we have to sample it and introduce > Extend() since grouping by itself does not lead to any solution > mappings being constructed. > > Birte > [snip] > -- Steve Harris, CTO, Garlik Limited 1-3 Halford Road, Richmond, TW10 6AW, UK +44 20 8439 8203 http://www.garlik.com/ Registered in England and Wales 535 7233 VAT # 849 0517 11 Registered office: Thames House, Portsmouth Road, Esher, Surrey, KT10 9AD
Received on Friday, 25 November 2011 13:44:04 UTC