Thanks Ivan that looks really helpful if somewhat tacky Most of the time I expect the triples that wants deleting will have been very recently retrieved from Virtuoso itself so it's likely I can modify my code to keep the original nodeID IRIs around and use those to look up the internal Ids. In fact this may not require much modification since I believe I just take the nodeID IRIs and use the portion after the // as the blank node identifier for generated blank nodes anyway.
I'll do some experiments and report back. Thanks, Rob On 6/1/12 2:28 PM, "Ivan Mikhailov" <[email protected]> wrote: >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 >
