Universidade Federal do Rio de Janeiro (UFRJ)
Departamento de Ciência da Computação (DCC)
Tópicos Especiais em Banco de Dados I
Profas. Maria Luiza Campos e Giseli Lopes
RDB2RDF
Profa. Giseli Rabello Lopes
2016 / 2
Sumário
• RDB2RDF
• Direct Mapping
• R2RML
• D2RQ
• Referências
Desenvolvimento Web clássico
[Auer et al., 2014]
• Acesso comparXlhado aos dados
• Expõe dados em páginas web para consumo
humano
Triplificação por Materialização
[Auer et al., 2014]
• Acesso direto aos dados, usuários podem criar suas próprias consultas
• Linked Data permite que outras aplicações consumam os dados
• NegaXvo: precisa de outro servidor com índices / consumo de
memória
Triplificação por reescrita SPARQL-‐to-‐
SQL [Auer et al., 2014]
• Todos os beneccios anteriores além de:
– Redução da sobrecarga de implantação, baixo consumo de memória
– Dados sempre atualizados
Mapeamento para Triplificação
[Auer et al., 2014]
• Funciona para ambos: Materialização e
Reescritas SPARQL-‐to-‐SQL (grafos virtuais)
• A seguir:
– Direct Mapping (Mapeamento Direto)
– R2RML (Linguagem de Mapeamento)
Mapeamento Direto (Direct Mapping)
[Arenas et al., 2012]
• Define uma transformação simples
• Provê uma base para definição e comparação
de transformações mais complexas
Exemplo -‐ DB
CREATE TABLE Addresses (
ID INT, PRIMARY KEY(ID), city CHAR(10),
state CHAR(2) );
CREATE TABLE People (
ID INT, PRIMARY KEY(ID), fname CHAR(10),
addr INT,
FOREIGN KEY(addr) REFERENCES Addresses(ID) );
INSERT INTO Addresses (ID, city, state) VALUES (18, 'Cambridge', 'MA');
INSERT INTO People (ID, fname, addr) VALUES (7, 'Bob', 18);
INSERT INTO People (ID, fname, addr) VALUES (8, 'Sue', NULL);
Exemplo -‐ Direct Mapping
@base <http://foo.example/DB/> .
@prefix xsd: <http://www.w3.org/2001/XMLSchema#> .
<People/ID=7> rdf:type <People> .
<People/ID=7> <People#ID> 7 .
<People/ID=7> <People#fname> "Bob" .
<People/ID=7> <People#addr> 18 .
<People/ID=7> <People#ref-addr> <Addresses/ID=18> .
<People/ID=8> rdf:type <People> .
<People/ID=8> <People#ID> 8 .
<People/ID=8> <People#fname> "Sue" .
<Addresses/ID=18> rdf:type <Addresses> .
<Addresses/ID=18> <Addresses#ID> 18 .
<Addresses/ID=18> <Addresses#city> "Cambridge" .
<Addresses/ID=18> <Addresses#state> "MA" .
Exemplo -‐ DB2
CREATE TABLE Addresses ( ID INT,
city CHAR(10), state CHAR(2),
PRIMARY KEY(city,state) );
CREATE TABLE People (
ID INT, PRIMARY KEY(ID), fname CHAR(10),
addrCity CHAR(10), addrState CHAR(2),
FOREIGN KEY(addrCity,addrState) REFERENCES Addresses(city,state) );
INSERT INTO Addresses (ID, city, state) VALUES (18, 'Cambridge', 'MA');
INSERT INTO People (ID, fname, addrCity, addrState) VALUES (7, 'Bob', 'Cambridge', 'MA');
INSERT INTO People (ID, fname, addrCity, addrState) VALUES (8, 'Sue', NULL, NULL);
Exemplo -‐ Chaves primárias compostas
• Se, no exemplo anterior, a chave-‐primária para Adresses fosse (city, state) ao invés de ID, o idenXficador para cada linha na tabela deveria ser <Adresses/
city=Cambridge;state=MA>. As triplas envolvendo
<Adresses/ID=18> deveriam ser subsXtuídas pelas seguintes triplas:
<People/ID=7> <People#ref-addrCity;addrState> <Adresses/
city=Cambridge;state=MA>.
<Adresses/city=Cambridge;state=MA> rdf:type <Addresses> .
<Adresses/city=Cambridge;state=MA> <Addresses#ID> 18 .
<Adresses/city=Cambridge;state=MA> <Addresses#city>
"Cambridge" .
<Adresses/city=Cambridge;state=MA> <Addresses#state> "MA" .
R2RML [Auer et al., 2014]
• R2RML é a linguagem de mapeamento RDB to RDF mais proeminente
– Mapeamentos customizados para converter RDB em RDF
– Recomendação da W3C desde setembro de 2012
– Serialização Turtle
Uma visão geral de R2RML
[Das et al., 2012]
Conceitos básicos de R2RML
[Auer et al., 2014]
• Term Map cria termos RDF (IRIs, literais e blank nodes)
– De um template, ou – De uma coluna, ou
– De uma expressão constante
• Triples Map cria triplas
– Das linhas de uma tabela ou visão, – Usando Term Maps
• Referencing Object Map modela relações entre Triples
Maps
Exemplo -‐ BD Relacional
[Das et al., 2012]
Exemplo -‐ DB3
CREATE TABLE DEPT (
DEPTNO INTEGER PRIMARY KEY, DNAME VARCHAR(30),
LOC VARCHAR(100) );
CREATE TABLE EMP (
EMPNO INTEGER PRIMARY KEY, ENAME VARCHAR(100),
JOB VARCHAR(20),
DEPTNO INTEGER REFERENCES DEPT (DEPTNO) );
INSERT INTO DEPT VALUES (10,'APPSERVER','NEW YORK');
INSERT INTO EMP VALUES (7369,'SMITH','CLERK',10);
Exemplo -‐ Saída desejada
[Das et al., 2012]
<http://data.example.com/employee/7369> rdf:type ex:Employee.
<http://data.example.com/employee/7369> ex:name "SMITH".
<http://data.example.com/employee/7369> ex:department <http://
data.example.com/department/10>.
<http://data.example.com/department/10> rdf:type ex:Department.
<http://data.example.com/department/10> ex:name "APPSERVER".
<http://data.example.com/department/10> ex:location "NEW YORK".
<http://data.example.com/department/10> ex:staff 1.
Exemplo -‐ Mapeamento R2RML da tabela EMP [Das et al., 2012]
@prefix rr: <http://www.w3.org/ns/r2rml#>.
@prefix ex: <http://example.com/ns#>.
<#TriplesMap1>
rr:logicalTable [ rr:tableName "EMP" ];
rr:subjectMap [
rr:template "http://data.example.com/employee/{EMPNO}";
rr:class ex:Employee;
];
rr:predicateObjectMap [ rr:predicate ex:name;
rr:objectMap [ rr:column "ENAME" ];
].
<http://data.example.com/employee/7369> rdf:type ex:Employee.
<http://data.example.com/employee/7369> ex:name "SMITH".
Exemplo -‐ Computando propriedade com uma visão R2RML [Das et al., 2012]
<#DeptTableView> rr:sqlQuery """
SELECT DEPTNO, DNAME, LOC,
(SELECT COUNT(*) FROM EMP WHERE EMP.DEPTNO=DEPT.DEPTNO) AS STAFF
FROM DEPT;
""".
Exemplo -‐ Mapeando as triplas da visão [Das et al., 2012]
<#TriplesMap2>
rr:logicalTable <#DeptTableView>;
rr:subjectMap [
rr:template "http://data.example.com/department/{DEPTNO}";
rr:class ex:Department;
];
rr:predicateObjectMap [ rr:predicate ex:name;
rr:objectMap [ rr:column "DNAME" ];
];
rr:predicateObjectMap [
rr:predicate ex:location;
rr:objectMap [ rr:column "LOC" ];
];
rr:predicateObjectMap [ rr:predicate ex:staff;
rr:objectMap [ rr:column "STAFF" ];
].
Exemplo -‐ Mapeando as triplas da visão [Das et al., 2012]
<http://data.example.com/department/10> rdf:type ex:Department.
<http://data.example.com/department/10> ex:name "APPSERVER".
<http://data.example.com/department/10> ex:location "NEW YORK".
<http://data.example.com/department/10> ex:staff 1.
Exemplo -‐ Relacionamento entre duas tabelas (EMP e DEPTO) [Das et al., 2012]
<#TriplesMap1>
rr:predicateObjectMap [
rr:predicate ex:department;
rr:objectMap [
rr:parentTriplesMap <#TriplesMap2>;
rr:joinCondition [
rr:child "DEPTNO";
rr:parent "DEPTNO";
];
];
].
<http://data.example.com/employee/7369> ex:department
<http://data.example.com/department/10>.
Exemplo – DB3 completo
@prefix ex: <http://example.com/ns#> .
<http://data.example.com/department/10>
a ex:Department ; ex:location "NEW YORK" ; ex:name "APPSERVER" ;
ex:staff 1 .
<http://data.example.com/employee/7369>
a ex:Employee ;
ex:department <http://data.example.com/
department/10> ;
ex:name "SMITH" .
Exemplo -‐ Relacionamento Muitos
para Muitos [Das et al., 2012]
Exemplo -‐ Saída desejada
[Das et al., 2012]
<http://data.example.com/employee=7369/department=10>
ex:employee <http://data.example.com/employee/7369> ; ex:department <http://data.example.com/department/10> .
<http://data.example.com/employee=7369/department=20>
ex:employee <http://data.example.com/employee/7369> ; ex:department <http://data.example.com/department/20> .
<http://data.example.com/employee=7400/department=10>
ex:employee <http://data.example.com/employee/7400> ; ex:department <http://data.example.com/department/10> .
Exemplo -‐ Mapeamento R2RML
[Das et al., 2012]
<#TriplesMap3>
rr:logicalTable [ rr:tableName "EMP2DEPT" ];
rr:subjectMap [ rr:template "http://data.example.com/
employee={EMPNO}/department={DEPTNO}" ];
rr:predicateObjectMap [
rr:predicate ex:employee;
rr:objectMap [ rr:template "http://
data.example.com/employee/{EMPNO}" ];
];
rr:predicateObjectMap [
rr:predicate ex:department;
rr:objectMap [ rr:template "http://
data.example.com/department/{DEPTNO}" ];
].
Exemplo -‐ Outra saída desejada
[Das et al., 2012]
<http://data.example.com/employee/7369>
ex:department <http://data.example.com/department/10> ; ex:department <http://data.example.com/department/20> .
<http://data.example.com/employee/7400>
ex:department <http://data.example.com/department/10>.
Exemplo -‐ Outro mapeamento R2RML
[Das et al., 2012]
<#TriplesMap3>
rr:logicalTable [ rr:tableName "EMP2DEPT" ];
rr:subjectMap [
rr:template "http://data.example.com/employee/{EMPNO}";
];
rr:predicateObjectMap [
rr:predicate ex:department;
rr:objectMap [ rr:template "http://data.example.com/
department/{DEPTNO}" ];
].
Plataforma D2RQ
• Sistema para acessar bancos de dados
relacionais como grafos RDF apenas-‐leitura virtuais
• Oferece acesso baseado em RDF ao conteúdo
de bancos de dados relacionais sem ter que
replicá-‐los em um armazenamento RDF
Plataforma D2RQ
• Usando D2RQ pode-‐se:
– Consultar um banco de dados não RDF usando SPARQL
– Acessar o conteúdo de bancos de dados como Linked Data na Web
– Criar dumps customizados do banco de dados em formatos RDF para carregar em um
armazenamento RDF
D2RQ
• Bancos de dados suportados:
– Oracle – MySQL
– PostgreSQL – SQL Server – HSQLDB
– Interbase/Firebird
Plataforma D2RQ
• Principais componentes:
– D2RQ Mapping Language, um linguagem de
mapeamento declaraXva para descrever a relação
entre uma ontologia e um modelo de dados relacional – D2RQ Engine, um plug-‐in para o Jena Seman9c Web
toolkit, que usa os mapeamentos para reescrever
chamadas da API Jena para consultas SQL no banco de dados e passa os resultados da consulta até as
camadas superiores dos frameworks
– D2R Server, um servidor HTTP que provê uma visão
Linked Data, uma visão HTML para debugging e um
SPARQL endpoint do banco de dados
Plataforma D2RQ -‐ Visão Geral
D2RQ
• Disponível em: hnp://d2rq.org
• Versão que permite usar R2RML no mapeamento
– hnp://download.d2rq.org/d2rq-‐r2rml-‐preview-‐
v4.tar.gz
D2RQ – generate-‐mapping
• generate-mapping --r2rml -o $generated-
mapping$ -d $driver-class-name$ -u $db-user$
-p $db-password$ $jdbc:url-to-database$
– Parâmetros:
• --r2rml
Gera um arquivo de mapeamento compapvel com o W3C R2RML
• -o $generated-mapping$
O nome do arquivo de mapeamento a ser gerado
• -d $driver-class-name$
O nome completo da classe Java do driver do BD
• -u $db-user$
O login do usuário do BD
• -p $db-password$
A senha do usuário do BD
• $jdbc:url-to-database$
URL de conexão JDBC para o BD
D2RQ – generate-‐mapping
• ./generate-mapping --r2rml -o DB2_mapping.ttl -d
com.mysql.jdbc.Driver -u root
jdbc:mysql://localhost/DB2
Exemplo – DB_mapping.ttl
@prefix map: <#>.
@prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>.
@prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#>.
@prefix rr: <http://www.w3.org/ns/r2rml#>.
@prefix vocab: <vocab/>.
@prefix xsd: <http://www.w3.org/2001/XMLSchema#>.
Exemplo – DB_mapping.ttl
map:People
rr:logicalTable [ rr:tableName "`DB2`.`People`"; ];
rr:subjectMap [ rr:class vocab:People; rr:template "People/{`ID`}"; ];
rr:predicateObjectMap [
rr:predicate vocab:People_ID;
rr:objectMap [ rr:column "`ID`"; ];
];
rr:predicateObjectMap [
rr:predicate rdfs:label;
rr:objectMap [ rr:termType rr:Literal; rr:template "People #{`ID`}"; ];
];
rr:predicateObjectMap [
rr:predicate vocab:People_addrCity_addrState;
rr:objectMap [
rr:parentTriplesMap map:Addresses;
rr:joinCondition [ rr:child "`addrCity`"; rr:parent "`city`"; ];
rr:joinCondition [ rr:child "`addrState`"; rr:parent "`state`"; ];
];
];
rr:predicateObjectMap [
rr:predicate vocab:People_fname;
rr:objectMap [ rr:column "`fname`"; ];
];
.
Exemplo – DB_mapping.ttl
map:Addresses
rr:logicalTable [ rr:tableName "`DB2`.`Addresses`"; ];
rr:subjectMap [ rr:class vocab:Addresses; rr:template "Addresses/
{`city`}/{`state`}"; ];
rr:predicateObjectMap [
rr:predicate vocab:Addresses_ID;
rr:objectMap [ rr:column "`ID`"; ];
];
rr:predicateObjectMap [
rr:predicate rdfs:label;
rr:objectMap [ rr:termType rr:Literal; rr:template "Addresses
#{`city`}/{`state`}"; ];
];
rr:predicateObjectMap [
rr:predicate vocab:Addresses_state;
rr:objectMap [ rr:column "`state`"; ];
];
rr:predicateObjectMap [
rr:predicate vocab:Addresses_city;
rr:objectMap [ rr:column "`city`"; ];
];
.
D2RQ – dump-‐rdf
• Gera um dump do conteúdo da base de dados em um único arquivo RDF, usando (ou não) um arquivo de mapeamento
dump-rdf -u $db-user$ -p $db-password$ -f
$rdf-format$ -o $generated-rdf-dump$ -j
$jdbc:url-to-database$ $generated-mapping$
– Parâmetros similares aos anteriores e os seguintes adicionais:
• -f $rdf-format$
O formato do RDF dump. Suportados: TURTLE, RDF/XML, RDF/
XML-‐ABBREV, N3, e N-‐TRIPLE (default).
• -o $generated-rdf-dump$
Nome do arquivo RDF dump a ser gerado
D2RQ – dump-‐rdf
• ./dump-rdf -u root -f TURTLE -o DB2_dump.ttl -j jdbc:mysql:///
DB2 DB2_mapping.ttl
Exemplo – DB2_dump.ttl
@prefix xsd: <http://www.w3.org/2001/XMLSchema#> .
@prefix vocab: <file:///Users/giseli/Downloads/d2rq-dev/vocab/> .
@prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> .
@prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .
@prefix map: <file:///Users/giseli/Downloads/d2rq-dev/DB2_dump.ttl#> .
<file:///Users/giseli/Downloads/d2rq-dev/DB2_dump.ttl#Addresses/Cambridge/MA>
a vocab:Addresses ;
rdfs:label "Addresses #Cambridge/MA" ; vocab:Addresses_ID 18 ;
vocab:Addresses_city "Cambridge" ; vocab:Addresses_state "MA" .
<file:///Users/giseli/Downloads/d2rq-dev/DB2_dump.ttl#People/8>
a vocab:People ; rdfs:label "People #8" ; vocab:People_ID 8 ;
vocab:People_fname "Sue" .
<file:///Users/giseli/Downloads/d2rq-dev/DB2_dump.ttl#People/7>
a vocab:People ; rdfs:label "People #7" ; vocab:People_ID 7 ;
vocab:People_addrCity_addrState
<file:///Users/giseli/Downloads/d2rq-dev/DB2_dump.ttl#Addresses/Cambridge/MA> ; vocab:People_fname "Bob" .
Exemplo – d2r-‐server
• Usando mapeamento personalizado:
– ./d2r-server DB2_mapping.ttl
• Usando mapeamento direto:
– ./d2r-server -u root
jdbc:mysql:///DB2
Exemplo – d2r-‐server
• Após, em um
navegador (default):
– hnp://localhost:2020/
Referências
• Auer, S. et al. SemanXc Data Web lecture series.
Acesso em: hnp://slidewiki.org/deck/11936_semanXc-‐
data-‐web-‐lecture-‐series. 2014.
• Das, S., Sundara, S., Cyganiak, R. R2RML: RDB to RDF Mapping Language. W3C RecommendaXon 27
September 2012. Disponível em:
hnps://www.w3.org/TR/r2rml/.
• Arenas, M., Bertails, A., Prud’hommeaux, E., Sequeda, J. A Direct Mapping of RelaXonal Data to RDF. W3C RecommendaXon 27 September 2012. Disponível em:
hnp://www.w3.org/TR/rdb-‐direct-‐mapping/.
Universidade Federal do Rio de Janeiro (UFRJ)
Departamento de Ciência da Computação (DCC)
Tópicos Especiais em Banco de Dados I
Dúvidas?
Profa. Giseli Rabello Lopes
giseli@dcc.ufrj.br
CCMN -‐ DCC -‐ Sala E-‐2012
?