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
Download

slides1