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
>





Reply via email to