Can I Delete Triples containing Blank Nodes?
There are two ways to delete a particular blank node:
- Refer to it indirectly, using some of its properties, or
- Discover and refer to it by its internal "serial number" or ID (in Virtuoso,
bif:iri_id_XXX
, a long integer). Important Note: IDs of bnodes will always vary from server to server, and often from run-to-run on the same server, so it is usually better to identify bnodes by properties than ID.
How to Delete Triples containing Blank Nodes
Assume the following sample scenario:
- Clear the graph:
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.
- Every node in the Virtuoso store, whether "named" or "blank" ("unnamed"), is identified internally by a long 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.
- Should have no effect, because the "46..11" IRI has <o2a> and <o2b>, and was 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 the graph template:
SPARQL DELETE FROM <http://sample/> { `bif:iri_id_from_num(4611686018427397911)` <p> <o2a> }; Done. -- 4 msec.
- This time, 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 we'll 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.
- This should delete two of the previous three triples, leaving one remaining triple:
SQL> SPARQL SELECT * FROM <http://sample/> WHERE { ?s ?p ?o }; s p o VARCHAR VARCHAR VARCHAR ___________________________________ nodeID://b10007 p o2b 1 Rows. -- 4 msec.
Related
- Virtuoso Tips and Tricks Collection
- Virtuoso Documentation
- Deleting triples from a graph
- Deleting triples from a "Large" graph