- From: Seaborne, Andy <andy.seaborne@hp.com>
- Date: Thu, 12 Mar 2009 13:43:42 +0000
- To: Steve Harris <steve.harris@garlik.com>, SPARQL Working Group <public-rdf-dawg@w3.org>
> -----Original Message----- > From: public-rdf-dawg-request@w3.org [mailto:public-rdf-dawg- > request@w3.org] On Behalf Of Steve Harris > Sent: 12 March 2009 10:33 > To: SPARQL Working Group > Subject: Re: [sub-select] Some examples and discussion > > On 12 Mar 2009, at 06:39, Lee Feigenbaum wrote: > > The idea of using ASK queries in expressions appeals to me as well, > > though it doesn't necessarily read as well as !EXISTS in SQL. The > > verbosity is similar though, I guess. > > Similar, and it's one less bit of syntax. My personal preference is > for fewer, more flexible verbs. But it's just a matter of taste. > > > I'm curious as to the interplay between: > > > > projected expressions > > sub-selects > > assignment > > > > Is there a combination of these that makes the 3rd irrelevant? Or > > pairs of them that are far more useful when included together? > > That's the sort of thing I'm working to wrap my head around. > > Yes, if you have projected expressions then you effectively get > assignments: > > SELECT ?x > WHERE { > ?x :age ?age . > FILTER(?age >= ?min_age) > (SELECT 18 AS ?min_age) > } > > Is equivalent to: > > SELECT ?x > WHERE { > ?x :age ?age . > FILTER(?age >= ?min_age) > LET(?min_age := 18) > } Steve - good example because it's different and a bit more tricky. Let (err - no pun intended) me work though the details. This is a more tricky example than the one I gave because syntactically you assign after the use of ?min_age in the FILTER which raises the necessary question of scope and order. SELECT ?name ?inch { ?x foaf:name ?name . ?x :height ?cm . LET ( ?inch := ?cm/2.54 ) FILTER (?inch > 68) } My example was chosen so that the rewrite was nesting: the LET (assign) over pattern P is SELECT (assign) { P }. SELECT ?name ?inch { { SELECT ?name ( ?cm/2.54 AS ?inch ) { ?x foaf:name ?name . ?x :height ?cm . } } FILTER (?inch > 68) } The choice of BGP-Assign-FILTER (modelled after the current SPARQL BGP-Filter that happens translating query string to algebra) was to keep things simple and let assignments be visible in the filter. In your example I can see ~two possibilities: we have ?min_age used in the filter before the (SELECT) assignment. How do things combine in group? Up to now it's a join. It gets the right answer, via a different route. Suppose the (SELECT) has a variable ?age - by scoping, it's a different ?age, right? SELECT ?x WHERE { ?x :age ?age . FILTER(?age >= ?min_age) (SELECT 18 AS ?min_age) } Possibility 1: (join ( ?x :age ?age . FILTER(?age >= ?min_age) ) (SELECT 18 AS ?min_age) ) (But is the scoping right?) Or (SELECT 18 AS ?min_age), that is, no pattern, is an assignment But to make your query work, the assignment must be executed before the filter. Possibility 2: Or does the conversion to algebra reorder to ?x :age ?age . Then assign Then FILTER(?age >= ?min_age) ) This is how it might be specified - the optimizer can do sensible things with that later To everyone: What do other systems already do? What do application writers think? What principles should matter most in practice? Andy
Received on Thursday, 12 March 2009 13:45:03 UTC