SPARQL with SQL (Inline)
Virtuoso extends its SQL3 implementation with syntax for
integrating SPARQL into queries and subqueries.Thus, as part of a
SQL SELECT query or subquery, one can write the SPARQL keyword and
a SPARQL query as part of query text processed by Virtuoso's SQL
Query Processor.
Example 1 (basic) :
Using Virtuoso's Command line or the Web Based ISQL utility type
in the following (note: "SQL>" is the command line prompt for
the native ISQL utility):
SQL> sparql select distinct ?p where { graph ?g { ?s ?p ?o } };
Which will return the following:
p varchar
----------
http://example.org/ns#b
http://example.org/ns#d
http://xmlns.com/foaf/0.1/name
http://xmlns.com/foaf/0.1/mbox
...
Example 2 (a subquery variation):
SQL> select distinct subseq (p, strchr (p, '#')) as fragment
from (sparql select distinct ?p where { graph ?g { ?s ?p ?o } } ) as all_predicates
where p like '%#%' ;
fragment varchar
----------
#query
#data
#name
#comment
...
Parameterized Queries:
You can pass parameters to a SPARQL query using a
Virtuoso-specific syntax extension. '??' or '$?' indicates a
positional parameter similar to '?' in standard SQL. '??' can be
used in graph patterns or anywhere else where a SPARQL variable is
accepted. The value of a parameter should be passed in SQL form,
i.e. this should be a number or an untyped string. An IRI ID can
not be passed, but an absolute IRI can. Using this notation, a
dynamic SQL capable client (ODBC, JDBC, ADO.NET, OLEDB, XMLA, or
others) can execute parametrized SPARQL queries using parameter
binding concepts that are common place in dynamic SQL. Which
implies that existing SQL applications and development environments
(PHP, Ruby, Python, Perl, VB, C#, Java, etc.) are capable of
issuing SPARQL queries via their existing SQL bound data access
channels against RDF Data stored in Virtuoso.
Note: This is the Virtuoso equivalent of a
recently published example using Jena (a Java based RDF Triple
Store).
Example:
Create a Virtuoso Function by execting the following:
SQL> create function param_passing_demo ();
{
declare stat, msg varchar;
declare mdata, rset any;
exec ('sparql select ?s where { graph ?g { ?s ?? ?? }}',
stat, msg,
vector ('http://www.w3.org/2001/sw/DataAccess/tests/data/Sorting/sort-0#int1',
4 ), -- Vector of two parameters
10, -- Max. result-set rows
mdata, -- Variable for handling result-set metadata
rset -- Variable for handling query result-set
);
return rset[0][0];
}
Test new "param_passing_demo" function by executing the
following:
SQL> select param_passing_demo ();
Which returns:
callret VARCHAR
_______________________________________________________________________________
http://www.w3.org/2001/sw/DataAccess/tests/data/Sorting/sort-0#four
1 Rows. -- 00000 msec.
Using SPARQL in SQL Predicates:
A SPARQL ASK query can be used as an argument of the SQL EXISTS
predicate.
create function sparql_ask_demo () returns varchar
{
if (exists (sparql ask where { graph ?g { ?s ?p 4}})) return 'YES';
else return 'NO';
};
Test by executing:
SQL> select sparql_ask_demo ();
Which returns:
_________________________
YES