- From: Axel Polleres <axel.polleres@deri.org>
- Date: Tue, 22 Feb 2011 09:07:07 +0000
- To: SPARQL Working Group <public-rdf-dawg@w3.org>
- Cc: Paul Gearon <gearon@ieee.org>
- Message-Id: <88E5FE52-741D-4936-8B64-9D5153EE5E8C@deri.org>
Hi Paul, Thanks, this example illustrates the actual difference between the two options [1,2] quite nicely, so, let me play them through. On data G: :x :p 12 . :x :r :z . :x :q 10 . Your query Q: DELETE { _:a :p 12 . _:a :q ?o . } WHERE {?s :r ?q OPTIONAL { ?q :s ?o } } would in *version 1* of my proposed semantics/rewriting [1] be treated as Q1: ------------------------------------- DELETE { ?Var_B :p 12 . ?Var_B :q ?o . } WHERE { {?s :r ?q OPTIONAL { ?q :s ?o } } { Q_Var_B } } with Q_Var_B = SELECT DISTINCT ?Var_B { { ?Var_B ?Var_B1 ?Var_B2 } UNION { ?Var_B1 ?Var_B ?Var_B2 } UNION { ?Var_B1 ?Var_B2 ?Var_B } UNION { GRAPH ?Var_Bg {?Var_B ?Var_B1 ?Var_B2 } } UNION { GRAPH ?Var_Bg {?Var_B1 ?Var_B ?Var_B2 } } UNION { GRAPH ?Var_Bg {?Var_B1 ?Var_B2 ?Var_B } } } ------------------------------------- whereas in *version 2* of my proposed semantics/rewriting [2] it would be treated as Q2: ------------------------------------- DELETE { ?Var_B :p 12 . ?Var_B :q ?o . } WHERE { {?s :r ?q OPTIONAL { ?q :s ?o } } { ?Var_B :p 12 . ?Var_B :q ?o . } } ------------------------------------- Now, on graph G, Q1 yields: :x :r :z . :x :q 10 . whereas Q2 yields: :x :r :z . > Is each part of the template treated as if it is a separate thing to > be deleted, or does the re-use of the same blank node label (_:a in > this case) have some kind of effect? That is another interesting point. Again the two rewritings I suggested behave differently in this respect! Assume an additional triple t :y :q 8 . in the graph G and assume the following variant of your query Q': DELETE { _:a :p 12 . _:a :q _:b . } WHERE {} In *version 1* of the rewriting which would yield DELETE { ?Var_A :p 12 . ?Var_A :q ?Var_B . } WHERE { {Q_Var_A} {Q_Var_B} } the triple t would be deleted, whereas in *version 2*, which would yield DELETE { ?Var_A :p 12 . ?Var_A :q ?Var_B . } WHERE { {?Var_A :p 12 . ?Var_A :q ?Var_B . } } t wouldn't be deleted. If we assume those queries corner cases, the choice of version 1 or version 2 seems to be a coinflip decision. So, we can define a semantics (either way). The more essential question this all boils down to is whether the use of bnodes as wildcards is actually understandable/intuitive. Particularly, since it seems most (all?) use cases can actually be achieved by some rewriting, if necessary. Opinions? best, Axel 1. http://lists.w3.org/Archives/Public/public-rdf-dawg/2011JanMar/0310.html 2. http://lists.w3.org/Archives/Public/public-rdf-dawg/2011JanMar/0307.html On 22 Feb 2011, at 03:53, Paul Gearon wrote: > Hi Axel, > > This is along the lines of what I was first thinking of, though I did > forget about the named GRAPH portions. However, does it address the > question that Andy raised about re-use of the blank node, particularly > where an OPTIONAL binding is introduced? I'll reproduce his example > here: > > DELETE > { _:a :p 12 . > _:a :q ?o . > } > WHERE {?s :r ?q OPTIONAL { ?q :s ?o } } > > So when that is applied to the following data: > > :x :p 12 . > :x :r :z . > :x :q 10 . > > The model you've proposed will certainly match the first triple in the > template for removal, but the ?o will be unbound, so what happens to > that part of the template? Does it get ignored, or does it prevent the > entire template from matching? (The latter is more in line with > CONSTRUCT and INSERT, but doesn't really work well with the proposed > formal model). > > Is each part of the template treated as if it is a separate thing to > be deleted, or does the re-use of the same blank node label (_:a in > this case) have some kind of effect? > > Regards, > Paul > > On Mon, Feb 21, 2011 at 3:10 AM, Axel Polleres <axel.polleres@deri.org> wrote: > > Thanks Greg for spotting this! Actually, there were two mistakes in the P_B > > pattern below... see inline. > > > > > > On 20 Feb 2011, at 23:40, Gregory Williams wrote: > > > > On Feb 18, 2011, at 1:31 PM, Axel Polleres wrote: > > > >> For any unnamed bnode _:B in a modify_template_DEL > >> (i) new variables ?Var_B ?Var_B1 ?Var_B2 ?Var_Bg are introduced, > >> (ii) _:B is replaced by ?Var_B in a modify_template_DEL, > >> (iii) Pattern P is replaced by P_B such that > >> > >> P_B = { P } UNION { > >> SELECT DISTINCT ?Var_B > >> { { ?Var_B ?Var_B1 ?Var_B2 } UNION > >> { ?Var_B1 ?Var_B ?Var_B2 } UNION > >> { ?Var_B1 ?Var_B2 ?Var_B } UNION > >> { GRAPH ?Var_Bg {?Var_B1 ?Var_B2 ?Var_B } } UNION > >> { GRAPH ?Var_Bg {?D1 ?Var_B2 ?Var_B } } UNION > >> { GRAPH ?Var_Bg {?Var_B1 ?Var_B2 ?Var_B } } } > >> > >> That is, ?Var_B binds to all possible values in the vocabulary of GS. > > > > I'm not totally swapped in on this issue, but I don't understand how this > > pattern aligns with the description. In all three named graph union > > branches, ?Var_B appears in the object position. Since ?Var_B is the only > > projected variable, don't these three branches return the same results? > > > > yes, that was a copy-paste error from an earlier version I had. The correct > > one should be > > P_B = { { P } { Q } } > > i.e. join, not UNION (thanks Andy, for pointing me to that offlist), where Q > > is defined as below... > > > >> I know that the definition of P_B doesn't look very nice, but this > >> definition should cover the intended semantics of [2]. > >> In principle, the idea is that bnodes, that should behave as wildcard > >> should bind to *any* element in the signature of GS, > >> which is what is returned by the subquery > >> Q = SELECT DISTINCT ?D > >> { { ?D ?D1 ?D2 } UNION > >> { ?D1 ?D ?D2 } UNION > >> { ?D1 ?D2 ?D } UNION > >> { GRAPH ?Dg {?D1 ?D2 ?D } } UNION > >> { GRAPH ?Dg {?D1 ?D2 ?D } } UNION > >> { GRAPH ?Dg {?D1 ?D2 ?D } } } > > > > ...corrected version of Q: > > > > Q = SELECT DISTINCT ?Var_B > > > > { { ?Var_B ?Var_B1 ?Var_B2 } UNION > > > > { ?Var_B1 ?Var_B ?Var_B2 } UNION > > > > { ?Var_B1 ?Var_B2 ?Var_B } UNION > > > > { GRAPH ?Var_Bg {?Var_B ?Var_B1 ?Var_B2 } } UNION > > > > { GRAPH ?Var_Bg {?Var_B1 ?Var_B ?Var_B2 } } UNION > > { GRAPH ?Var_Bg {?Var_B1 ?Var_B2 ?Var_B } } } > > > > Even more obvious in this one. Am I missing something? > > > > > > Hope I got it right now ;-) > > > > Thanks, > > Axel > > > > thanks, > > .greg > > > > > > > > > > >
Received on Tuesday, 22 February 2011 09:07:43 UTC