- 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