- From: Paul Gearon <gearon@ieee.org>
- Date: Thu, 3 Dec 2009 14:26:36 -0500
- To: Andy Seaborne <andy.seaborne@talis.com>
- Cc: Steve Harris <steve.harris@garlik.com>, SPARQL Working Group <public-rdf-dawg@w3.org>
On Thu, Dec 3, 2009 at 2:06 PM, Andy Seaborne <andy.seaborne@talis.com> wrote: > > > Paul Gearon wrote: > > On 03/12/2009 16:38, Paul Gearon wrote to Steve: > >>>> >> I expected them to come out of the WHERE, so yes, they do. The only >>>> >> binding that occurs in the above example is in the WHERE clause. The >>>> >> INSERTs are just using an already bound set of variables. >>> > >>> > To me that seems very strange. >> I see where you are coming from, but recall that the ; characters are >> just there to separate the various INSERTs and DELETEs. They are all >> supposed to be part of the same command, and that command has a single >> WHERE clause. > > > > I don't recall that :-) My understanding is that ";" separates operations, > not directives. It was introduced because of the problems because WHERE is > optional. That may well be the case, which is why I'm asking people to look at it. > Andy Seaborne wrote: >>> What's the limit of what can be done in a single operation? >> My understanding was that there should not be a limit. > > I can understand all in /request/ as a desirable goal but not all in one > /operation/. Well, as I said, until yesterday I hadn't even considered that a request could contain more than one operation. > ---- One request, two operations > > # Move someone from one organisation to another > # 1/ Update the people database > # 2/ Move the details from the graph from one division to another > > WITH <people> > DELETE { ?x :organisation ?org } > INSERT { ?x :organisation <http://example/org/computerMaufacturing> } > WHERE > { ?x foaf:name "John Smith" ; > :organisation ?org > } > > WITH <computerDivision> > DELETE { ?x ?p ?o } > INSERT { GRAPH <servicesDivision> { ?x ?p ?o } } > WHERE { ?x foaf:name "John Smith" ; ?x ?p ?o } > > ---- > > Here, each is well delimited. But if the first were > > # No WITH, no WHERE. Abbreviated DELETE - implicit WHERE > DELETE { GRAPH <people> { ?x :organisation ?org } } > > and the second was written: > > DELETE { GRAPH <computerDivision> { ?x ?p ?o } > INSERT { GRAPH <servicesDivision> { ?x ?p ?o } } > WHERE > { GRAPH <computerDivision> > { ?x foaf:name "John Smith" ; ?x ?p ?o } > } > > then it is ambiguous as to what the WHERE applies to. But wasn't the ; separator supposed to identify where multiple DELETEs belonged to the same operation and where they were separate operations? Or do I have that completely backwards? People may have been talking about multiple operations the whole time and I didn't get it. All the same, now I'm considering separate operations in a single request, I'm thinking that ; would have been better as the operation separator. Anyway, as written, the WHERE is just supposed to apply the operation that it's a part of, so I didn't see any ambiguity. > See also: > >>>>> (2) >>>>> WITH <people_graph> >>>>> INSERT INTO <email_graph> {?person foaf:mbox ?email }; >>>>> INSERT INTO <name_graph> {?person foaf:name ?name } >>>>> WHERE { >>>>> ?person a foaf:Person >>>>> OPTIONAL { ?person foaf:mbox ?email } >>>>> OPTIONAL { ?person foaf:name ?name } >>>>> } > > > Why isn't that: > > WITH <people_graph> > INSERT INTO <email_graph> {?person foaf:mbox ?email } ; > > -- end operation -- > > INSERT INTO <name_graph> {?person foaf:name ?name } > WHERE { ... } > > Andy > Because I wrote it with the intention that ; was to indicate that both INSERTs were part of the same operation, meaning that the WHERE applied to both of them. Paul
Received on Thursday, 3 December 2009 19:27:09 UTC