XQuery
Helena Galhardas
DEI IST
Agenda


XPath – exercício
XQuery
Exemplo
<bib>
<book> <publisher> Addison-Wesley </publisher>
<author> Serge Abiteboul </author>
<author> <first-name> Rick </first-name>
<last-name> Hull </last-name>
</author>
<author> Victor Vianu </author>
<title> Foundations of Databases </title>
<year> 1995 </year>
</book>
<book price=“55”>
<publisher> Freeman </publisher>
<author> Jeffrey D. Ullman </author>
<title> Principles of Database and Knowledge Base Systems </title>
<year> 1998 </year>
</book>
</bib>
Modelo de dados para XPath
A raíz
bib
book
publisher
Addison-Wesley
O elemento raíz
book
author
. . . .
Serge Abiteboul
Idêntico ao modelo de dados de
XQuery
Expressões simples
/bib/book/year
Resultado: <year> 1995 </year>
<year> 1998 </year>
/bib/paper/year
Resultado: empty
(não existem artigos)
Sumário dos exemplos
bib
elemento bib
*
qualquer elemento
/
root
/bib
bib debaixo de root
bib/paper
paper debaixo de bib
bib//paper
paper bebaixo de bib, a qq profundidade
//paper
paper a qualquer profundidade
paper|book
um paper ou um book
@price
atributo price
bib/book/@price
atributo price em book, em bib
db/book[@price]
books que têm um atributo price
db/book[@price=’10’]
books com price igual a 10
Exercício
Considere um documento XML d que representa uma colecção de CDs. Assuma
que o documento é válido no que diz respeito à seguinte DTD:
<!ELEMENT CDlist ((CD)+)>
<!ELEMENT CD (composer, (performance)+, publisher, (length)?)>
<!ELEMENT performance (composition, (soloist)?, (orchestra, conductor)?)>
<!ELEMENT composer (#PCDATA)>
<!ELEMENT publisher (#PCDATA)>
<!ELEMENT length (#PCDATA)>
<!ELEMENT composition (#PCDATA)>
<!ELEMENT soloist (#PCDATA)>
<!ELEMENT orchestra (#PCDATA)>
<!ELEMENT conductor (#PCDATA)>
Quais as expressões XPath que retornam o seguinte de d, assumindo que o
contexto inicial é o elemento CDlist:
 Todas as composições
 Todas as composições envolvendo um solista
 Todas as execuções com uma orquesta mas sem solista
 Todos os solistas que tocaram com a London Symphony Orchestra num CD
publicado pela Deutsche Grammophon
 Todos os CDs que têm execuções pela London Symphony Orchestra





Todas as composições:
CD/performance/composition
Todas as composições envolvendo um solista:
CD/performance[soloist]/composition
Todas as execuções com uma orquestra mas sem
solista: CD/performance[orchestra and not(soloist)]
Todos os solistas que tocaram com a London
Symphony Orchestra num CD publicado pela
Deutsche Grammophon
CD[publisher="Deutsche Grammophon"]/performance
[orchestra="London Symphony Orchestra"]/soloist
Todos os CDs com execuções pela London Symphony
Orchestra
CD[performance[orchestra="London Symphony
Orchestra"]]
XQuery



Baseado em Quilt: que é um apanhado de
funcionalidades de outras linguagens (por ex., XMLQL)
Desenhado para obedecer aos requisitos
identificados pelo W3C Query Working Group
Linguagem funcional na qual uma interrogação é
uma expressão.


Expressões podem estar completamente aninhadas
Entrada e saída de uma interrogação são
documentos XML, fragmentos de docs XML ou
colecções de docs XML.

Estes podem ser modelados como uma floresta ordenada
de nós.
Principios do XQuery (1)

Fecho


Composição




Definir um modelo de dados e um conjunto de operadores
que é fechado sobre o modelo
XQuery agrupa vários tipos de expressões
Cada expressão pode ser avaliada sem efeitos
secundários
As expressões podem ser compostas com generalidade
Obedece ao esquema


Utilizar XML Schema
Tipos pré-definidos
Principios do XQuery (2)

Compatível com Xpath



Complitude




Adopta XPath como um sub-conjunto sintático
Compatível com XPath 1.0 e 2.0
Tão bom como o modelo relacional
Não existia nenhum standard para as linguagens
hierárquicas
Funções recursivas
Conciso e simples de expressar
Principios do XQuery (2)

Compatível com Xpath



Complitude




Adopta XPath como um sub-conjunto sintático
Compatível com XPath 1.0 e 2.0
Tão bom como o modelo relacional
Não existia nenhum standard para as linguagens
hierárquicas
Funções recursivas
Conciso e simples de expressar
Principios do XQuery (3)

Deve permitir uma análise estática




Fase opcional de análise estática antes de cada
execução de interrogação
Regras de inferência de tipo baseadas em XML
Schema
Permite a detecção de erros durante a
compilação
Facilita a optimização
Expressões de caminho em XML



Baseado na sintaxe abreviada de XPath
Exemplo: quais as figuras com legenda "Tiger" no
segundo capítulo do documento com nome
zoo.xml: document("zoo.xml")/chapter[2]
//figure[caption="Tiger"]
Três passos de localização:



document() encontra o nó raiz do documento
chapter[2] encontra o elemento “2º capítulo” que é filho
da raíz.
//figure[caption="Tiger"] encontra os elementos figure
que ocorrem em qualquer sítio dentro do capítulo, só
devolve aqueles que satisfazem o predicado
Como seguir referências ID?




Operador de “desreferênciação” –> semelhante ao
id() do XPath
Usado para seguir um atributo do tipo IDREF
Retorna os elementos referenciados pelo atributo
Exemplo: quais as legendas de figuras que são
referenciadas por elementos figref (usando o
atributo refid) no capítulo de zoo.xml com título
"Tigers":
document("zoo.xml")/chapter[title="Tigers"]
//figref/@refid->/caption
Bases de dados relacionais
S(sno, sname) - Supplier
P(pno, descrip) - Parts
SP(sno, pno, price) – Supplies Part
Exemplo de um esquema relacional
Interrogação select-project do SQL

Quais os números das peças cuja descrição
contém : “motor”?
Select pno
From P
Where descrip like ‘motor’
Interrogação join SQL
Quais os nomes dos fornecedores e a
descrição das peças que eles fornecem?
Select sname, descrip
From S, P, SP
Where S.sno = SP.sno and P.pno = SP.pno
 Equivalente a:
Select sname, descrip
From (S inner join SP on S.sno = SP.sno)
Inner join P on p.pno = SP.pno

Dados relacionais vistos como dados
em XML
Relacional:
S(sno, sname) - Supplier
P(pno, descrip) - Parts
SP(sno, pno, price) – Supplies Part
XML:
<S>
<s-tuple>
<sno>
<sname>
<P>
<p-tuple>
<pno>
<descrip>
....
Interrogação select-project XQuery
Quais os números cujas descrições contêm
“motor”?
For $p in document(“p.xml”)//p_tuple
Where contains($p/descrip, “motor”)
Return $p/pno
 for...where...return é análogo a
from... where... select
 $p é uma variável que itera sobre p_tuples
 Contains() é um predicado análogo a LIKE

Interrogação join XQuery




Quais os nomes dos fornecedores e a descrição dos produtos
que eles fornecem?
FOR $sp IN document("sp.xml")//sp_tuple,
$p IN document("p.xml")//p_tuple[pno=$sp/pno],
$s IN document("s.xml")//s_tuple[sno=$sp/sno] RETURN
<sp_pair>
$s/sname,
$p/descrip
</sp_pair>
$p itera sobre os p-tuples que contêm elementos pnoque
correspondem a elementos pno em sp-tuples
$s itera sobre s-tuples que contêm elementos sno que
correspondem a elementos sno em sp_tuples
Sp_pair é um elemento constructor
O que é uma interrogação
XQuery?
É uma expressão que:

Lê uma sequência de fragmentos de XML ou de
valores atómicos
 Retorna uma sequência de fragmentos de XML ou de
valores atómicos
Formas principais que uma expressão XQuery pode
tomar:
 Expressões de caminho
 Constructores
 Expressões FLWOR
 Expressões de listas
 Condições
 Expressões quantificadas
 Expressões de tipos de dados
 Funções


Relembrando o exemplo
<bib>
<book> <publisher> Addison-Wesley </publisher>
<author> Serge Abiteboul </author>
<author> <first-name> Rick </first-name>
<last-name> Hull </last-name>
</author>
<author> Victor Vianu </author>
<title> Foundations of Databases </title>
<year> 1995 </year>
</book>
<book price=“55”>
<publisher> Freeman </publisher>
<author> Jeffrey D. Ullman </author>
<title> Principles of Database and Knowledge Base Systems </title>
<year> 1998 </year>
</book>
</bib>
Expressões FLWOR (“Flower”)
FOR ... LET... FOR... LET...
WHERE...
ORDER BY…
RETURN...
Sumário das expressões FLWOR
Exemplo simples
Quais os títulos dos livros publicados depois de
1995:
FOR $x IN doc("bib.xml")/bib/book
WHERE $x/@year > 1995
RETURN $x/title
Resultado:
<title> abc </title>
<title> def </title>
<title> ghi </title>
Distinct
Para cada autor de um livro editado pela Morgan
Kaufmann, listar todos os livros por ele publicados:
FOR $a IN distinct(doc("bib.xml")
/bib/book[publisher=“Morgan Kaufmann”]/author)
RETURN <result>
{ $a,
FOR $t IN /bib/book[author=$a]/title
RETURN $t }
</result>
distinct = função que elimina duplicados
Resultado
<result>
<author>Jones</author>
<title> abc </title>
<title> def </title>
</result>
<result>
<author> Smith </author>
<title> ghi </title>
</result>
Cláusulas FOR e LET

FOR $x in expr -- associa $x a cada valor da
lista dada por expr

LET $x = expr -- associa $x à lista completa
dada por expr

Útil para sub-expressões comuns e agregações
FOR versus LET
FOR
 Associa variáveis de nó (node variables) 
iteração
LET
 Associa variáveis de colecção (collection
variables)  um valor
FOR versus LET (exemplos)
FOR $x IN doc("bib.xml")/bib/book
RETURN <result> { $x } </result>
Retorna:
<result> <book>...</book></result>
<result> <book>...</book></result>
<result> <book>...</book></result>
...
LET $x IN doc("bib.xml")/bib/book
RETURN <result>{ $x } </result>
Retorna:
<result> <book>...</book>
<book>...</book>
<book>...</book>
...
</result>
Exemplo 1: FOR e LET
<big_publishers>
FOR $p IN distinct(doc("bib.xml")//publisher)
LET $b := doc("bib.xml")/book[publisher = $p]
WHERE count($b) > 100
RETURN $p
</big_publishers>
count = função de agregação que retorna o número de
elementos
Exemplo 2: FOR e LET
Quais os livros cujo preço é maior do que a
média dos preços:
LET $a=avg(doc("bib.xml")/bib/book/price)
FOR $b in document("bib.xml")/bib/book
WHERE $b/price > $a
RETURN $b
Junções
<reviews>
<entry>
<title>TCP/IP Illustrated</title>
<rating>5</rating>
<remarks>Excellent technical content. Not much plot.</remarks>
</entry>
</reviews>
for $t in doc("books.xml")//title,
$e in doc("reviews.xml")//entry
where $t = $e/title
return <review>{ $t, $e/remarks }</review>
Ordenação em XQuery

Listar os nomes dos livros por ordem
alfabética
FOR $t IN doc("books.xml")//title
ORDER BY $t
RETURN $t
Diferentes especificações de ordem

Quais os autores ordenados por ordem inversa
do último nome e depois pelo primeiro nome
for $a in doc("books.xml")//author
order by $a/last descending, $a/first descending
return $a
Constructores
Para construir um novo elemento com um nome conhecido e um
conteúdo, usar a sintaxe XML-like:
<book isbn = "12345">
<title>Huckleberry Finn</title>
</book>
 Se o conteúdo do elemento ou atributo tem que ser calculado,
então usar uma expressão aninhada delimitada por { }
<book isbn = "{$x}">
{ $b/title }
</book>
 Se o nome e conteúdo tiverem quer calculados, então usar um
constructor calculado
element { name-expr } { content-expr }
attribute { name-expr } { content-expr }

If-Then-Else
for $b in doc("books.xml")//book
return
<book>
{ $b/title }
{
for $a at $i in $b/author
where $i <= 2
return <author>{string($a/last), ", ",
string($a/first)}</author>
}
{
if (count($b/author) > 2)
then <author>et al.</author>
else () }
</book>
Quantificadores existenciais
FOR $b IN //book
WHERE SOME $p IN $b//para SATISFIES
contains($p, "sailing")
AND contains($p, "windsurfing")
RETURN $b/title
Quantificadores universais
FOR $b IN //book
WHERE EVERY $p IN $b//para SATISFIES
contains($p, "sailing")
RETURN $b/title
Tópicos próximas aulas

XSLT
Referências




Peter Wood, Slides on “Representing and Querying Data
on the Web”,
http://www.dcs.bbk.ac.uk/~ptw/teaching/data-on-theweb.html.
Dan Suciu, Slides on “The semistructured data model”,
CSE 590ds: Management of XML and Semistructured
Data,
http://www.cs.washington.edu/education/courses/cse590
ds/01sp/
www.w3.org/XML/Query
W3C's working group on XML query languages
www.perfectxml.com/XQuery.html
XQuery: A Guided Tour (book chapter from XQuery from
the Experts)
Download

Slide 1