- From: Andy Seaborne <andy.seaborne@epimorphics.com>
- Date: Wed, 25 Aug 2010 16:37:42 +0100
- To: Axel Polleres <axel.polleres@deri.org>
- CC: Lee Feigenbaum <lee@thefigtrees.net>, Steve Harris <steve.harris@garlik.com>, SPARQL Working Group <public-rdf-dawg@w3.org>
On 25/08/10 13:33, Axel Polleres wrote: > In total, addressing 1) and 2) my current understanding is that we should change: > > "In aggregate queries and sub-queries variables that appear in the query > pattern, but are not grouped by cannot be projected nor used in project > expressions. In order to project arbitrary expressions the SAMPLE > aggregate may be used." > > --> > > "In aggregate queries and sub-queries variables *or expressions* that appear in the query > pattern, but are not grouped by cannot be projected, nor be used in project > expressions *(except within aggregations)*, *nor be used in HAVING clauses*. > In order to project arbitrary expressions the SAMPLE aggregate may be used." > > The formulation gets a bit heavier, but at least it seems clearer. Refining this: We need to forbid the *use* of ungrouped variables in the *specific SELECT* expression where the GROUP occurs. Otherwise: 1/ Use elsewhere in the query should be unaffected otherwise SELECT * { { SELECT ?x { ?x ?p ?o } GROUP BY ?x } ?o <p> 123 . } is illegal (it's a completely different ?o in the second use) which makes building queries by composition a nuisance. 2/ It's the undefined value of a non-key variable that's the issue because there isn't a clear value to give it. Introduction of an alias name is OK: this is being clear about the "use in expressions"(1/(1-?o) AS ?o1) SELECT (count(*) AS ?p) { ?s ?p ?o } GROUP BY ?s in extremis: SELECT (SAMPLE(?p) AS ?p) { ?s ?p ?o } GROUP BY ?s Personally, I'd be happy with forbidding the use variables of grouping expressions: SELECT (1/(1-?o) AS ?o1) { ?s ?p ?o } GROUP BY (1/(1-?o)) # Forbiddable SELECT ?o WHERE { ?s ?p ?o } GROUP BY (1/(1-?o)) # Forbiddable [[ In aggregate queries and sub-queries, variables that appear in the query pattern, but are not used to group the pattern, cannot be projected nor used in expressions in SELECT clause nor used in the expression of a HAVING clause of this query or sub-query unless they are part of an aggregate. They may be used as alias names. In order to project arbitrary expressions the SAMPLE aggregate may be used. ]] By saying "expressions" the use as alias names comes for free but it's clearer to say so. Andy
Received on Wednesday, 25 August 2010 15:38:33 UTC