xquery (1ª parte) helena galhardas dei ist (baseado nos slides de ioana manolescu, acessíveis em:...
TRANSCRIPT
XQuery (1ª parte)
Helena GalhardasDEI IST
(baseado nos slides de Ioana Manolescu, acessíveis em:
http://www-rocq.inria.fr/~abitebou/Master-SSD/slxquery.pdf)
Agenda
Aspectos básicos Porquê XQuery? Príncipios fundamantais
Modelo de dados XQuery 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 fundamentaisO 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 Porquê XQuery? Príncipios fundamantais
Modelo de dados XQuery 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 documentosUm valor é uma sequência de 0 ou n itemsUm item é um nó ou um valor atómicoExistem 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 valoresOs 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: detalhesNã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: detalhesOs 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 XQueryXQuery é uma linguagem case-sensitive: as palavras
chave têm que ser escritas em letra minúscula
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 Porquê XQuery? Príncipios fundamantais
Modelo de dados XQuery 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çõesUma expressão é sempre avaliada com respeito a um contexto. Informação usada para analisar a expressão e avaliá-la. É uma ligeira generalização dos contextos XPath e XSLT, e incluí:
Correspondências (bindings) entre prefixos de namespaces e URIS de namespaces
Correspondências de valores (bindings) para variáveis Funções in-scope 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 XQueryUma expressão aceita um valor (uma sequência de
items) e retorna um valorAs 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 simplesOs 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)), equiv. to (1, 2, 3,
4, 5), equiv. to 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çõesUma 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 XPathQualquer 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')
ConstructoresO 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 exemplosOutros 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áveisUma 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 FLOWRAs 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')/moviewhere $m/year >= 2005return<film>{ $m/ title/text()} ," directed by " {$m/director/last_name /text()}</film>
Expressões FLOWR e XPathNa sua forma mais simples, uma expressão FLWR
consiste numa alternativa às expressões XPath Exemplo:let $year:=1960for $a in document(“SpiderMan.xml”)//actorwhere $a/birth_date >= $yearreturn $a/last_name
É equivalente à expressão XPath: //actor[birth_date>=1960]/last_name
Nem todas as expressões FLOWR podem ser reescritas com XPath.
Um exemplo FLOWR complexoDevolver 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) >= 10order by count($o) descendingreturn<important_red_part>{ $p/ description }<avg_price> {avg($o/price)} </avg_price></important_red_part>
As claúsulas for e letAmbas 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 >= 1960return $a/last_name
Aqui, a $a, vão sendo atribuídos todos os elementos do documento
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 letlet 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")/moviereturn $m/director/last_name
Uma variável é só um sinónimo para o seu valor
let $m:=document("movies/Spider-Man.xml")/moviefor $a in $m/ actorreturn $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 whereA claúsula where é bastante semelhante ao seu sinónimo em SQLA 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")/moviewhere $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 many )for $m in collection("movies")/moviewhere $m/actor/last_name =“Dunst"return $m/title
A claúsula returnreturn é 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")/movielet $d := $m/directorwhere $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
Tópicos próximas aulas
XQuery Update