Vous êtes sur la page 1sur 19

PLANEJAMENTO DE VIAGENS SEMNTICO MARIO MATIUSSO JR.

(mario3001@ig.com.br)

20 de Junho de 2010

Resumo Este documento ir apresentar um modelo para o projeto e implementao de um sistema semntico para planejamento automtico de viagens. O planejamento de viagem consiste no planejamento de pontos de parada para alimentao e reabastecimento do veculo, bem como hospedagem e pontos de interesse ao longo de caminho. Este projeto ser implementado utilizando tecnologias de web semntica como RDF/XML como linguagem, Jena como engine de busca RDF, SPARQL como linguagem de busca RDF, ARQ como engine para a linguagem SPARQL e servlets para o disparo de retorno de consultas SPARQL em HTTP. Neste trabalho ser apresentado um modelo bsico, que poder ser tomado como referncia para trabalhos futuros.

Sumrio
1 Introduo.................................................................................................................................... 4 2 O Tema Analisado ........................................................................................................................ 5 2.1 Arquitetura do Sistema ..................................................................................................5 2.2 Estrutura Semntica do Projeto......................................................................................6 2.3 SPARQL .......................................................................................................................7 3 Operao do Sistema.................................................................................................................... 9 4 Concluso .................................................................................................................................. 11 4.1 Dificuldades Encontradas ............................................................................................ 11 4.1 Dificuldades Encontradas ............................................................................................... 11 4.2 Trabalhos Futuros........................................................................................................ 11 4.2 Trabalhos Futuros ........................................................................................................... 11 Referncias Bibliogrficas ............................................................................................................ 12 Viagem.RDF ........................................................................................................................13 Portal.html............................................................................................................................16 disparaConsulta.java.............................................................................................................17 Consulta_SPARQL.java .......................................................................................................19

Captulo 1

Introduo
Com o avano da tecnologia de mapas e rotas on-line (por exemplo o Google Maps), faz-se necessrio a criao de sistemas de planejamento automtico de pararas de descanso e reabastecimento durante uma viagem. As ferramentas de planejamento atuais so dependentes de informaes mantidas em cach em grandes servidores. Estas informaes mantidas em cach podem demorar meses para serem atualizadas, tornando o planejamento de uma viagem falho e impreciso. O projeto atual visa realizar o planejamento dos pontos de parada de forma distribuda, onde cada ponto de interesse (postos de gasolina, restaurantes) ir manter sua prpria base de dados em formato RDF. Estas bases de dados sero acessadas em tempo real, a cada consulta, tornando o processo de busca de dados muito mais preciso e confivel. O sistema de planejamento de viagens que ser apresentado navega pela rota, entre a origem e o destino, e aponta os pontos de interesse selecionados pelo usurio. Ou seja, caso o destino seja Vitria, o sistema no mostrar nenhum recurso de cidades que no faam parte do caminho at ao destino. Nesta verso inicial, o ponto de origem sempre So Paulo.

Captulo 2

Implementao do Projeto
A implementao do projeto foi realizada utilizando-se de tecnologias de web semntica como RDF/XML como linguagem, Jena como engine de busca RDF, SPARQL como linguagem de busca RDF, ARQ como engine para a linguagem SPARQL e servlets para o disparo de retorno de consultas SPARQL em HTTP. As particularidades das tecnologias empregadas neste projeto no so de escopo deste documento e sero omitidas.

2.1Arquitetura do Sistema
A arquitetura proposta pelo projeto mostrada pelo diagrama abaixo:

Figura 1: Arquitetura do sistema Nesta arquitetura o cliente envia uma requisio (request) HTTP para o servidor. O servidor atravs do TomCat recebe a requisio e dispara um servlet que implementa as bibliotecas Jena. Este, por sua vez faz a consulta na base de dados RDF e devolve (Response) o resultado para o cliente atravs do servidor web (o prprio tomcat neste caso). Para melhor visualizao no browser do cliente, o resultado tratado com folha de estilos XSLT.

2.2 Estrutura Semntica do Projeto


O corao deste modelo o arquivo RDF localizado na pasta raiz do projeto (Viagem.RDF). Neste arquivo onde esto as relaes entre as cidades e seus pontos de interesse. Abaixo podemos ver a estrutura de grafos do arquivo Viajem.RDF.

