Publicação de Dados Governamentais no Padrão Linked Data 5.1 – Ferra m enta s pa ra public a ç ã o de da do s Karin Breitman José Viterbo Edgard Marx Percy Salas 1 LA C L a bo ra to ry fo r A dva nc e d C o lla bo ra tio n T riplify 2 R equerim ento s S o ftw a re • L ic enç a – GNU Lesser General Public License. • R equis ito s • W eb S erver – Apache (recomendado) – IIS • P H P (ready) , Ruby/Python (dev) • B a nc o de D a do s – M yS Q L, S Q Lite, O racle, D B2, M S S Q L P ostgreS QL 3 T riplify • O bjetivo “E xpor a semântica disponível em R D B M S de uma forma simples”. • O que é Um “plugin” para aplicações Web P HP , R uby/P ython (dev). • O que fa z D is ponibiliza os dados de B D ’s relacionais em triplas. • O que g era Arquivos R D F, JS O N e Linked D ata 4 T riplify : C o nfig ura ç ã o • Consultas SQL selecionando a informação, que gostariam que seja disponível publicamente (Open Data) S E LE C T id, name AS ‘foaf:name’ FR O M users 5 T riplify : E s trutura S Q L Q uery • Primeira coluna dever conter identificadores para serem utilizados para gerar URI’s das Instâncias Select id, name AS ‘foaf:name’ FROM users • 6 Nome das colunas utilizados para gerar as propriedades renomeando as colunas da tabela Select id, name AS ‘foaf:name’ FROM users T riplify : E s trutura S Q L Q uery • Cons ultas dev em retornar v alores literais ou referencias para outras ins tancias 7 T riplify : E x em plo LOC A DOR A $triplify['objectProperties']=array ('customer'=> "select customer_id as id, concat(concat(first_name,' '),last_name) as 'foaf:name’, first_name as 'foaf:firstName’, last_name as 'foaf:surname’, store_id as 'customerOf’, SHA(email) as 'foaf:mbox_sha1sum’, address_id as 'liveAt’, create_date as 'dcterms:created’ from customer”, … ) 8 $triplify['objectProperties']=array ( 'sioc:address'=>'address’, 'customerOf'=>'store’, 'liveAt'=>'address’ … ); $triplify['classMap']=array( 'customer'=>'foaf:Person’, 'store'=>'gr:LocationOfSales’, 'address'=>'vcard:Address' ); T riplify : I nteg ra ç ã o em A pps . W eb • Acrescentar o diretório do Triplify a raiz da aplicação. • Definir consultas SQL e ajustar o arquivo de configuração. • Possibilitar o acesso direto ao banco de dados relacional através: – – – 9 Objeto PDO. Driver de conexão Mysql. Utilizar um outro framework para abstração de base de dados (ODBC). D 2R Q e D 2R S erver 10 R equerim ento s S o ftw a re • Licença – GNU General Public License • Requerimentos • J a va 1.4 ou pos terio r • B a nc o de D a dos – M yS QL, O racle, M S S Q L P ostgreS Q L e O D BC (não automática). 11 D 2R Q e D 2R S erver : I ntro duç ã o • Objetivo “Permitir que aplicações consigam ter uma RDF-view em um banco de dados non-RDF”. • O que é Plataforma desenvolvida em Java para publicação de dados de BD em grafo RDF (on-the-fly) • O que gera RDF/XML (default), RDF/XML-ABBREV, N3, N-TRIPLE. • Quais BD’s Suporta Oracle, MySQL, PostgresSQL, Microsoft SQL Server, fontes de dados ODBC (sem geração automática). 12 D 2R Q e D 2R S erver : I ntro duç ã o • O que P erm ite – Mapeamento do BD para grafo virtual RDF – Consultas: linguagem SPARQL – RDF dumps – Acessar a informação do BD como Linked Data sobre a Web. 13 D 2R Q • D 2R Q M a pping L a ng ua g e Linguagem declarativa que descreve o mapeamento. • D 2R S erver servidor HTTP que fornece uma visão Linked Data e permite consultas SPARQL. – Tool que usa o D2RQ mapping para mapear o conteúdo do BD • D 2R Q E ng ine plug-in para Jena e Sesame Semantic Web toolkits. 14 A rquitetura da pla ta fo rm a D 2R Q 15 D 2R Q : T ipo s de M a pea m ento [1] • A uto m á tic o Cria um arquiv o de m apeam ento default analis ando o es quem a do B D . • Tabela = Classes; • Colunas = Propriedades; generate-mapping [-u username] [-p password] [-d driverclass] [-o outfile.n3] [-b base uri] jdbcURL generate-mapping -o m a pping .n3 -d driver.class.name -u db-user -p db-password jdbc:url:... 16 E x em plo D 2R Q : T ipo s de M a pea m ento [2] • C us to m iza do M odificar o arquiv o g erado pelo ”g erenate-m apping ” Utilizar v ocabulários conhecidos – foaf, sioc, dc, goodrelations, etc. 17 D 2R Q : M a pea m ento C us to m iza do M odificando o arquiv o m a pping .n3 2. D efinir c o nex ã o a o B D map:M yD atabase a d2rq:D atabase; d2rq:jdbcD S N "jdbc:mysql://localhost/mydb"; d2rq:jdbcD river "com.mysql.jdbc.D river"; d2rq:username "us er"; d2rq:password "pas sword". 3. D efinir a s entida des map:P eople a d2rq:C lassM ap; d2rq:uriP attern “http://.../people/@ @ User.ID @ @ ”. d2rq:condition “User.deleted=0”. 18 D 2R Q : M a pea m ento C us to m iza do 1. Adicionar propriedades para as entidades map:P eople a d2rq:C lassM ap; d2rq:uriP attern “http://.../people/@ @ User.ID @ @ ”; d2rq:condition “User.deleted=0”; d2rq:class foaf:P erson . S (C lassM ap) map:P eople a d2rq:C lassM ap . map:name a d2rq:P ropertyB ridge; d2rq:belongsToC lassM ap map:P eople; d2rq:property foaf:nick; d2rq:column “User.name”. 19 P O (D ata Properties ) D 2R Q : M a pea m ento C us to m iza do 1. Adicionar propriedades para as entidades map:P eople a d2rq:C lassM ap; d2rq:uriP attern “http://.../people/@ @ User.ID @ @ ”; d2rq:condition “User.deleted=0”; d2rq:class foaf:P erson . S (C lassM ap) map:mbox_sha1 a d2rq:P ropertyB ridge; d2rq:belongsToC lassM ap map:P eople; d2rq:property foaf:mbox_sha1sum; d2rq:sqlE xpression “S HA1(C O NC AT(‘mailto:’, User.email))”. 20 P O (D ata Properties ) D 2R Q : M a pea m ento C us to m iza do 1. Link as entidades map:P hotos a d2rq:C lassM ap; d2rq:uriP attern “http://.../photo/@ @ P hoto.ID @ @ ”; d2rq:class foaf:Image . map:photo a d2rq:P ropertyB ridge; d2rq:belongsToC lassM ap map:P eople; d2rq:property foaf:made; d2rq:uriP attern “http://.../photo/@ @ P hoto.UserID @ @ ”. (P hoto.UserID is a foreign key to User.ID ) 21 map:photo a d2rq:P ropertyB ridge; d2rq:belongsToC lassM ap map:P eople; d2rq:property foaf:made; d2rq:join “Us er.ID = P hoto.UserID ”; d2rq:refersToC lassM ap map:P hotos . (Object Properties) D 2R S erver : S ta rt the s erver • Uma vez que temos o arquivo de mapeamento m a pping .n3 executamos o seguinte comando d2r-server mapping.n3 • Agora podemos navegar sobre o grafo RDF, atraves do servidor D2R- Server 22 http://localhost:2020/ 23 O penL ink V irtuo s o R D F V iew s General Public License e Proprietario 24 V irtuo s o R D F V iew s : I ntro duç ã o • O bjetivo “C onverter dinamicamente dados relacionais em R D F e expô-lo no Virtuoso-hosted S P AR Q L endpoint.”. • O que é Virtuoso R D F Views mapea dados relacionais em R D F e permite que a representação do R D F possa ser personalizada. • O que g era R D F/XM L. (Q uad S torage) • Q ua is B D ’s S upo rta O racle, M S S erver, D B2, Informix, P rogress, M yS Q L, Ingres, Firebird, P ostgreS Q L e O D B C ou JD B C accesiveis R D BM S . 25 V irtuo s o R D F V iew s : M a pea m ento [1] • Definição de cada tabela em classes RDFS IRI @prefix peo: <http://localhost:8890/rdfv_demo/schemas/peoplet#> . peo:People a rdfs:Class ; C lassM ap rdfs:label ”People" ; rdfs:comment "An OpenLink People" . P roperties fo a f:na m e 26 a rdf:Property ; fo a f:m a de a rdf:Property ; rdfs:domain peo:People ; rdfs:domain peo:People ; rdfs:range xsd:string; rdfs:range ; photo:Photo rdfs:label ”people name" . rdfs:label ”photo id" . D ata P roperties O bject P roperties V irtuo s o R D F V iew s : M a pea m ento [2] • Construir Subject IRI’s para cada classe utilizando as chaves primarias de cada peo:us er_iri a tabela rdf:Property ; rdfs:domain peo:People ; rdfs:range xsd:string; rdfs:label ”people id" . sparql prefix peo: <http://localhost:8890/rdfv_demo/schemas/people#> create iri class peo :us er_iri "http://localhost:8890/rdfv_demo/testdata/people#%s" (in user_id varchar not null) . 27 V irtuo s o R D F V iew s : M a pea m ento [3] • Construir Predicados IRI’s para cada classe utilizando o resto de colunas sparql de cada tabela prefix qs: <http://localhost:8890/rdfv_demo/quad_storage/> prefix peo: <http://localhost:8890/rdfv_demo/schemas/people#> prefix pho: <http://localhost:8890/rdfv_demo/schemas/photos#> 28 c rea te qua d s tora g e qs:default from OPLWEB.DBA.PEOPLE as people_tbl from OPLWEB.DBA.PHOTOS as photos_tbl { create qs:people as graph <http://localhost:8890/rdfv_demo/testdata/people#> { peo:user_iri(peo ple_tbl.U S E R _I D ) a peo:People as qs:people_People ; foaf:name people_tbl.N A M E as qs:people_peopleName ; }. T riplify D 2R S erver V irtuo s o R D F V iew s PH P Jav a M iddleware S olution - S im S im L ing ua g em de M a pea m ento SQL R D F bas ed R D F bas ed G era ç ã o de m a pea m ento M anual S em iautom ático M anual M edia – Alta (N ão S PAR Q L) M edia Alta T ec no lo g ia S PAR QL E ndpo int E s c a la bilida de Link: http://esw.w3.org/Rdb2RdfXG/StateOfTheArt 29 P rinc ipa is R eferênc ia s • D2RQ, site http://www4.wiwiss.fu-berlin.de/bizer/d2r-server/#develo , Consultado 20/05/10 • W3C Group, site http://esw.w3.org/Rdb2RdfXG/StateOfTheArt, Consultado 21/05/10 • Triplify, site http://triplify.org/Documentation, Consultado 21/05/10 • Mapping Relational Data to RDF with Virtuoso's RDF Views, site http://virtuoso.openlinksw.com/Whitepapers/html/rdf_vie , Consultado 19/05/10 30