- From: Steve Harris <steve.harris@garlik.com>
- Date: Wed, 2 Dec 2009 11:32:00 +0000
- To: Paul Gearon <gearon@ieee.org>
- Cc: SPARQL Working Group <public-rdf-dawg@w3.org>
On 1 Dec 2009, at 21:06, Paul Gearon wrote: > The main question on updates seems to be around referring to multiple > graphs, so these operations are based on that idea. I'll be using some > common prefixes (foaf:, contact:), so I hope no one minds if I don't > define them. > > I can't recall if I'm supposed to be writing according to a specific > syntax, so I'll offer a couple of variations. > > The first case has one source for pattern matching, and one > destination for insertion. > This example copies the contents of one graph into another. > > (1) The original form would be: > > INSERT INTO <destination> { ?s ?p ?o } > WHERE { GRAPH <source> { ?s ?p ?o } } > > (2) With the recent changes: > > WITH <source> > INSERT INTO <destination> { ?s ?p ?o } > WHERE { ?s ?p ?o } > > > (3) Or using GRAPH instead of INTO: > > WITH <source> > INSERT { GRAPH <destination> { ?s ?p ?o } } > WHERE { ?s ?p ?o } So, in this case wouldn't INSERT ... FROM be a perfectly reasonable thing to write? It would have the same meaning as in SELECT, wouldn't it? > (4) Then dropping WITH: > > INSERT { GRAPH <destination> { ?s ?p ?o } } > WHERE { GRAPH <source> { ?s ?p ?o } } > > (The last would be valid even if WITH is adopted) > > > === > > This example has 2 sources for pattern matching and 1 destination > for insertion. > > To create entries for people in a new graph if they live in London and > have an email address stored in a separate graph: > > (1) > INSERT INTO <people_graph> { ?person a foaf:Person } > WHERE { > GRAPH <address_graph> { > ?person contact:home [ contact:city "London" ] > } . GRAPH <mail_graph> { > ?person foaf:mbox ?mail > } > } > > (2) > WITH <address_graph> > INSERT INTO <people_graph> { ?person a foaf:Person } > WHERE { > ?person contact:home [ contact:city "London" ] . > GRAPH <mail_graph> { ?person foaf:mbox ?mail } > } > > (3) > WITH <address_graph> > INSERT { GRAPH <people_graph> { ?person a foaf:Person } } > WHERE { > ?person contact:home [ contact:city "London" ] . > GRAPH <mail_graph> { ?person foaf:mbox ?mail } > } > > (4) > INSERT { GRAPH <people_graph> { ?person a foaf:Person } } > WHERE { > GRAPH <address_graph> { > ?person contact:home [ contact:city "London" ] > } . GRAPH <mail_graph> { > ?person foaf:mbox ?mail > } > } > > === > > This example has multiple sources for pattern matching, multiple > sources for deletion, and a single destination for insertion. > > To delete email addresses from graphs a, b, and c, and insert them > into a graph called email_graph: > > (1) can't be done in one step > > (2) > # WITH is being used on the destination, but could be applied > elsewhere > WITH <email_graph> > DELETE FROM <a> { ?person foaf:mbox ?email }; > DELETE FROM <b> { ?person foaf:mbox ?email }; > DELETE FROM <c> { ?person foaf:mbox ?email }; > INSERT { ?person foaf:mbox ?email } > WHERE { > GRAPH <a> {?person foaf:mbox ?email} > UNION GRAPH <b> {?person foaf:mbox ?email} > UNION GRAPH <c> {?person foaf:mbox ?email} > } > > (looks like a good case for FROM NAMED) > > (3) > WITH <email_graph> > DELETE { GRAPH <a> { ?person foaf:mbox ?email } }; > DELETE { GRAPH <b> { ?person foaf:mbox ?email } }; > DELETE { GRAPH <c> { ?person foaf:mbox ?email } }; > INSERT { ?person foaf:mbox ?email } > WHERE { > GRAPH <a> {?person foaf:mbox ?email} > UNION GRAPH <b> {?person foaf:mbox ?email} > UNION GRAPH <c> {?person foaf:mbox ?email} > } Wouldn't DELETE { GRAPH <a> { ?person foaf:mbox ?email } GRAPH <b> { ?person foaf:mbox ?email } GRAPH <c> { ?person foaf:mbox ?email } } INSERT { ?person foaf:mbox ?email } WHERE { GRAPH <a> {?person foaf:mbox ?email} UNION GRAPH <b> {?person foaf:mbox ?email} UNION GRAPH <c> {?person foaf:mbox ?email} } do the job? > (4) > DELETE { GRAPH <a> { ?person foaf:mbox ?email } }; > DELETE { GRAPH <b> { ?person foaf:mbox ?email } }; > DELETE { GRAPH <c> { ?person foaf:mbox ?email } }; > INSERT { GRAPH <email_graph> {?person foaf:mbox ?email } } > WHERE { > GRAPH <a> {?person foaf:mbox ?email} > UNION GRAPH <b> {?person foaf:mbox ?email} > UNION GRAPH <c> {?person foaf:mbox ?email} > } > > > Alternatively, instead of the union it could be something like: > DELETE { GRAPH <?g> { ?person foaf:mbox ?email } }; > INSERT { GRAPH <email_graph> {?person foaf:mbox ?email } } > WHERE { > GRAPH <?g> {?person foaf:mbox ?email} . > FILTER (?g == <a> || ?g == <b> || ?g == <c>) > } s/<?g>/?g/ > This example has a single source for pattern matching, and multiple > destinations for insertion: > > (1) not possible > > (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 } > } Surely variable bindings don't span the ; ? > (Have we decided what happens with an unbound value? That entry gets > skipped? I'm guessing so, but I don't recall it being addressed) That's what happens in CONSTRUCT, so it seems logical. > (3) > WITH <people_graph> > INSERT { GRAPH <email_graph> {?person foaf:mbox ?email } }; > INSERT { GRAPH <name_graph> {?person foaf:name ?name } } > WHERE { > ?person a foaf:Person > OPTIONAL { ?person foaf:mbox ?email } > OPTIONAL { ?person foaf:name ?name } > } > > (4) > INSERT { GRAPH <email_graph> {?person foaf:mbox ?email } }; > INSERT { GRAPH <name_graph> {?person foaf:name ?name } } > WHERE { > GRAPH <people_graph> { > ?person a foaf:Person > OPTIONAL { ?person foaf:mbox ?email } > OPTIONAL { ?person foaf:name ?name } > } > } Again the ; here is confusing. It seems like you only need one INSERT block if you have the GRAPH syntax. - Steve -- Steve Harris, CTO, Garlik Limited 2 Sheen Road, Richmond, TW9 1AE, UK +44(0)20 8973 2465 http://www.garlik.com/ Registered in England and Wales 535 7233 VAT # 849 0517 11 Registered office: Thames House, Portsmouth Road, Esher, Surrey, KT10 9AD
Received on Wednesday, 2 December 2009 11:32:38 UTC