Figura 2: Anexo 1 Grafos (gerado pelo site: http://www.w3.org/RDF/Validator/) Como podemos ver no grafo, no esto contemplados caminhos alternativos, ficando como sugesto para futuros desenvolvimentos.

A tabela abaixo mostra uma amostra das triplas Sujeito - Predicado Objeto do projeto.

Tabela 1: Triplas (gerado pelo site: http://www.w3.org/RDF/Validator/) As triplas mostradas na tabela acima representam tambm os outros casos, que sero omitidos. A tabela completa pode ser gerada atravs do site http://www.w3.org/RDF/Validator/.

2.3 SPARQL SPARQL a linguagem para a consulta as bases de dados RDF. Neste projeto foi realizada apenas uma consulta disparada atravs de um servlet.

No quadro abaixo est um exemplo de consulta, que retorna os Postos de combustvel no eixo Rio/So Paulo.

select ?Cidade ?Estabelecimento ?Preco ?Local ?Funcionamento ?Tipo where { {<http://www.patanegra.co.cc/RioDeJaneiro> <http://purl.org/dc/elements/1.1/name> ?Cidade. <http://www.patanegra.co.cc/RioDeJaneiro> <http://www.patanegra.co.cc/suporte/Combustivel> ?Estabelecimento. ?Estabelecimento <http://purl.org/dc/elements/1.1/preco> ?Preco. ?Estabelecimento <http://purl.org/dc/elements/1.1/localizacao> ?Local. ?Estabelecimento <http://purl.org/dc/elements/1.1/funcionamento> ?Funcionamento. ?Estabelecimento <http://purl.org/dc/elements/1.1/tipo> ?Tipo.} UNION

{<http://www.patanegra.co.cc/RioDeJaneiro> <http://www.patanegra.co.cc/proxima> ?Cidade. ?Cidade <http://www.patanegra.co.cc/suporte/Combustivel> ?Estabelecimento.

?Estabelecimento ?Estabelecimento ?Estabelecimento ?Funcionamento. ?Estabelecimento UNION

<http://purl.org/dc/elements/1.1/preco> ?Preco. <http://purl.org/dc/elements/1.1/localizacao> ?Local. <http://purl.org/dc/elements/1.1/funcionamento> <http://purl.org/dc/elements/1.1/tipo> ?Tipo.}

{<http://www.patanegra.co.cc/RioDeJaneiro> <http://www.patanegra.co.cc/proxima> ?Cidade1. ?Cidade1 <http://www.patanegra.co.cc/proxima> ?Cidade. ?Cidade <http://www.patanegra.co.cc/suporte/Combustivel> ?Estabelecimento. ?Estabelecimento <http://purl.org/dc/elements/1.1/preco> ?Preco. ?Estabelecimento <http://purl.org/dc/elements/1.1/localizacao> ?Local. ?Estabelecimento <http://purl.org/dc/elements/1.1/funcionamento> ?Funcionamento. ?Estabelecimento <http://purl.org/dc/elements/1.1/tipo> ?Tipo.} UNION {<http://www.patanegra.co.cc/RioDeJaneiro> <http://www.patanegra.co.cc/proxima> ?Cidade2. ?Cidade2 <http://www.patanegra.co.cc/proxima> ?Cidade3. ?Cidade3 <http://www.patanegra.co.cc/proxima> ?Cidade. ?Cidade <http://www.patanegra.co.cc/suporte/Combustivel> ?Estabelecimento. ?Estabelecimento <http://purl.org/dc/elements/1.1/preco> ?Preco. ?Estabelecimento <http://purl.org/dc/elements/1.1/localizacao> ?Local. ?Estabelecimento <http://purl.org/dc/elements/1.1/funcionamento> ?Funcionamento. ?Estabelecimento <http://purl.org/dc/elements/1.1/tipo> ?Tipo.} }

A clusula UNION utilizada para juntar os resultados obtidos em cada query. Dentro do sistema a cidade e o recurso so variveis enviadas pelo mtodo Post.

Captulo 3

Operao do Sistema
A operao do sistema totalmente intuitiva. Para operar o sistema basta que o usurio acesse o link do portal semntico na pagina principal:

Figura 3: Operao do sistema Aps acessar o portal, basta selecionar o destino da Viajem e o tipo de estabelecimento desejado e clicar em Enviar!:

Figura 4: Operao do sistema

Por exemplo, foi selecionada a cidade de Braslia e o recurso Combustvel:

Figura 5: Operao do sistema

Aps clicar em Enviar!, o sistema retornar a seguinte mensagem:

Figura 6: Resposta do sistema Caso queira repetir a consulta, basta o usurio clicar sobre o boto Voltar do browser.

Captulo 4

Concluso
A partir deste projeto, possvel certificar-se da possibilidade de criao de um sistema semntico para planejamento de viagens e longos percursos. A base de dados RDF poder ser distribuda, onde cada ponto de interesse poder disponibilizar as atualizaes de seu negcio em tempo real. Atravs da modelagem proposta, verifica-se a facilidade de insero de novos pontos de interesse no sistema a qualquer momento sem grandes dificuldades. Apesar de no terem sidos feitos testes formais de confiabilidade e velocidade do sistema, a execuo dos servlets e processamento das consultas pelo ARQ, mostrou-se leve e rpida.

4.1

Dificuldades Encontradas
As principais dificuldades encontras so devido a formatao dos documentos XML retornados

pelo processamento do servlet. As bibliotecas de transformao no tem suporte a todos os comandos XSLT, dificultando a formatao de forma profissional.

4.2

Trabalhos Futuros
Este projeto apenas um modelo e tem como objetivo incentivar acadmicos ou empresas ao

desenvolvimento de produtos baseados em web semntica. Como trabalhos pendentes podemos incluir: a adio de rotas alternativas, adio da possibilidade de mudana de origem, bem como definio de um padro de dados RDF real para os pontos de interesse.

Referncias Bibliogrficas
1. Slides de Aula Maria da Graa Bruno Marietto http://professor.ufabc.edu.br/~graca.marietto Ufabc

2. RDF Vocabulary Description Language 1.0: RDF Schema W3C Recommendation 10 February 2004 Editors: Dan Brickley, W3C R.V. Guha, IBM http://www.w3.org/TR/2004/REC-rdf-schema-20040210/

Apndice

Apndice A
Viagem.RDF
<?xml version="1.0" encoding="ISO-8859-1"?> <rdf:RDF xmlns:cidades="http://www.patanegra.co.cc/" xmlns:suporte="http://www.patanegra.co.cc/suporte/" xmlns:ligacao="http://www.patanegra.co.cc/" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:dc="http://purl.org/dc/elements/1.1/"> <rdf:Description rdf:about="http://www.patanegra.co.cc/SaoPaulo"> <dc:name>http://www.patanegra.co.cc/SaoPaulo</dc:name> <suporte:Combustivel rdf:resource="http://www.texaco.com.br/"/> <suporte:Alimentacao rdf:resource="http://www.padaria.com.br/"/> <suporte:Alimentacao rdf:resource="http://www.restaurante.com.br/"/> <suporte:Hospedagem rdf:resource="http://www.othonpalace.com.br/"/> <suporte:Hospedagem rdf:resource="http://www.ibis.com.br/"/> </rdf:Description> <rdf:Description rdf:about="http://www.patanegra.co.cc/SaoJose"> <dc:name>http://www.patanegra.co.cc/SaoJose</dc:name> <suporte:Combustivel rdf:resource="http://www.texaco.com.br/"/> <suporte:Combustivel rdf:resource="http://www.shell.com.br/"/> <suporte:Alimentacao rdf:resource="http://www.restaurante.com.br/"/> <suporte:Hospedagem rdf:resource="http://www.ibis.com.br/"/> <ligacao:proxima rdf:resource="http://www.patanegra.co.cc/SaoPaulo"/> </rdf:Description> <rdf:Description rdf:about="http://www.patanegra.co.cc/RioDeJaneiro"> <dc:name>http://www.patanegra.co.cc/RioDeJaneiro</dc:name> <suporte:Combustivel rdf:resource="http://www.shell.com.br/"/> <suporte:Combustivel rdf:resource="http://www.texaco.com.br/"/> <suporte:Alimentacao rdf:resource="http://www.restaurante.com.br/"/> <suporte:Alimentacao rdf:resource="http://www.padaria.com.br/"/> <suporte:Hospedagem rdf:resource="http://www.ibis.com.br/"/> <suporte:Hospedagem rdf:resource="http://www.casadasogra.com.br/"/> <suporte:Diversao rdf:resource="http://www.nigthclub.com.br/"/> <ligacao:proxima rdf:resource="http://www.patanegra.co.cc/SaoJose"/> </rdf:Description> <rdf:Description rdf:about="http://www.patanegra.co.cc/Vitoria"> <dc:name>http://www.patanegra.co.cc/Vitoria</dc:name> <suporte:Combustivel rdf:resource="http://www.shell.com.br/"/> <suporte:Hospedagem rdf:resource="http://www.casadasogra.com.br/"/> <ligacao:proxima rdf:resource="http://www.patanegra.co.cc/RioDeJaneiro"/> </rdf:Description> <rdf:Description rdf:about="http://www.patanegra.co.cc/Varginha"> <dc:name>http://www.patanegra.co.cc/Varginha</dc:name> <suporte:Alimentacao rdf:resource="http://www.restaurante.com.br/"/> <suporte:Alimentacao rdf:resource="http://www.padaria.com.br/"/> <suporte:Hospedagem rdf:resource="http://www.ibis.com.br/"/> <ligacao:proxima rdf:resource="http://www.patanegra.co.cc/SaoPaulo"/> </rdf:Description> <rdf:Description rdf:about="http://www.patanegra.co.cc/BeloHorizonte"> <dc:name>http://www.patanegra.co.cc/BeloHorizonte</dc:name> <suporte:Alimentacao rdf:resource="http://www.restaurante.com.br/"/> <suporte:Alimentacao rdf:resource="http://www.padaria.com.br/"/> <suporte:Combustivel rdf:resource="http://www.shell.com.br/"/> <suporte:Diversao rdf:resource="http://www.cassino.com.br/"/> <ligacao:proxima rdf:resource="http://www.patanegra.co.cc/Varginha"/> </rdf:Description> <rdf:Description rdf:about="http://www.patanegra.co.cc/PresidentePrudente"> <dc:name>http://www.patanegra.co.cc/PresidentePrudente</dc:name> <suporte:Alimentacao rdf:resource="http://www.restaurante.com.br/"/> <suporte:Combustivel rdf:resource="http://www.shell.com.br/"/> <suporte:Hospedagem rdf:resource="http://www.casadasogra.com.br/"/> <suporte:Diversao rdf:resource="http://www.cachacaria.com.br/"/> <ligacao:proxima rdf:resource="http://www.patanegra.co.cc/SaoPaulo"/> </rdf:Description> <rdf:Description rdf:about="http://www.patanegra.co.cc/CampoGrande"> <dc:name>http://www.patanegra.co.cc/CampoGrande</dc:name> <suporte:Combustivel rdf:resource="http://www.shell.com.br/"/> <suporte:Hospedagem rdf:resource="http://www.ibis.com.br/"/> <ligacao:proxima rdf:resource="http://www.patanegra.co.cc/PresidentePrudente"/> </rdf:Description>

<rdf:Description rdf:about="http://www.patanegra.co.cc/Brasilia"> <dc:name>http://www.patanegra.co.cc/Brasilia</dc:name> <suporte:Combustivel rdf:resource="http://www.shell.com.br/"/> <suporte:Hospedagem rdf:resource="http://www.ibis.com.br/"/> <suporte:Hospedagem rdf:resource="http://www.othonpalace.com.br/"/> <suporte:Diversao rdf:resource="http://www.nigthclub.com.br/"/> <ligacao:proxima rdf:resource="http://www.patanegra.co.cc/CampoGrande"/> </rdf:Description> <rdf:Description rdf:about="http://www.patanegra.co.cc/Cuiaba"> <dc:name>http://www.patanegra.co.cc/Cuiaba</dc:name> <suporte:Combustivel rdf:resource="http://www.texaco.com.br/"/> <suporte:Hospedagem rdf:resource="http://www.casadasogra.com.br/"/> <suporte:Alimentacao rdf:resource="http://www.habibis.com.br/"/> <ligacao:proxima rdf:resource="http://www.patanegra.co.cc/BeloHorizonte"/> </rdf:Description> <!-- A pertir daqui esto representados os sites dos pontos de interesse que estaro disponibilizados na web --> <rdf:Description rdf:about="http://www.ibis.com.br/"> <dc:tipo>Basico</dc:tipo> <dc:preco>R$55,00</dc:preco> <dc:funcionamento>24hs</dc:funcionamento> <dc:localizacao>Centro</dc:localizacao> </rdf:Description> <rdf:Description rdf:about="http://www.othonpalace.com.br/"> <dc:tipo>SuperLuxo</dc:tipo> <dc:preco>R$550,00</dc:preco> <dc:funcionamento>24hs</dc:funcionamento> <dc:localizacao>Centro</dc:localizacao> </rdf:Description> <rdf:Description rdf:about="http://www.casadasogra.com.br/"> <dc:tipo>Luxo</dc:tipo> <dc:preco>R$150,00</dc:preco> <dc:funcionamento>24hs</dc:funcionamento> <dc:localizacao>Campo</dc:localizacao> </rdf:Description> <rdf:Description rdf:about="http://www.padaria.com.br/"> <dc:tipo>Basico</dc:tipo> <dc:preco>R$12,00</dc:preco> <dc:funcionamento>24hs</dc:funcionamento> <dc:localizacao>Bairro</dc:localizacao> </rdf:Description> <rdf:Description rdf:about="http://www.habibis.com.br/"> <dc:tipo>Basico</dc:tipo> <dc:preco>R$20,00</dc:preco> <dc:funcionamento>24hs</dc:funcionamento> <dc:localizacao>Centro</dc:localizacao> </rdf:Description> <rdf:Description rdf:about="http://www.restaurante.com.br/"> <dc:tipo>Luxo</dc:tipo> <dc:preco>R$56,00</dc:preco> <dc:funcionamento>Comercial</dc:funcionamento> <dc:localizacao>Centro</dc:localizacao> </rdf:Description> <rdf:Description rdf:about="http://www.shell.com.br/"> <dc:tipo>-</dc:tipo> <dc:preco>R$2,45</dc:preco> <dc:funcionamento>Comercial</dc:funcionamento> <dc:localizacao>Bairro</dc:localizacao> </rdf:Description> <rdf:Description rdf:about="http://www.texaco.com.br/"> <dc:tipo>-</dc:tipo> <dc:preco>R$2,20</dc:preco> <dc:funcionamento>24hs</dc:funcionamento> <dc:localizacao>Centro</dc:localizacao> </rdf:Description> <rdf:Description rdf:about="http://www.nigthclub.com.br/"> <dc:tipo>Luxo</dc:tipo> <dc:preco>R$250,00</dc:preco> <dc:funcionamento>24hs</dc:funcionamento> <dc:localizacao>Centro</dc:localizacao> </rdf:Description> <rdf:Description rdf:about="http://www.cassino.com.br/"> <dc:tipo>Restrito</dc:tipo> <dc:preco>R$3500,00</dc:preco> <dc:funcionamento>24hs</dc:funcionamento> <dc:localizacao>Centro</dc:localizacao> </rdf:Description> <rdf:Description rdf:about="http://www.cachacaria.com.br/">

<dc:tipo>Simples</dc:tipo> <dc:preco>R$35,00</dc:preco> <dc:funcionamento>Noturno</dc:funcionamento> <dc:localizacao>Centro</dc:localizacao> </rdf:Description> </rdf:RDF>

Apndice B
Portal.html
<html> <head> <title>Consultas em Sparql</title> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> </head>

<body bgcolor="#000000" link="#000000" vlink="#000000" alink="#000000">

<font face="Arial" color="#FFFFFF" size="3"> Selecione a cidade de destino e tipo de suporte: </font> <br/> <form name="consulta" method="post" action="http://localhost:8080/patanegra/disparaConsulta"> <label><font color="#FFFFFF" face="Arial, Helvetica, sans-serif">Cidade de destino:</font> <select name="cidade"> <option selected>-</option> <option>CampoGrande</option> <option>PresidentePrudente</option> <option>BeloHorizonte</option> <option>Varginha</option> <option>Vitoria</option> <option>RioDeJaneiro</option> <option>SaoJose</option> <option>Brasilia</option> <option>Cuiaba</option> </select> </label> <label><font color="#FFFFFF" face="Arial, Helvetica, sans-serif">Estabelecimento:</font> <select name="suporte"> <option selected>-</option> <option>Hospedagem</option> <option>Alimentacao</option> <option>Combustivel</option> <option>Diversao</option> </select> </label> <TABLE border=0> <TR> <TD><INPUT name="submit" TYPE="submit" value="Enviar!"> </TD> <TD><INPUT name="reset" type="reset" value="Limpar"> </TD> </TR> </TABLE> </form> </body> </html>

Apndice C
disparaConsulta.java
import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.*; import javax.xml.transform.*; import javax.xml.transform.stream.*;

public class disparaConsulta extends HttpServlet { @Override public void doGet(HttpServletRequest request,HttpServletResponse response) throws ServletException, IOException { String cidade=""; String suporte=""; String consulta=""; String uri = "C:/Projeto/apache-tomcat-6.0.26/webapps/patanegra/Viagem.rdf"; //pega os parametros dos combobox passados pelo Post cidade = request.getParameter("cidade"); suporte = request.getParameter("suporte"); //monta a consulta SPARQL consulta = "select ?Cidade ?Estabelecimento ?Preco ?Local ?Funcionamento ?Tipo " + "where {" + "{<http://www.patanegra.co.cc/" + cidade+ "> <http://purl.org/dc/elements/1.1/name> ?Cidade." + "<http://www.patanegra.co.cc/" + cidade+ "> <http://www.patanegra.co.cc/suporte/" + suporte + "> ?Estabelecimento." + "?Estabelecimento <http://purl.org/dc/elements/1.1/preco> ?Preco." + "?Estabelecimento <http://purl.org/dc/elements/1.1/localizacao> ?Local." + "?Estabelecimento <http://purl.org/dc/elements/1.1/funcionamento> ?Funcionamento." + "?Estabelecimento <http://purl.org/dc/elements/1.1/tipo> ?Tipo.}" + "UNION" + "{<http://www.patanegra.co.cc/" + cidade+ "> <http://www.patanegra.co.cc/proxima> ?Cidade." + "?Cidade <http://www.patanegra.co.cc/suporte/" + suporte + "> ?Estabelecimento." + "?Estabelecimento <http://purl.org/dc/elements/1.1/preco> ?Preco." + "?Estabelecimento <http://purl.org/dc/elements/1.1/localizacao> ?Local." + "?Estabelecimento <http://purl.org/dc/elements/1.1/funcionamento> ?Funcionamento." + "?Estabelecimento <http://purl.org/dc/elements/1.1/tipo> ?Tipo.}" + "UNION" + "{<http://www.patanegra.co.cc/" + cidade+ "> <http://www.patanegra.co.cc/proxima> ?Cidade1." + "?Cidade1 <http://www.patanegra.co.cc/proxima> ?Cidade." + "?Cidade <http://www.patanegra.co.cc/suporte/" + suporte + "> ?Estabelecimento." + "?Estabelecimento <http://purl.org/dc/elements/1.1/preco> ?Preco." + "?Estabelecimento <http://purl.org/dc/elements/1.1/localizacao> ?Local." + "?Estabelecimento <http://purl.org/dc/elements/1.1/funcionamento> ?Funcionamento." + "?Estabelecimento <http://purl.org/dc/elements/1.1/tipo> ?Tipo.}" + "UNION" + "{<http://www.patanegra.co.cc/" + cidade+ "> <http://www.patanegra.co.cc/proxima> ?Cidade2." + "?Cidade2 <http://www.patanegra.co.cc/proxima> ?Cidade3." + "?Cidade3 <http://www.patanegra.co.cc/proxima> ?Cidade." + "?Cidade <http://www.patanegra.co.cc/suporte/" + suporte + "> ?Estabelecimento." + "?Estabelecimento <http://purl.org/dc/elements/1.1/preco> ?Preco." + "?Estabelecimento <http://purl.org/dc/elements/1.1/localizacao> ?Local." + "?Estabelecimento <http://purl.org/dc/elements/1.1/funcionamento> ?Funcionamento." + "?Estabelecimento <http://purl.org/dc/elements/1.1/tipo> ?Tipo.}}";

//cria o objeto para a consulta Consulta_SPARQL acessaConsulta = new Consulta_SPARQL(); //recebe uma string com o resultado da consulta (mas com o formato de XML)

String resultadoConsulta = acessaConsulta.executeQuery(uri, consulta); //teste //response.setContentType("text/xml"); //response.getWriter().println(resultadoConsulta);

//+++++++++++++++++++++++++++++++ TRANSFORMAO DO XML COM XSLT //procura o arquivo xslt na pasta do projeto String arq_xslt = "C:\\Projeto\\apache-tomcat-6.0.26\\webapps\\patanegra\\resposta.xsl"; FileReader meuXSLT = new FileReader(arq_xslt); //monta um arquivo de nome nico, afim de evitar problemas com a thred de cada servlet //melhorar isso aqui, com um rand ou algo parecido. long data = System.currentTimeMillis(); String arquivo = "C:\\Projeto\\apache-tomcat-6.0.26\\webapps\\patanegra\\" + Long.toString(data) + ".xml"; //grava o retorno em um arquivo .xml BufferedWriter arq_xml = new BufferedWriter(new FileWriter(arquivo)); arq_xml.write(resultadoConsulta); arq_xml.close(); //abre o arquivo xml para passalo como parametro FileReader meuXML = new FileReader(arquivo); //fala pro browseer que a resposta sera html response.setContentType("text/html"); try { //Cria o objeto trnasformador TransformerFactory transFact = TransformerFactory.newInstance(); Transformer trans = transFact.newTransformer(new StreamSource(meuXSLT)); //Processa a folha de estilos e envia a sada para o browser trans.transform(new StreamSource(meuXML), new StreamResult(response.getWriter())); //apaga o arquivo temporario File file = new File(arquivo); file.delete(); //=+++++++++++++++++++++++++++++++TRANSFORMAO DO XML COM XSLT

//caso de alguma merda } catch (TransformerConfigurationException e) { response.getWriter().write(e.getMessage()); e.printStackTrace(response.getWriter()); } catch (TransformerException e) { response.getWriter().write(e.getMessage()); e.printStackTrace(response.getWriter()); }

response.getWriter().close(); }

@Override public void doPost(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException { //repassa o post para get, para uniformizar as chamadas doGet(request, response); } }

Apndice D
Consulta_SPARQL.java
import java.io.File; import java.io.FileInputStream; import java.io.InputStream;

import com.hp.hpl.jena.query.Query; import com.hp.hpl.jena.query.QueryExecution; import com.hp.hpl.jena.query.QueryExecutionFactory; import com.hp.hpl.jena.query.QueryFactory; import com.hp.hpl.jena.query.ResultSet; import com.hp.hpl.jena.rdf.model.Model; import com.hp.hpl.jena.rdf.model.ModelFactory; import com.hp.hpl.jena.query.ResultSet; import com.hp.hpl.jena.query.ResultSetFormatter; public class Consulta_SPARQL { public String executeQuery(String uri, String consulta) { Model model = ModelFactory.createDefaultModel(); try { /* Abre o arquivo .rdf para a consulta */ InputStream in = new FileInputStream(new File(uri)); model.read(in, null); in.close(); } catch (Exception e) { e.printStackTrace(); } Query query = QueryFactory.create(consulta); // Executa a query e obtem os resultados QueryExecution qe = QueryExecutionFactory.create(query, model); ResultSet results=null; String ret ="";

try { //cria o resultset results = qe.execSelect(); ret = ResultSetFormatter.asXMLString(results); } catch (Exception e) { e.printStackTrace(); } finally { qe.close(); } //retorna um resultset return ret; } }

Vous aimerez peut-être aussi