xquery (1ª parte) - autenticação · avaliação “closed-form”: xquery assenta sobre um...

28
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 )

Upload: dinhthuan

Post on 27-Jan-2019

217 views

Category:

Documents


0 download

TRANSCRIPT

XQuery (1ª parte)

Gestão e Tratamento da InformaçãoDEI 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 XQueryAná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 itens heterogéneos

As sequências são ordenadas: duas sequências com o mesmo conjunto de itens, 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 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 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.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 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) Construtores 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)) 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çõ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 documentocollection() 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')

ConstrutoresO 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]">O constructor:<paper>{ book[2]/@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.

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

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>

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)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