XQuery (1ª parte) Gestão e Tratamento da Informação DEI IST (baseado nos slides de Ioana Manolescu, acessíveis em: http://www-rocq.inria.fr/~abitebou/Master-SSD/slxquery.pdf ) Agenda Aspectos básicos Modelo de dados XQuery Porquê XQuery? Príncipios fundamantais Modelo simples para colecções de documentos Sequências Items Aspectos sintáticos do XQuery Formulação de interrogações Preliminares Expressões FLOWR Porquê XQuery? XQuery, a linguagem de interrogações de XML promovida pelo W3C. http://www.w3.org/XML/Query Verificar as interrogações online (análise sintática): http://www.w3.org/2005/qt-applets/xqueryApplet.html Interrogações de exemplo: http://www.w3.org/TR/xquery-use-cases/ XQuery vs XSLT XSLT é uma linguagem procedimental, adequada para transformar documentos XML XQuery é uma linguagem declarativa, adequada para aceder de forma eficiente ao conteúdo de grandes colecções de documentos. Nota: Nalguns casos, XSLT e XQuery podem ambos ser usados. A escolha tem a ver com uma questão de contexto ou de gosto. Príncipios fundamentais O desenho do XQuery satisfaz as regras seguintes: Avaliação “Closed-form”: XQuery assenta sobre um modelo de dados, e cada interrogação mapeia uma instância do modelo noutra instância do modelo. Composição. XQuery assenta sobre expressões que podem ser compostas para formar interogações arbitrariamente ricas. Type awareness. XQuery pode associar um esquema XSD à interpretação de uma interrogação, mas tb opera com documentos sem esquema. Compatibilidade com XPath: XQuery é uma extensão de XPath 2.0. Assim, qualquer expressão XPath é tb uma expressão XQuery Análise sintática: inferência de tipos, re-escrita, optimização. O objectivo é explorar a natureza declarativa do XQuery para uma avaliação das interrogações mais inteligente. Do ponto de vista da sintaxe, XQuery pretende ser simultaneamente concisa e simples. Agenda Aspectos básicos Modelo de dados XQuery Porquê XQuery? Príncipios fundamantais Modelo simples para colecções de documentos Sequências Items Aspectos sintáticos do XQuery Formulação de interrogações Preliminares Expressões FLOWR Modelo simples para colecções de documentos Um valor é uma sequência de 0 ou n items Um item é um nó ou um valor atómico Existem 7 tipos de nós: Document, a raíz do documento Element, com nome, que denota a estrutura do documento Attributes, com nome e valor, associados a um elemento Text, sem nome e com valor Comment; ProcessingInstruction; Namespace. O modelo é bastante genérico: tudo é uma sequência de items. Isto cobre qualquer coisa, desde um único valor inteiro até grandes colecções de documentos XML. Exemplos de valores Os seguintes são exemplos de valores: 47 : uma sequência com um único item (valor atómico) </a> : uma sequência com um único item (nó Element) (1, 2, 3) : uma sequência com três valores atómicos (47, <a/>, ``Hello'') : uma sequência com três items, cada um com um tipo diferente () a sequência vazia Um documento XML Muitos documentos XML (uma colecção) Sequências: detalhes Não existe diferença entre um item e uma sequência de tamanho 1 => tudo é uma sequência Uma sequência não pode ser aninhada uma sequência nunca contém outra sequência A noção de valor null não existe no modelo XQuery um valor ou está lá, ou não está. Uma sequência pode ser vazia. Uma sequência pode conter items heterógeneos As sequências são ordenadas: duas sequências com o mesmo conjunto de items, mas ordenadas de maneira diferente, são diferentes Items: detalhes Os nós têm uma identidade; os valores não têm Element e Attribute têm anotações de tipo, que podem ser inferidas a partir do esquema XSD (ou desconhecidas se o esquema não fôr fornecido) Os nós aparecem com uma determinada ordem nos seus documentos. A ordem dos atributos é indefinida. Aspectos sintáticos do XQuery XQuery constrói as interrogações como composição de expressões Uma expressão produz um valor e não tem efeitos colaterais: não existe modificação no contexto, em particular nos valores de variáveis. Os comentários em XQuery podem ser colocados em qualquer lado. Sintaxe: (: This is a comment :) Agenda Aspectos básicos Modelo de dados XQuery Porquê XQuery? Príncipios fundamantais Modelo simples para colecções de documentos Sequências Items Aspectos sintáticos do XQuery Formulação de interrogações Preliminares Expressões FLOWR Contexto de avaliação de interrogações Uma expressão é sempre avaliada com respeito a um contexto. Informação usada para analisar a expressão e avaliá-la. Incluí: – Correspondências (bindings) entre prefixos de namespaces e URIS de namespaces – Correspondências de valores (bindings) para variáveis – Funções – Um conjunto de colecções disponíveis e uma colecção por omissão – Data e Tempo – Nó de contexto corrente – Posição do nó de contexto na sequência de contexto – Tamanho da sequência Expressões XQuery Uma expressão aceita um valor (uma sequência de items) e retorna um valor As expressões podem tomar várias formas: Expressões de caminho (path expressions) Constructores Expressões FLOWR; Expressões com listas Condições Expressões quantificadas Expressões com tipos de dados Funções Expressões simples Os valores são expressões: Literais: 'Hello', 47, 4.7, 4.7E+2 Valores construídos: date(`2008-03-15'), true(), false() Variáveis: $x Sequências construídas: (1, (2, 3), (), (4, 5)) ou (1, 2, 3, 4, 5) ou 1 to 5. Um documento XML é também uma expressão. <employee empid="12345"> <name>John Doe</name> <job>XML specialist</job> <deptno>187</deptno> <salary>125000</salary> </employee> O resultado destas expressões são as próprias expressões! Obter documentos e colecções Uma interrogação aceita, em geral, como entrada uma ou mais sequências de documentos XML, chamadas colecções XQuery identifica as suas entradas com as seguintes funções: document() aceita a URI de um documento XML e retorna uma única ávore de documento collection() aceita uma URI e retorna uma sequência O resultado da função document() é o nó raiz da árvore de documento, e o seu tipo é Document Acerca de XPath Qualquer expressão XPath é uma interrogação. A expressão XPath seguinte retorna todos os títulos de filmes na colecção filmes (para filmes publicados em 2005): collection('movies ')/ movie [ year =2005]/ title O resultado é uma sequência de nós title: <title >A History of Violence </ title > <title >Match Point </ title > Nota: A expressão XPath é avaliada para cada item (document) na sequência retornada por collection('movies') Constructores O XQuery permite a construção de novos elementos, cujo conteúdo pode misturar etiquetas, valores e resultados de expressões XQuery <titles > { collection('movies ')//title } </ titles > As expressões podem ser usadas em qualquer nível da interrogação, e um constructor pode incluir várias expressões Nota: Uma expressão tem que ser delimitada por chavetas {} de modo a ser reconhecida e processada Constructores: outros exemplos Outros constructores de elementos: <chapter ref="[{1 to 5, 7, 9}]"> É o mesmo que: <chapter ref="[1 2 3 4 5 7 9]"> <chapter ref="[1 to 5, 7, 9]"> O constructor: <paper>{ $myPaper/@id }</paper> Cria um elemento da forma: <paper id="271"></paper> Variáveis Uma variável é um nome que se refere a um valor. Pode ser usada em qualquer expressão (incluindo a identidade) no seu âmbito. <employee empid ="{$id}"> <name>{ $name }</name> { $job } <deptno>{ $deptno }</deptno> <salary>{ $SGMLspecialist +100000} </salary> </employee> Às variáveis $id, $name, $job, $deptno, $SGMLspecialist têm que corresponder valores Expressões FLOWR As mais poderosas expressões em XQuery. Uma expressão FLOWR (“flower”): Itera sobre sequências (for) Define e faz corresponder valores a variáveis (let) Ordena o resultado (order); Aplica predicados (where); Constrói um resultado (return). Um exemplo (sem let nem order): for $m in collection('movies')/movie where $m/year >= 2005 return <film>{ $m/ title/text()} , " directed by " {$m/director/last_name /text()} </film> Expressões FLOWR e XPath Na sua forma mais simples, uma expressão FLWR consiste numa alternativa às expressões XPath Exemplo: let $year:=1960 for $a in document(“SpiderMan.xml”)//actor where $a/birth_date >= $year return $a/last_name É equivalente à expressão XPath: //actor[birth_date>=1960]/last_name Nem todas as expressões FLOWR podem ser reescritas com XPath. As claúsulas for e let Ambas as claúsulas fazem corresponder valores a variáveis. Mas: for faz corresponder à variável, cada item da sequência de entrada for $x in /company/employee faz corresponder cada empregado a $x, para cada item na sequência company. let faz corresponder à variável, a sequência de entrada inteira: let $x := /company/employee atribuí a $x todos os empregados da companhia É de notar que for pode iterar sobre uma sequência heterógenea: for $a in document("Spider-Man.xml")//* where $a/birth_date >= 1960 return $a/last_name Aqui, a $a, vão sendo atribuídos todos os elementos do documento Um exemplo FLOWR complexo Devolver a descrição e preço médio de cada peça vermelha que tem, pelo menos, 10 encomendas (supôr as colecções parts.xml e orders.xml): for $p in doc("parts.xml")//part[color="Red"] let $o:=doc("orders.xml")//order[partno=$p/partno] where count($o) >= 10 order by count($o) descending return <important_red_part> { $p/ description } <avg_price> {avg($o/price)} </avg_price> </important_red_part> for + return = uma expressão! A combinação de for e return define uma expressão: for define a sequência de entrada, return define a sequência de saída Um ciclo simples: for $i in (1 to 10) return $i Ciclos aninhados: for $i in (1 to 10) return for $j in (1 to 2) return $i*$j Variante sintáctica: for $i in (1 to 10) , $j in (1 to 2) return $i*$j Combinação de ciclos: for $i in (for $j in (1 to 10) return $j*2) return $i*3 Definição de variáveis com let let faz corresponder um nome a um valor, ou seja a uma sequência obtida por um meio conveniente, que pode incluir desde literais a interrogações complexas. let $m:=document("movies/Spider-Man.xml")/movie return $m/director/last_name Uma variável é só um sinónimo para o seu valor let $m:=document("movies/Spider-Man.xml")/movie for $a in $m/ actor return $a/last_name O âmbito (scope) de uma variável é o da expressão FLWR em onde está definida. As variáveis não podem ser redefinidas ou actualizadas dentro do seu âmbito. A claúsula where A claúsula where é bastante semelhante ao seu sinónimo em SQL A diferença reside na estrutura muito mais flexível dos documentos XML. Exemplo:Quais os filmes dirigidos por M. Allen? for $m in collection("movies")/movie where $m/director/last_name ="Allen" return $m/title Parece-se com uma interrogação SQL? Sim, mas os predicados são interpretados de acordo com as regras XPath, ou seja: 1. Se um caminho (path) não existe, o resultado é falso e não existe nenhum erro de tipos. 2. Se uma expressão de caminho retorna vários nós, o resultado é verdadeiro desde que exista pelo menos uma correspondência com o valor procurado Ex: Quais os filmes com Kirsten Dunst (nota: existem vários actores por filme) for $m in collection("movies")/movie where $m/actor/last_name =“Dunst" return $m/title A claúsula return return é uma claúsula obrigatória de uma expressão FLWR. É instanciada uma vez para cada correspondência da variável na claúsula for. Ex: for $m in collection("movies")/movie let $d := $m/director where $m/actor/last_name ="Dunst" return <div > {$m/ title/text(), " directed by", $d/first_name/text(), $d/last_name/text()} , " with ", <ol > {for $a in $m/ actor return <li >{$a/ first_name , $a/ last_name ," as ", $a/ role }</li > } </ol > </div > Referências www.perfectxml.com/XQuery.html XQuery: A Guided Tour (book chapter from XQuery from the Experts) Ioana Manolescu, slides about XQuery, course about “Web Data Management and Distribution”, Master Recherche Informatique Paris Sud, http://www- rocq.inria.fr/~abitebou/Master-SSD/slxquery.pdf