Guia de aula laboratorial

O guia da 6º aula prática está disponível online. Os tópicos abordados incluem conceitos relacionados com a integração de dados XML através do uso de XQuery.

Integração de dados

A necessidade de combinar informação proveniente de vários documentos XML, obedecendo a esquemas diferentes para a representação dos dados, ocorre com frequência em projectos relacionados com consolidação de informação. Nesta aula prática vamos utilizar a linguagem XQuery para resolver problemas simples de integração de dados.

Tal como visto em aulas práticas anteriores, a linguagem XQuery está para o XML como o SQL está para os sistemas de bases de dados relacionais. Ela facilita o processamento de dados XML e a transformação entre diferentes esquemas de representação. Esta aula prática irá cobrir alguns aspectos avançados relacionados com a linguagem XQuery (i.e. a criação de views), os quais assumem particular importância em tarefas de integração de dados.

Nos exemplos que se seguem, iremos usar um processador de XQuery open source denominado Saxon ( http://saxon.sourceforge.net/ ). Na sua versão mais recente, esta ferramenta implementa os standards XQuery 1.0 e XPath 2.0. Para utilizar, o ficheiro saxon8.jar deve ser colocado no "classpath" do Java. As interrogações XQuery podem ser criadas usando um qualquer editor de texto, sendo que na linha de comandos poderão ser executadas através da instrução
java -cp saxon8.jar net.sf.saxon.Query ficheiro-query.txt

O ficheiro xquery.zip ( http://web.tagus.ist.utl.pt/~bruno.martins/materials/class-materials/labs-gti/xquery/xquery.zip

Criação de "views" em XQuery

A linguagem XQuery inclui uma extensa biblioteca de funções ( www.w3.org/TR/xpath-functions/ ) e permite ainda que os utilizadores definam as suas próprias. O exemplo que se segue ilustra a criação de funções em XQuery.

) inclui a ferramenta saxon assim como alguns ficheiros de teste.

declare namespace exemplos="uri:gti.tagus.ist.utl.pt";

declare function exemplos:nomes($user as xs:string) {
for $h in doc("exemplo.xml")/content, $c in doc("exemplo2.xml")/content
where $h/name = $user and $c/username =$h/id
return
<result>
{ $c/userid }
</result>
};


Através deste exemplo, seria criada uma função que aceitasse como parâmetro uma string com um nome de utilizador. Utilizando duas árvores XML (i.e. exemplo1.xml e exemplo2.xml) representando informação sobre utilizadores, a função iria retornar os elementos userid da árvore XML exemplo2.xml, associados a utilizadores ocorrendo nas duas árvores XML e que contendo o nome passado como parâmetro.

Os alunos familiarizados com os sistemas gestores de bases de dados (SGBD) relacionais deverão recordar-se do conceito de views e das sua utilização em problemas que envolvam a utilização frequente das mesmas interrogações SQL. Num SGBD relacional, uma view pode ser encarada como uma query à qual se encontra associado um nome. Sempre que se deseje executar a mesma query, poderá ser utilizado o nome da view . Alguns sistemas permitem especificar se uma dada view deve ou não ser materializada, por forma a melhorar a performance de execução na interrogação correspondente.

Em XQuery, a criação de views pode ser feita através dos mesmos mecanismos que permitem a criação de funções. Uma view em XQuery pode ser encarada como uma função que retorne uma determinada árvore XML como resposta. O exemplo que se segue ilustra a criação de views em XQuery:

declare namespace books="uri:books.pt";

declare function books:view() as element(content)* {
for $result in doc("book-catalogue1.xml")//book
return <content>{$result}</content>
};

Para se aceder aos dados da view, poderia ser utilizada a seguinte XPath como parte de uma XQuery.


books:view()


As views XQuery podem ser extremamente úteis em problemas de integração de informação, uma vez que permitem com relativa facilidade a conversão entre esquemas de representação diferentes.

Combinando sequências de elementos com XQuery

A linguagem XQuery permite a combinação de diferentes sequências de elementos XML através dos operadores union, intersect e except. Por exemplo o operador union, o qual pode pode ser usado através de duas representações léxicas diferentes (e.g. | e union) retorna a sequência dos elementos que se encontram em pelo menos uma das sequências fornecidas como entrada. Segue-se um exemplo da sua utilização:

let $l := distinct-values(doc("books.xml")//(author | editor)/last)
order by $l
return <last>{ $l }</last>

É importante referir que os operadores union, intersect e except retornam os elementos em "document order", fazendo a eliminação dos elementos duplicados exactos. Este facto pode ser bastante útil em processos de integração de informação. Segue-se outro exemplo para a utilização do operador union, o qual ordena livros com base no nome do primeiro autor, ou do editor caso o autor não esteja definido.

for $b in doc("books.xml")//book
let $a1 := ($b/author union $b/editor)[1]
order by $a1/last, $a1/first
return $b

Integração de dados através de XQuery

Agora que vimos como definir views em XQuery e como usar operadores da linguagem por forma a agregar diferentes sequências de elementos XML, podemos pensar em como resolver problemas simples de integração de informação. Uma solução genérica de integração de dados com base em XQuery envolve os seguintes passos:

  • Obter a informação das diferentes fontes de dados XML.
  • Definir um formato comum para representar os dados provenientes das diferentes fontes.
  • Usar views XQuery para adaptar os diferentes formatos para um formato comum.
  • Criar novas views XQuery que agreguem os resultados das várias fontes normalizadas, através de operações que combinem as sequências de elementos XML.
É importante referir que a abordagem acima não resolve por sí alguns problemas complexos relacionados com a integração de dados. Cabe à pessoa que define o processo de integração escolher a melhor forma de lidar com desafios tais como:
  • Identificar os mapeamentos entre as diferentes fontes de informação por forma a definir o formato de representação comum.
  • Codificar mecanismos para verificar a integridade dos dados.