Upload
arthur-caminha-chaplin
View
232
Download
0
Embed Size (px)
Citation preview
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
bib
book book
publisher author . . . .
Addison-Wesley Serge Abiteboul
A raíz
O elemento raíz
Idêntico ao modelo de dados de XQuery
Expressões simples
/bib/book/yearResultado: <year> 1995 </year> <year> 1998 </year>
/bib/paper/yearResultado: empty (não existem artigos)
Sumário dos exemplosbib elemento bib * qualquer elemento/ root/bib bib debaixo de rootbib/paper paper debaixo de bibbib//paper paper bebaixo de bib, a qq profundidade//paper paper a qualquer profundidadepaper|book um paper ou um book@price atributo price bib/book/@price atributo price em book, em bibdb/book[@price] books que têm um atributo pricedb/book[@price=’10’] books com price igual a 10
ExercícioConsidere 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., XML-QL)
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
Definir um modelo de dados e um conjunto de operadores que é fechado sobre o modelo
Composição 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
Adopta XPath como um sub-conjunto sintático Compatível com XPath 1.0 e 2.0
Complitude 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
Adopta XPath como um sub-conjunto sintático Compatível com XPath 1.0 e 2.0
Complitude 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) - SupplierP(pno, descrip) - PartsSP(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 pnoFrom PWhere descrip like ‘motor’
Interrogação join SQL
Quais os nomes dos fornecedores e a descrição das peças que eles fornecem?
Select sname, descripFrom S, P, SPWhere S.sno = SP.sno and P.pno = SP.pno Equivalente a:Select sname, descripFrom (S inner join SP on S.sno = SP.sno)Inner join P on p.pno = SP.pno
Dados relacionais vistos como dados em XMLRelacional:
S(sno, sname) - SupplierP(pno, descrip) - PartsSP(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_tupleWhere 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>
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>
DistinctPara 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
count = função de agregação que retorna o número de elementos
<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>
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
for $t in doc("books.xml")//title, $e in doc("reviews.xml")//entry where $t = $e/title return <review>{ $t, $e/remarks }</review>
<reviews> <entry> <title>TCP/IP Illustrated</title> <rating>5</rating> <remarks>Excellent technical content. Not much plot.</remarks> </entry>
</reviews>
Ordenação em XQuery
FOR $t IN doc("books.xml")//title ORDER BY $tRETURN $t
Listar os nomes dos livros por ordem alfabética
Diferentes especificações de ordem
for $a in doc("books.xml")//author order by $a/last descending, $a/first descendingreturn $a
Quais os autores ordenados por ordem inversa do último nome e depois pelo primeiro nome
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 calculadoelement { name-expr } { content-expr }attribute { name-expr } { content-expr }
If-Then-Elsefor $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
Referências Peter Wood, Slides on “Representing and Querying Data
on the Web”, http://www.dcs.bbk.ac.uk/~ptw/teaching/data-on-the-web.html.
Dan Suciu, Slides on “The semistructured data model”, CSE 590ds: Management of XML and Semistructured Data, http://www.cs.washington.edu/education/courses/cse590ds/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)