- From: Pavel Klinov <pavel@complexible.com>
- Date: Fri, 5 Aug 2016 19:19:35 +0200
- To: Andy Seaborne <andy@apache.org>
- Cc: public-sparql-dev@w3.org
- Message-ID: <CAJ-ZGXpxeR3-r4u-hfUO5oShq9Vu4oVo1RBg=sME2a5fvSbhuA@mail.gmail.com>
On Fri, Aug 5, 2016 at 6:43 PM, Andy Seaborne <andy@apache.org> wrote:
> So is it this example that causing the confusion?
>
> [[
> DELETE { GRAPH <g1> { a b c } } INSERT { GRAPH <g1> { x y z } }
> USING <g1> WHERE { ... }
> ]]
>
Yes, this example and the sentence:
[[
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, but only in the absence of USING or
USING NAMED clauses.
]]
>
> 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.
>
OK, this makes sense. It'd be good to publish an erratum regarding this.
Thanks for the clarification,
Pavel
>
> 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 17:26:36 UTC