R2RML is a language for expressing customized mappings from relational databases to RDF data sets. Such mappings provide the ability to view existing relational data in the RDF data model, expressed in a structure and target vocabulary of the mapping author's choice.
R2RML mappings are themselves RDF graphs written in Turtle syntax.
As a W3C working draft, R2RML is becoming the generic standard adopted by most vendors of tools mapping relational data to RDF, enabling the interoperability of R2RML scripts, whether created with such tools or by hand.
Virtuoso has its own previously-developed proprietary equivalent of R2RML called Linked Data Views, which uses Virtuoso's Meta Schema Mapping Language to map relational data to RDF.
R2RML support is achieved by the inclusion of a simple translator which basically translates R2RML syntax to Virtuoso's own Linked Data Views syntax, which can then be executed to create the Linked Data Views themselves.
First you will need to ensure you have the R2RML VAD package (rdb2rdf_dav.vad) installed.
Then, the easiest way to test functionality is by executing the attached basic.sql
script via the command line isql
tool:
basic.sql
into <VIRTUOSO_INSTALL>/bin/
.
cd <OPENLINK_INSTALL>/bin ./isql (Unix) isql.exe (Windows) OpenLink Interactive SQL (Virtuoso), version 0.9849b. Type HELP; for help and EXIT; to exit. SQL>
SQL> load basic.sql;
s p o VARCHAR VARCHAR VARCHAR ________________________________________________________________________________________________________________ http://example.com/product/1 http://example.com/product#id 1 http://example.com/product/1 http://example.com/product#name Virtuoso http://example.com/product/1 http://www.w3.org/1999/02/22-rdf-syntax-ns#type http://example.com/ns#product 3 Rows. -- 0 msec.
basic.sql
will return an error since the test table will already exist.
However, the remainder of the script will execute fine.
CREATE TABLE "R2RML"."TEST"."PRODUCT" ( id INTEGER PRIMARY KEY , name VARCHAR(100) ); INSERT SOFT "R2RML"."TEST"."PRODUCT" VALUES ( 1, 'Virtuoso' );
SPARQL CLEAR GRAPH <http://temp/product> ; SPARQL CLEAR GRAPH <http://example.com/> ;
DB.DBA.TTLP()
procedure to insert the R2RML into a temporary graph, <http://temp/product>
:
DB.DBA.TTLP ( ' @prefix rr: <http://www.w3.org/ns/r2rml#> . @prefix exa: <http://example.com/ns#> . @prefix product: <http://example.com/product#> . <http://example.com/ns#TriplesMap1> a rr:TriplesMap ; rr:logicalTable [ rr:tableSchema "R2RML" ; rr:tableOwner "TEST" ; rr:tableName "PRODUCT" ]; rr:subjectMap [ rr:template "http://example.com/product/{id}" ; rr:class exa:product ; rr:graph <http://example.com/> ]; rr:predicateObjectMap [ rr:predicate product:id ; rr:objectMap [ rr:column "id" ]; ]; rr:predicateObjectMap [ rr:predicate product:name ; rr:objectMap [ rr:column "name" ]; ]; . ', 'http://temp/product', 'http://temp/product' );
--SELECT DB.DBA.R2RML_TEST ('http://temp/product'); --DB.DBA.OVL_VALIDATE ('http://temp/product', 'http://www.w3.org/ns/r2rml#OVL'); -- Running the validation in order to find error in name of R2RML description graph --DB.DBA.OVL_VALIDATE ('http://temp/product-nosuch', 'http://www.w3.org/ns/r2rml#OVL'); -- Running the validation in order to find error in name of R2RML metadata graph --DB.DBA.OVL_VALIDATE ('http://temp/product', 'http://www.w3.org/ns/r2rml#OVL-nosuch'); --SELECT DB.DBA.R2RML_EXECUTE ('http://temp/product');
DB.DBA.R2RML_MAKE_QM_FROM_G()
is used to perform the conversion from R2RML into Virtuoso's own Linked Data Views script.
The output is then prepended with the keyword 'SPARQL
' and a space, and executed using exec()
:
EXEC ('SPARQL ' || DB.DBA.R2RML_MAKE_QM_FROM_G ('http://temp/product'));
<http://example.com/>
) DB.DBA.R2RML_MAKE_QM_FROM_G()
:
DB.DBA.R2RML_MAKE_QM_FROM_G ( ( IN g VARCHAR [, IN target_graph VARCHAR := NULL] ) )
SPARQL SELECT * FROM <http://example.com/> WHERE {?s ?p ?o .};