Hello Rob, Two ways to refer to a particular blank node are to refer to it via some properties or to convert it to it's internal "serial number", a long integer, and back.
--- Start from scratch. sparql clear graph <http://sample/> Done. -- 4 msec. --- Insert three blank nodes with two related triples each. sparql insert in graph <http://sample/> { [] <p> <o1a> , <o1b> . [] <p> <o2a> , <o2b> . [] <p> <o3a> , <o3b> } Done. -- 15 msec. --- Delete one pair of triples. sparql with <http://sample/> delete { ?s ?p ?o } where { ?s ?p ?o ; <p> <o1a> } Done. -- 7 msec. --- Ensure that we still have two bnodes, two triple per bnode. sparql select * from <http://sample/> where { ?s ?p ?o } s p o VARCHAR VARCHAR VARCHAR ________________ nodeID://b10006 p o3a nodeID://b10006 p o3b nodeID://b10007 p o2a nodeID://b10007 p o2b 4 Rows. -- 4 msec. --- Each bnode (as well as any "named" node) is identified internally as an integer sparql select (<LONG::bif:iri_id_num>(?s)) as ?s_num, ?p, ?o from <http://sample/> where { ?s ?p ?o }; s_num p o INTEGER VARCHAR VARCHAR _____________________________ 4611686018427397910 p o3a 4611686018427397910 p o3b 4611686018427397911 p o2a 4611686018427397911 p o2b 4 Rows. -- 5 msec. --- The integer can be converted back to internal identifier. Say, here we try to delete a triple that does not exist (even if the ID integer is valid) sparql delete from <http://sample/> { `bif:iri_id_from_num(4611686018427397911)` <p> <o3a> }; Done. -- 5 msec. --- No effect, because 46..11 has <o2a> and <o2b>, not requested <o3a> sparql select * from <http://sample/> where { ?s ?p ?o }; s p o VARCHAR VARCHAR VARCHAR ________________ nodeID://b10006 p o3a nodeID://b10006 p o3b nodeID://b10007 p o2a nodeID://b10007 p o2b 4 Rows. -- 5 msec. --- Now let's try to delete a triple that does actually exist. Note the use of backquotes to insert an expression into template. sparql delete from <http://sample/> { `bif:iri_id_from_num(4611686018427397911)` <p> <o2a> }; Done. -- 4 msec. --- So there's an effect sparql select * from <http://sample/> where { ?s ?p ?o }; s p o VARCHAR VARCHAR VARCHAR _________________ nodeID://b10006 p o3a nodeID://b10006 p o3b nodeID://b10007 p o2b 3 Rows. -- 2 msec. --- Now delete everything related to nodeID://b10006 subject. sparql with <http://sample/> delete { ?s ?p ?o } where { ?s ?p ?o . filter (?s = bif:iri_id_from_num(4611686018427397910)) }; Done. -- 18 msec. --- Three minus two gives one triple remaining. SQL> sparql select * from <http://sample/> where { ?s ?p ?o }; s p o VARCHAR VARCHAR VARCHAR _________________ nodeID://b10007 p o2b 1 Rows. -- 4 msec. IDs of bnodes will vary from server to server and even from run to run in same server, so the application should identify bnodes by properties before doing bif:iri_id_XXX tricks. Best Regards, Ivan Mikhailov OpenLink Software http://virtuoso.openlinksw.com
