- From: Geoff Chappell <geoff@sover.net>
- Date: Wed, 23 Feb 2005 13:19:19 -0500
- To: <andy.seaborne@hp.com>
- Cc: <public-rdf-dawg-comments@w3.org>
> -----Original Message----- > From: Seaborne, Andy [mailto:andy.seaborne@hp.com] > Sent: Wednesday, February 23, 2005 10:00 AM > To: Geoff Chappell > Cc: public-rdf-dawg-comments@w3.org > Subject: Re: Questions about OPTIONAL > > Geoff Chappell wrote: > > A few questions about OPTIONAL... > > > > 1) If I had a query like this: > > > > PREFIX foaf: <http://xmlns.com/foaf/0.1/> > > SELECT ?x ?name ?y > > WHERE ( ?x foaf:name ?name ) > > OPTIONAL ( ?x foaf:mbox ?mbox ) > > ( ?y foaf:mbox ?mbox ) > > > > with data: > > > > @prefix foaf: <http://xmlns.com/foaf/0.1/> . > > > > _:a foaf:name "Alice" . > > _:b foaf:name "Bob" . > > _:b foaf:mbox <mailto:bob@work.example> . > > _:c foaf:mbox <mailto:noname@work.example.org> . > > > > > > should I get: > > > > x name y > > === ======= === > > _:b "Bob" _:b > > > > or: > > > > x name y > > === ======= === > > _:a "Alice" _:b > > _:a "Alice" _:c > > _:b "Bob" _:b > > Geoof - thank you very much for including a concrete example: > > The current working draft is inadequate in the treatment of order of > execution > implications - this is something that has to be done. > > > Executed purely in the order given, I tried your example and get: > > ------------------------- > | x | name | y | > ========================= > | _:b0 | "Alice" | _:b1 | > | _:b0 | "Alice" | _:b2 | > | _:b2 | "Bob" | _:b2 | > ------------------------- > > but as: > > PREFIX foaf: <http://xmlns.com/foaf/0.1/> > # Add ?mbox to select for clarity > SELECT ?x ?name ?y ?mbox > WHERE ( ?x foaf:name ?name ) > # Reverse these next two lines. > ( ?y foaf:mbox ?mbox ) > OPTIONAL ( ?x foaf:mbox ?mbox ) > > > I get: > > ------------------------------------------------------------ > | x | name | y | mbox | > ============================================================ > | _:b0 | "Bob" | _:b0 | <mailto:bob@work.example> | > | _:b0 | "Bob" | _:b1 | <mailto:noname@work.example.org> | > | _:b2 | "Alice" | _:b0 | <mailto:bob@work.example> | > | _:b2 | "Alice" | _:b1 | <mailto:noname@work.example.org> | > ------------------------------------------------------------ > > because the first two triple patterns are unconnected so the number of > results > is 2 * 2 (each matches twice), and the optional adds nothing because ?x > and > ?mbox were already defined by earlier patterns. So your implementation is clearly taking the path of not binding the variables as opposed to binding them to a NULL (for optional vars not bound by the conditions of the optional). If you bind values to a NULL, you'll get the same result regardless of evaluation order. That seems to speak for this approach. [...] > Having OPTIONAL always pass the "no match" case even when there are other > matched results in a stable execution order but it results in extra > solutions > that add nothing except complications for applications. > > For example: > > @prefix foaf: <http://xmlns.com/foaf/0.1/> . > > _:a foaf:name "Alice" . > _:a foaf:mbox <mailto:alice@work.example> . > > Query: > > PREFIX foaf: <http://xmlns.com/foaf/0.1/> > SELECT ?name ?mbox > WHERE > ( ?x foaf:mbox ?mbox ) > OPTIONAL ( ?x foaf:name ?name ) > > > gives: > > ----------------------------------------- > | name | mbox | > ========================================= > | "Alice" | <mailto:alice@work.example> | > ----------------------------------------- > > > or: > > ----------------------------------------- > | name | mbox | > ========================================= > | | <mailto:alice@work.example> | > | "Alice" | <mailto:alice@work.example> | > ----------------------------------------- You'd only get this if you treated an optional like an or rather than an exclusive or, right? i.e.: (?x foaf:mbox ?mbox) and ((?x foaf:name ?name) or ?name=NULL) vs. (?x foaf:mbox ?mbox) and ((?x foaf:name ?name) or (not (?x foaf:name ?name) and ?name=NULL)) Or if you didn't bind name to a NULL and evaluated the conjuncts in differing order. > Given the idea behind optional of "add extra information to a solution if > available, but don;t fail if not there" > > In simple cases, it may be possible to filter the output to remove this > redundancy but in more complicated queries (for example, ?name is used > elsewhere > as well, multiple optionals, sharing variables), I didn't manage to find a > way > that kept the streaming requirement for results. > > If the application is displaying information for people, then getting two > answers back for what is one person is a less useful paradigm. It is a > tradeoff > of convenience. > > I did find that (same results as the last example): > > PREFIX foaf: <http://xmlns.com/foaf/0.1/> > SELECT ?name ?mbox > WHERE > ( ?x foaf:mbox ?mbox ) > { {} UNION ( ?x foaf:name ?name ) } > > is illegal in the current grammar (a form of "A and (B or not B)" for > optionals). Maybe it shouldn't be. Thoughts? That seems more like: A and (B or true) than: A and (B or not B) You can't really simulate an optional without some form of not (NAF). While on the grammar subject :)... I'd really like to see the grammar described in terms of conjuncts (logical factors) and disjuncts (logical terms) where constraint expressions are just one more form of logical factor. E.g. condition :- logical_term [ "union" logical_term]* logical_term:- logical_factor [logical_factor]* logical_factor:- "(" term operator term ")" | logical_expression logical_expression:- "(" condition ")" | statement statement:- "(" term term term ")" term :- function | constant | variable ... So rather than: where (?s ?p ?o) and ?o > 2 Just say: where (?s ?p ?o)(?o > 2) The current "AND" connector between triple patterns and constraints is a mess. I'd say it either has to go away or the implicit and between triples need to be made explicit. -Geoff
Received on Wednesday, 23 February 2005 18:20:06 UTC