• Nenhum resultado encontrado

Capítulo 6 O Protótipo OntoBusiness

6.4 Reescrita de Consultas

Em particular, cada Wrapper possui um tradutor interno que encapsula os detalhes da linguagem de consulta em questão. Por exemplo, na tradução de uma consulta simples em SPARQL para SQL, é seguido um mapeamento semelhante ao descrito no Quadro 6.8 e no Quadro 6.9 (considerando critérios de junção como sugerido na proposta de [Arr02]):

107 Quadro 6.8 Consulta em SPARQL

É traduzido para:

Quadro 6.9 Consulta em SQL

Isso considerando que todas as propriedades da classe estejam na mesma entidade correspondente no banco de dados relacional.

Caso haja algum caso em que classe e propriedade estejam armazenadas em tabelas diferentes no banco, é verificada a regra de disjunção equivalente na tabela de mapeamento de junções. Por exemplo, caso a <propriedade1> esteja em outra entidade de relação 1-1 ou N-1, o sistema

SELECT ?<propriedade1> ?<propriedade2>...?<propriedadeN>

WHERE {

?<classe> <prefixo_propriedade1>:<propriedade1> ?<propriedade1>.

?<classe> <prefixo_propriedade2>:<propriedade2> ?<propriedade2>. ...

?<classe> <prefixo_propriedadeN>:<propriedadeN> ?<propriedadeN>. FILTER (

?<propriedade1> = <VALOR_PASSADO_1> && ?<propriedade2> = <VALOR_PASSADO_2> &&

...

?<propriedadeN> = <VALOR_PASSADO_N> &&

}

SELECT <classe>.<propriedade1> <classe>.<propriedade2>...<classe>.<propriedadeN> FROM <classe> WHERE <classe>.<propriedade1> = <VALOR_PASSADO_1>, <classe>.<propriedade2> = <VALOR_PASSADO_2>, ... <classe>.<propriedadeN> = <VALOR_PASSADO_N>,

108

realiza a tradução, como mostrado no Quadro 6.10.

Quadro 6.10 Tradução da consulta

A consulta é então retornada pelo Wrapper como um arquivo OWL contendo os indivíduos da resposta. Por exemplo, na consulta mostrada no Quadro 6.11.

Quadro 6.11 Exemplo de consulta ao sistema, em SPARQL

O resultado retornado é mostrado no Quadro 6.12

PREFIX ebOnt:<http://localhost:8080/ontoBusiness/ontology/ebOnt.owl#> PREFIX storeA:<http://localhost:8080/ontoBusiness/ontology/storeA.owl#> PREFIX storeB:<http://localhost:8080/ontoBusiness/ontology/storeB.owl#>

SELECT ?digitalCamera ?hasMegaPixel ?hasRealZoom WHERE {

?digitalCamera storeB:hasMegaPixel ?hasMegaPixel. ?digitalCamera storeB:hasRealZoom ?hasRealZoom.

FILTER ( ?hasMegaPixel = 8.0 && ?hasRealZoom = "20x" ) } SELECT <propriedade1>.<propriedade1>,<classe>.<propriedade2>...<classe>.<propriedadeN> FROM <classe>, <propriedade1>

WHERE

<classe>.<chave_estrangeira_propriedade_1> = <propriedade_1>.<chave_primaria> <classe>.<propriedade2> = <VALOR_PASSADO_2>,

...

109 Quadro 6.12 Resultado da consulta, em OWL.

O resultado da consulta é montado através da união das instâncias de ontologias retornadas por cada Wrapper. Isto é feito de maneira automatizada pela API Jena2, pela funcionalidade de mesclagem (merge). Existe uma variável chamada ‘model’, instância da classe ‘com.hp.hpl.jena.ontology.OntModel’, que é propriedade da classe OntologyManager. Essa variável é a responsável por armazenar a ontologia-união, resultado das consultas, na memória

<?xml version="1.0" ?> - <rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax- ns#" xmlns:xsd="http://www.w3.org/2001/XMLSchema#" xmlns:storeB=http://localhost:8080/ontoBusiness/ontology/storeB .owl# xmlns:rdfs="http://www.w3.org/2000/01/rdf-schema#" xmlns:owl="http://www.w3.org/2002/07/owl#" xmlns:ebOnt="http://localhost:8080/ontoBusiness/ontology/ebOnt .owl#" xmlns:daml="http://www.daml.org/2001/03/daml+oil#"

xmlns="http://localhost:8080/ontoBusiness/ontology/results.owl# " xmlns:dc=http://purl.org/dc/elements/1.1/ xml:base=" http://localhost:8080/ontoBusiness/ontology/results.owl# "> - <owl:Ontology rdf:about=""> <owl:imports rdf:resource="http://localhost:8080/ontoBusiness/ontolog y/storeB.owl" /> </owl:Ontology> - <storeB:DigitalPhotoCamera rdf:ID="Professional_Digital"> <storeB:hasRealZoom rdf:datatype="http://www.w3.org/2001/XMLSchema#strin g">20x</storeB:hasRealZoom> <storeB:hasMegaPixel rdf:datatype="http://www.w3.org/2001/XMLSchema#float ">8.0</storeB:hasMegaPixel> <ebOnt:hasPrice rdf:resource="http://localhost:8080/ontoBusiness/ontolog y/storeB.owl#Price_14" /> </storeB:DigitalPhotoCamera> </rdf:RDF>

110

principal do servidor. A mesclagem é feita através de sucessivas chamadas ao método add(), da classe OntModel, passando todas as ontologias sucessivamente como parâmetro, tanto as de esquemas global e locais quanto as que armazenam as instâncias dos dados retornados pelos Wrappers. Torna-se possível, assim, gerar uma ontologia unificada, em memória principal, para ser manipulada pelo sistema. Utilizando-se desse recurso o sistema, após os resultados terem sido retornados pelos Wrappers, o resultado completo é repassado à camada de apresentação, que por seu turno fornece uma visão do esquema unificado, junto aos dados recuperados, ao usuário.

6.5 Considerações Finais

Neste capítulo foi detalhada uma implementação que visa dar validar a arquitetura aqui proposta. Esta implementação apresenta-se na forma de um protótipo funcional, implementado em Java. Foram também disponibilizadas dois wrappers e duas fontes, a primeira uma base de dados mySQL, e a segunda, um arquivo OWL.

Inicialmente foi explicada a modelagem do protótipo, descrita em UML. Foram mostrados o diagrama de casos de uso e o diagrama de pacotes e classes do sistema.

Em seguida, foi explicado como é feita a tarefa e os critérios de tradução das consultas submetidas ao sistema, dando uma visão geral do funcionamento dos wrappers. Também foi dada uma explanação em linhas gerais do funcionamento das principais classes e métodos do sistema, sendo mostrados também alguns parâmetros de configuração. Por fim, foi demonstrado o funcionamento a partir da interface do sistema, através da exibição de telas capturadas, exibindo suas principais funcionalidades.

111

Documentos relacionados