- From: Andy Seaborne <andy.seaborne@epimorphics.com>
- Date: Thu, 08 Dec 2011 09:02:56 +0000
- To: public-rdf-dawg@w3.org
On 07/12/11 13:57, Steve Harris wrote:
> On 2011-12-07, at 13:00, Andy Seaborne wrote:
>
>>
>>
>> On 06/12/11 22:40, Steve Harris wrote:
>>> Hi all,
>>>
>>> I've now got the aggregates in a state where I think all the information is carried through from one end of the query to the other… but I've thought that before :)
>>>
>>> I also think ORDER BY is covered.
>>>
>>> Here's a sketch of what I think should be happening:
>>>
>>> Data
>>>
>>> <a> <p> 1 .
>>> <a> <p> 2 .
>>> <b> <p> 3 .
>>>
>>> Query
>>>
>>> SELECT (MAX(?o) AS ?max) (MIN(?o) AS ?min)
>>> WHERE { ?s ?p ?o }
>>> GROUP BY ?s
>>> ORDER BY AVG(?o)
>>>
>>>
>>> Ω = Sol ?s ?p ?o
>>> μ1<a> <p> 1
>>> μ2<a> <p> 2
>>> μ3<b> <p> 3
>>>
>>> G = Group((?s), Ω)
>>> = { ((<a>), { μ1, μ2 }), ((<b>), { μ3 }) }
>>>
>>> Q = SELECT agg1 agg2
>>> WHERE { ?s ?p ?o }
>>> GROUP BY ?s
>>> ORDER BY agg3
>>>
>>> E = { (?max, agg1), (?min, agg2) }
>>>
>>> A1 = Aggregation((?o), Max, {}, G)
>>> A2 = Aggregation((?o), Min, {}, G)
>>> A3 = Aggregation((?o), Avg, {}, G)
>>>
>>> J = AggregateJoin(A) =
>>> { { (agg1, 2), (agg2, 1), (agg3, 1.5) }
>>> { (agg1, 3), (agg2, 3), (agg3, 3) } }
>>
>>
>> This is the evaluation of AggregateJoin at execution time.
>>
>> I don't understand this step: how does it know the variables are agg1, agg2, and agg3? There could be other agg_i from other query levels. And why this order not agg3, agg2, agg1?
>
> From the A, A has members 1, 2, and 3 in this case. A1 pairs with agg1 for e.g.
>
> If it were a lower query level it might have members 4, 5, and 6 for e.g.
Not quite: i is reset on every SELECT processed
"""
# Note, i is global for the query, defaults to 1
Let i := 1
"""
The comment might have that intent, but, to me, "Let" introduces a
variable each time.
It is workable as a definition but rather unclear to me. The fact it
works relies on scoping features of variables so that the use of agg_1
twice does not fall apart.
Also, the variable names are regenerated. How does AggregateJoin know
the variable is called "agg1" not "__gen1" because the query really does
use ?agg1 in teh user written part?
I think it would have been easier to do it all in the translation and
not have AggregateJoin which is really just a form of "extend" assigning
Ai to agg_i.
Just rewriting to
extend( ?agg1 := Aggregation((?o), Max, {}, G),
?agg2 := Aggregation((?o), Min, {}, G),
?agg3 := Aggregation((?o), Avg, {}, G) )
would keep the aggregation and the variable together.
If the reviewers are comfortable with the form in the doc, then I can
live with it but I think it works by relying on human reading and
associating text.
Andy
Received on Thursday, 8 December 2011 09:03:31 UTC