%VOSWARNING%
%META:TOPICPARENT{name="VOSSPARQL"}%
---++SPARUL
SPARUL is an Update Language For RDF Graphs.
Since version 5.0, Virtuoso has supported the [[http://jena.hpl.hp.com/~afs/SPARQL-Update.html][SPARQL/Update]] (SPARUL) extension of SPARQL.
This is sufficient for most routine data manipulation operations.
If SPARQL_UPDATE role is granted to SPARQL user, then data manipulation statements may be executed via the SPARQL Web service endpoint; if SPARQL_UPDATE role is not granted, users are limited to data querying statements.
---+++ Related Functions
Two functions allow the user to alter RDF storage by inserting or deleting all triples listed in some vector.
Both functions receive an IRI of a graph that should be altered and a vector of triples that should be added or removed. The graph IRI can be either IRI ID or a string.
The return values of these functions are not defined and should not be used by applications.
create function DB.DBA.RDF_INSERT_TRIPLES (in graph_iri any, in triples any);
create function DB.DBA.RDF_DELETE_TRIPLES (in graph_iri any, in triples any);
Simple operations may be faster if written as low-level SQL code instead of using SPARUL.
For instance, the use of SPARQL DELETE is redundant when the application can delete from RDF_QUAD by using simple filters like:
delete from DB.DBA.RDF_QUAD
where G = DB.DBA.RDF_MAKE_IID_OF_QNAME (
'http://local.virt/DAV/sparql_demo/data/data-xml/source-simple2/source-data-01.rdf' );
On the other hand, simple filters do not work when search criteria refer to triples that are affected by the modification.
Consider a function that deletes all triples whose subjects are nodes of type 'http://xmlns.com/foaf/0.1/Person'. Type information is stored in triples that will be deleted, so the simplest function is something like this:
create procedure DELETE_PERSONAL_DATA (in foaf_graph varchar)
{
declare pdata_dict, pdata_array any;
-- Step 1: select everything that should be deleted
pdata_dict := ((
sparql construct { ?s ?p ?o }
where { graph ?:foaf_graph {
?s ?p ?o . ?s rdf:type
} }
));
-- Step 2: delete all found triples
pdata_array := dict_list_keys (pdata_dict, 1);
RDF_DELETE_TRIPLES (foaf_graph, pdata_array);
};
DELETE_PERSONAL_DATA (
'http://local.virt/DAV/sparql_demo/data/data-xml/source-simple2/source-data-01.rdf' );
Since Virtuoso 5.0, applications may use SPARUL to do the same in a more convenient way:
create procedure DELETE_PERSONAL_DATA (in foaf_graph varchar)
{
sparql delete { ?s ?p ?o }
where { graph ?:foaf_graph {
?s ?p ?o . ?s rdf:type
} }
};
---++Virtuoso's SPARUL Implementation
---+++References
#SparqlSpecs
---++++Specs
* [[http://jena.hpl.hp.com/~afs/SPARQL-Update.html][SPARQL/UPDATE]]
* [[http://www.w3.org/TR/rdf-sparql-query/][SPARQL Query Language for RDF]]
* [[http://www.w3.org/TR/2005/WD-rdf-sparql-XMLres-20050527/][SPARQL Query Results XML Format]]
* [[http://www.w3.org/TR/rdf-sparql-protocol/][SPARQL Protocol for RDF]]
#SparqlFaqs
---++++FAQs
#SparqlPresentations
---++++Presentations
#SparqlTutorials
---++++Tutorials
CategoryGlossary CategorySPARQL CategoryRDF CategoryVOS CategoryDocumentation