- From: Andy Seaborne <andy@apache.org>
- Date: Fri, 5 Aug 2016 17:43:49 +0100
- To: public-sparql-dev@w3.org
So is it this example that causing the confusion?
[[
DELETE { GRAPH <g1> { a b c } } INSERT { GRAPH <g1> { x y z } }
USING <g1> WHERE { ... }
]]
USING does setup the entire dataset whereas WITH just sets the initial
active graph for matching but leaves the dataset alone. It is like a
GRAPH<g>{... the where clause ...}
The example with USING looks wrong to me and at odds with the
definitional text for WITH.
USING resets the dataset. WITH does/should not.
The earlier text is reasonably clear about that.
Andy
On 05/08/16 16:02, Pavel Klinov wrote:
> Apologies, this email was meant to be sent to the list.
>
>
> ---------- Forwarded message ----------
> From: *Pavel Klinov* <pavel@complexible.com <mailto:pavel@complexible.com>>
> Date: Fri, Aug 5, 2016 at 4:37 PM
> Subject: Re: [SPARQL-Update] WITH, GRAPH, and USING [NAMED]
> To: Andy Seaborne <andy@apache.org <mailto:andy@apache.org>>
>
>
> Hi Andy,
>
> On Fri, Aug 5, 2016 at 3:32 PM, Andy Seaborne <andy@apache.org
> <mailto:andy@apache.org>> wrote:
>
> On 05/08/16 09:05, Pavel Klinov wrote:
>
>
>
> On Thu, Aug 4, 2016 at 11:04 PM, Pavel Klinov
> <pavel@complexible.com <mailto:pavel@complexible.com>
> <mailto:pavel@complexible.com <mailto:pavel@complexible.com>>>
> wrote:
>
>
> According to my, perhaps incorrect, reading of 3.1.3 this
> should be
> equivalent to:
>
> DELETE
> {
> GRAPH <http://example.org/g1> { ?s ?p ?o }
> }
> USING <http://example.org/g2> WHERE
> {
> GRAPH <http://example.org/g1> { :a foaf:knows ?s . ?s ?p ?o }
> }
>
> that is, WITH is ignored for DELETE because there's the explicit
> GRAPH clause but applies to WHERE because there's no USING
> [NAMED].
> Then this query should not delete any triples because the
> dataset
> for WHERE is composed of the empty default graph and :g2 as
> the only
> named graph, while WHERE matches triples in :g2.
>
>
> A correction here: the dataset for WHERE should be :g2 as the
> default
> graph and no named graphs (or unspecified named graphs, as per
> 13.2 in
> [3]). But the rest of the email holds, the query can still return no
> results contarry to the test.
>
>
> Hi Pavel,
> (not an official reply)
>
> I believe the intent is that WITH sets the default graph but
> otherwise the named graph are in the dataset visible.
>
>
> OK, that's a possible interpretation but it's different from wrapping
> WHERE in a GRAPH. Either it does something to the dataset or changes the
> pattern in WHERE, those are different things.
>
>
> Unlike USING, WITH is not describing the whole dataset to use. Is
> there text that suggested to it did? Or entangles WITH and USING? If
> so, an errata would be in order.
>
>
> First, there's the snippet you quoted below: "If a graph name is
> specified in a WITH clause, then - for the purposes of evaluating the
> WHERE clause - this will define an RDF Dataset..."
>
> Second, there's the example in 3.1.3:
>
> [[
>
> To illustrate the use of the WITH clause, an operation of the general form:
>
> WITH <g1> DELETE { a b c } INSERT { x y z } WHERE { ... }
> is considered equivalent to:
>
> DELETE { GRAPH <g1> { a b c } } INSERT { GRAPH <g1> { x y z } } USING
> <g1> WHERE { ... }
>
> ]]
>
> This gives the impression that WITH, when not ignored, is a syntactic
> sugar for USING. And since USING has basically the same meaning as FROM,
> it should follow that WITH defines the dataset to the extent that FROM
> does.
>
> Now, regarding your point that it may leave the set of named graphs
> unchanged. Actually 13.2 of the SPARQL spec seems to leave such possibility:
>
> [[
> If there is no FROM clause, but there is one or more FROM NAMED clauses,
> then the dataset includes an empty graph for the default graph.
> ]]
>
> See, it doesn't say what the set of named graphs is if there's FROM but
> no FROM NAMED (so in our case USING but not USING NAMED). So it's indeed
> possible for WITH, when interpreted as USING, to describe only the
> default graph. But even then the test with :g1 and :g2 doesn't seem
> right because in the absense of defined named graphs, an implementation
> doesn't have to include :g1. The dataset <:g2, {}> seems like a valid
> implementation choice.
>
>
> The later text:
> [[
> If a graph name is specified in a WITH clause, then - for the
> purposes of evaluating the WHERE clause - this will define an RDF
> Dataset containing a default graph with the specified name
> ]]
>
> look to me to be at odds with:
>
> [[
> The WITH clause defines the graph that will be modified or matched
> against for any of the subsequent elements (in DELETE, INSERT, or
> WHERE clauses) if they do not specify a graph explicitly.
> ]]
>
> [[
> That is, a WITH clause may be viewed as syntactic sugar for wrapping
> both the QuadPatterns in subsequent DELETE and INSERT clauses, and
> likewise the GroupGraphPattern in the subsequent WHERE clause into
> GRAPH patterns.
> ]]
>
> which both suggest your example of:
>
> > {
> > GRAPH <http://example.org/g2> {
> > GRAPH <http://example.org/g1> { :a foaf:knows ?s . ?s ?p ?o }
> > }
> > }
>
> is intended.
>
>
> Yes, I agree that the latter two sentences do suggest that. I don't
> object against such an interpretation, just trying to confirm what
> should be the right behavior.
>
> Thanks again,
> Pavel
>
>
>
> Andy
>
>
> Thanks,
> Pavel
>
> [3] https://www.w3.org/TR/sparql11-query/#specDataset
> <https://www.w3.org/TR/sparql11-query/#specDataset>
>
>
>
> However, this is not what DAWG tests [2] expect and it is
> not how
> ARQ or Sesame implement it (they pass the test). What I can tell
> from ARQ's source code is that it treats the query as follows:
>
> DELETE
> {
> GRAPH <http://example.org/g1> { ?s ?p ?o }
> }
> {
> GRAPH <http://example.org/g2> {
> GRAPH <http://example.org/g1> { :a foaf:knows ?s . ?s ?p
> ?o }
> }
> }
>
> In this case, of course, WHERE will match triples because
> the inner
> GRAPH will set :g1 as the active graph for the BGP. However
> 3.1.3
> says explicitly that WITH, when not ignored, defines an RDF
> Dataset
> -- this isn't what happens here.
>
> Another interpretation could be as follows: WITH is in
> effect for
> WHERE if there's no USING [NAMED] *and* there is no GRAPH
> clause in
> either DELETE or INSERT. According to that interpretation
> the test
> again should pass because WITH is simply ignored for the whole
> query, including WHERE, even though there's no USING [NAMED].
>
> So the question is: which interpretation is the intended one?
>
> Thanks,
> Pavel
>
> [1] https://www.w3.org/TR/sparql11-update/#deleteInsert
> <https://www.w3.org/TR/sparql11-update/#deleteInsert>
> <https://www.w3.org/TR/sparql11-update/#deleteInsert
> <https://www.w3.org/TR/sparql11-update/#deleteInsert>>
> [2]
> https://www.w3.org/2009/sparql/docs/tests/data-sparql11/delete/manifest#dawg-delete-with-02
> <https://www.w3.org/2009/sparql/docs/tests/data-sparql11/delete/manifest#dawg-delete-with-02>
>
> <https://www.w3.org/2009/sparql/docs/tests/data-sparql11/delete/manifest#dawg-delete-with-02
> <https://www.w3.org/2009/sparql/docs/tests/data-sparql11/delete/manifest#dawg-delete-with-02>>
>
>
>
>
>
>
Received on Friday, 5 August 2016 16:44:21 UTC