View
216
Download
0
Embed Size (px)
Citation preview
Unidade 3- Consulta a dados semi-estruturados
Requisitos desejáveis (Maier ’98)
Expressividade– linguagem de consulta ao estilo SQL – possibilitar a restruturação de dados semi-estruturados
Semântica precisa– muito importante para XML
Composição– o resultado de uma consulta deve poder ser utilizado dentro
de uma outra consulta Consulta ao esquema
– visando otimização Facilitar a geração automática de consultas
Consulta
Expressões de caminho (Path expressions)
Expressões que permitem navegar no grafo de dados Expressões de caminho simples
– sequências de labels– exemplos
root.pessoas {&p1,&p2,&p3}root.pessoas.filhos {&p2,&p3}
– semântica o resultado de uma expressão de caminho r.l1. … .ln, onde l1,
…,ln são os labels e r um objeto, é o conjunto de nodos do grafo acessíveis de r por um caminho do grafo tal que os arcos percorridos passam sucessivamente pelos labels l1,…,ln.
Consulta
Expressões de caminho
Expressões de caminho generalizadas Idéia: além de especificar completamente um caminho, permite
exprimir restrições (constraints) sobre o caminho Utilização de expressões regulares Exemplos
_ é um caracter coringa que designa um label qualquer(pessoa|estudante)._.idade
As expressões de caminho definidas até o presente retornam os conjuntos de objetos e não de dados semi-estruturados
Consulta
LOREL: uma linguagem de consultas para dados semi-estruturadoss
Dados exemplo
Consulta
&bibdb
&n1
&n2
&n3paper
book
bookbiblio
Rouxauthorauthor Combalusierdate 1976title Database
systems
Smithauthor
date 1999title Database
systems
LOREL
Sintaxe baseada em OQL Exemplo
select author:Xfrom biblio.book.author X
Semântica– para cada nodo do conjunto biblio.book.author
X toma o valor deste nodo cria um nodo de label author e de valor X
Resultado{author:"Roux", author:"Combalusier", author:"Smith"}
Consulta
Query 1: SELECT author: XFROM biblio.book.author X
&o1
&o12 &o24 &o29
&96&30
paper bookbook
authordate
titleauthor
authordate
title
biblio
&o47 &o48 &o50
&o52 &25
Smith 1999 DatabaseSystems
Roux Combalusier1976
DatabaseSystems
. . .
resposta
author
authorauthor
Resposta ={author: “Smith”, author: “Roux”, author: “Combalusier”}
LOREL
Restrição dentro da cláusula where Exemplo
select row:Xfrom biblio._ Xwhere "Smith" in X.author
Resultado{row:{
author:"Smith", date:1999, title:"Database systems" } }
Observações– X.author é uma expressão de caminho– X.author é um conjunto de valores, "Smith" in X.author é um
predicado de pertinência a um conjunto
Consulta
Query 2:SELECT row: XFROM biblio._ XWHERE “Smith” in X.author
&o1
&o12 &o24 &o29
&96&30
paper bookbook
authordate
titleauthor
authordate
title
biblio
&o47 &o48 &o50
&o52 &25
Smith 1999 DatabaseSystems
Roux Combalusier1976
DatabaseSystems
. . .
resposta
row
row
. . .resposta ={row: {author:“Smith”, date: 1999, title: “Database…”}, row: …}
LOREL
Restrições dentro da cláusula where Exemplo
select author:Yfrom biblio._ X, X.author Y, X.title Zwhere Z matches "*[D|d]atabase*"
Resultado– retorna os autores de publicações cujo título contém a palavra "database".
Tratamento de uma consulta select-from-where– três momentos:
determinação do conjunto de valores definido dentro da cláusula from restrição deste conjunto com a cláusula definida dentro do where projeção dentro da cláusula select
Consulta
LOREL
Criação de vários nodos dentro da projeçãoselect row:{title:Y, author:Z}from biblio.book X, X.title Y, X.author Z
Composição de consultasselect row:{ select author:Y from X.author Y}from biblio.book X
Lorel também permite o uso de expressões de caminho na cláusula select:
select X.authorfrom biblio.book X
Consulta
Query 3:SELECT row: ( SELECT author: Y FROM X.author Y)FROM biblio.book X
&o1
&o12 &o24 &o29
&96&30
paper bookbook
authordate
titleauthor
authordate
title
biblio
&o47 &o48 &o50
&o52 &25
Smith 1999 DatabaseSystems
Roux Combalusier1976
DatabaseSystems
. . .
resposta
row
row
&a1
&a2author
authorauthor
Resposta ={row: {author:“Smith”}, row: {author:“Roux”, author:“Combalusier”,},}
LOREL
Outro exemplo de composiçãoselect row:{ select author:Y, title:T
from X.author Y X.title T}
from biblio.book Xwhere "Roux" in X.author
Consulta
Query 4:SELECT ( SELECT row: {author: Y, title: T} FROM X.author Y, X.title T)FROM biblio.book XWHERE “Roux” in X.author
&o1
&o12 &o24 &o29
&96&30
paper bookbook
authordate
titleauthor
authordate
title
biblio
&o47 &o48 &o50
&o52 &25
Smith 1999 DatabaseSystems
Roux Combalusier1976
DatabaseSystems
. . .
resposta
row
row
&a1
&a2author
author title
Resposta ={row: {author:“Roux”, title: “Database…”}, row: {author:“Combalusier”, title: “Database…”},}
(Query está errada no livro texto)
title
LOREL
Semântica dos predicados de comparaçãoselect a:A, c:Cfrom r1.row X, r2.row Y, X.a A, X.b B, Y.b B', Y.c Cwhere B=B'
– se r1 e r2 são representações de relações, esta consulta calcula a junção natural destas relações sobre os atributos b.
– Dentro do contexto semi-estruturado, certos valores de B ou B' podem ser multi-valorados
Consulta
LOREL
Comparações de valoresselect row:Xfrom biblio.paper Xwhere X.author = "Smith"
– X.author é um conjunto de objetos, "Smith" é um valor atômicowhere exists Y in X.author : Y="Smith"
select row:Xfrom biblio.paper Xwhere X.year>1993
Consultas
Lorel
Pequenas diferenças sintáticas na expressões de caminho (% ao invés de _, # ao invés de _*)
Convenção de caminho:
torna-se:
SELECT biblio.book.authorFROM biblio.bookWHERE biblio.book.year = 1999
SELECT X.authorFROM biblio.book XWHERE X.year = 1999
Lorel
Variáveis existenciais:
– O que acontece com livros com múltiplos autores? Author é existencialmente quantificado:
SELECT biblio.book.yearFROM biblio.bookWHERE biblio.book.author = “Roux”
SELECT biblio.book.yearFROM biblio.book X, X.author YWHERE Y = “Roux”
UnQL
Patterns:
Equivalente a:
SELECT row: XWHERE {biblio.book: {author “Roux”, title X}} in DB,
SELECT row: XFROM biblio.book Y, Y.author Z, Y.title XWHERE Z=“Roux”
UnQL
Variávels Label:– “encontre todos os tipos de publicação e seus
títulos onde Roux é autor”
SELECT row: {type: L, title : Y}WHERE {biblio.L: {author “Roux”, title X}} in DB,
Bases de dadoss semi-estruturados
O sistema LORE
O sistema LORE
LORE: Lightweight Object Repository Um SGBD para dados semi-estruturados Desenvolvido em Stanford Utiliza o modelo OEM
LORE
ArquiteturaLORE
Compilação de consultas
Data Engine
Armazenamento físico
gerente de dados externos
gerentede índicesoperadores
físicos
gerentede objetos
parser préprocessador gerador deplanos de consultas
optimizadorde consultas
A P I
GUI Applications
consultas
Linguagem de Consulta
XML-QL
XML-QL
Primeira linguagem declarativa para XML Como obter uma query language para XML
rapidamente ?– Assumir OEM como modelo de dados– Usar características de UnQL e StruQL
Patterns Templates
– Projetar uma sintaxe XML-like
Patterns em XML-QL
WHERE <book> <publisher> <name> Morgan Kaufmann </> </> <author> $A </> </book> in “www.a.b.c/bib.xml”CONSTRUCT <author> $A </>
Encontre todos os autores que publicaram pela Morgan Kaufmann:
Abreviação: </> fecha qualquer tag.
Exemplo2
Encontre os autores e títulos dos livros da AWL
where <book> <publisher> <name> AWL </> </> <title> $T </> <author> $A </></> in “www.a.b.c/bib.xml”
construct <resultado><author> $A </><title> $T </>
</>
Resultado do Exemplo2
<resultado><author> Ceri </author><title> Active Database System </title>
</resultado><resultado>
<author> Widom </author><title> Active Database System </title>
</resultado><resultado>
<author> ... </author><title> ... </title>
</resultado>
Patterns em XML-QL
where <book language=$X> <author> Jones </author>
</book> in “www.a.b.c/bib.xml”construct <result> $X </>
Encontre as linguagens nas quais Jones têm publicado:
Construtores em XML-QL
where <book language = $L> <author> $A </> </> in “www.a.b.c/bib.xml”construct <result> <author> $A </> <lang> $L </> </>
Resultado:<result> <author>Smith</author> <lang>English </lang> </result><result> <author>Smith</author> <lang>French</lang> </result><result> <author>Doe </author> <lang>English </lang> </result>. . . .
Encontre todos os autores e as linguagens nas quais eles publicaram:
Consultas aninhadas em XML-QL
WHERE <book.author> $A </> in “www.a.b.c/bib.xml”CONSTRUCT <result> <author> $A </> WHERE <book language = $L> <author> $A </> </> in “www.a.b.c/bib.xml” CONSTRUCT <lang> $L </> </>
Encontre os autores e as linguagens nas quais eles publicaram; agrupando por autores:
Obs: book.author é uma expressão de caminho
<result> <author>Smith</author> <lang>English</lang> <lang>French</lang> <lang>…</lang> …</result><result> <author>Doe</author> <lang>English</lang> …</result>
Resultado:
Junção em XML-QL
WHERE <article> <author> $a </>
</> CONTENT_AS $p in “www.a.b.c/bib.xml” <book language = $L>
<author > $a </></> in “www.a.b.c/bib.xml”,$L = “English”
CONSTRUCT <result> $p </>
Encontre os artigos que têm pelo menos um autor que também escreveuum livro em inglês
Variáveis Tag em XML-QL
WHERE <$p> <title> $t </> <year> 2000 </><$e> Carlos </>
</> in “www.a.b.c/bib.xml”, <$e> in {author, editor} CONSTRUCT <$p>
<title> $t </> <$e> Carlos </> </>
Encontre as publicações publicadas em 2000 nas quais Carlos é um autor ou editor
Path Expressions em XML-QL
Seja o DTD:<!ELEMENT peca (nome fabricante peca*) ><!ELEMENT nome CDATA><!ELEM fabricante CDATA>
A consulta: “Encontre os nomes da peças que contêm um fabricante “Ford” sem considerar o nível de aninhamento em que a peça occorre:
WHERE <peca*> <nome> $r </> <fabricante> Ford </> in “www.a.b.c/pecas.xml”
CONSTRUCT <resultado> $r </>
Path Expressions em XML-QL
No exemplo anterior peca* é uma expressão de caminho regular que éequivalente à seguinte sequência infinita de patterns:
<nome> $r </> <fabricante> Ford</> <peca> <nome> $r </> <fabricante> Ford</> </><peca> <peca> <nome> $r </> <fabricante> Ford</> </> </><peca> <peca> <peca> <nome> $r </> <fabricante> Ford</> </> </>...
Path Expressions em XML-QL
A consulta a seguir ilustra o uso de alternativa (|), concatenação(.)e asterisco(*) em expressões regulares:
WHERE <peca+.(subpeca|componente.parte)> $r </>IN “www.a.b.c/peca.xml”
CONSTRUCT <resultado> $r </>
Integrando dados de diferentes fontes XML
Encontre os nomes e CPF das fontes www.receita.gov.br/contribuintes.xml e www.ufpb.br/professores.xml
WHERE <professores><nome> $n </><cpf> $c </>
</> IN “www.ufpb.br/professores.xml”, <contribuintes>
<cpf> $c </><imposto> $i </>
</> IN “www.receita.gov.br/contribuintes.xml”CONSTRUCT <resultado> $n $i </>
Linguagem de Consulta
X-Query
XQuery
Baseda em Quilt (que é baseda em XML-QL)
http://www.w3.org/TR/xquery/2/2001 XML Query data model
FLWR (“Flower”) Expressions
FOR ... LET... WHERE...RETURN...
XQuery
Encontre os títulos dos livros publicados após 1995:
FOR $x IN document("bib.xml")/bib/book
WHERE $x/year > 1995
RETURN $x/title
Resultado: <title> abc </title> <title> def </title> <title> ghi </title>
XQueryPara cada autor de um livro publicado pela
Morgan Kaufmann, listar os livros publicados:
FOR $a IN distinct(document("bib.xml") /bib/book[publisher=“Morgan Kaufmann”]/author)
RETURN <result>
$a,
FOR $t IN /bib/book[author=$a]/title
RETURN $t
</result>
distinct = elimina duplicatas
XQuery
Resultado: <result> <author>Jones</author> <title> abc </title> <title> def </title> </result> <result> <author> Smith </author> <title> ghi </title> </result>
XQuery
FOR $x in expr -- liga $x a cada valor na lista expr
LET $x = expr -- liga $x à inteira lista expr– Usado para subexpressões comuns e para
agregações
XQuery
count = função (aggregate) que retorna o número de elementos
<big_publishers> FOR $p IN distinct(document("bib.xml")//publisher) LET $b := document("bib.xml")/book[publisher = $p] WHERE count($b) > 100 RETURN $p </big_publishers>
XQuery
Encontre os livros cujos preços são maiores do que a média de preços:
FOR $b in document("bib.xml")/bib/book
LET $a=avg(document("bib.xml")/bib/book/price)
WHERE $b/price > $a
RETURN $b
XQuery
Sumário: FOR-LET-WHERE-RETURN = FLWR
FOR/LET Clauses
WHERE Clause
RETURN Clause
Lista de tuplas
Lista de tuplas
Instância do modelo de dados Xquery
FOR versus LET
FOR liga variáveis nodo iteration
LET liga variáveis coleção one value
FOR versus LET
FOR $x IN document("bib.xml")/bib/book
RETURN <result> $x </result>
Retorna: <result> <book>...</book></result> <result> <book>...</book></result> <result> <book>...</book></result> ...
LET $x IN document("bib.xml")/bib/book
RETURN <result> $x </result>
Retorna: <result> <book>...</book> <book>...</book> <book>...</book> ...</result>
Coleções em XQuery
Conjuntos e Bags– /bib/book/author = uma coleção do tipo Bag – Distinct(/bib/book/author) = uma coleção do tipo conjunto (Set)
LET $a = /bib/book $a é uma coleção $b/author uma coleção (vários autores...)
RETURN <result> $b/author </result>Retorna: <result> <author>...</author> <author>...</author> <author>...</author> ...</result>
Ordenação em XQuery
<publisher_list> FOR $p IN distinct(document("bib.xml")//publisher) RETURN <publisher> <name> $p/text() </name> , FOR $b IN document("bib.xml")//book[publisher = $p] RETURN <book> $b/title , $b/price </book> SORTBY(price DESCENDING) </publisher> SORTBY(name) </publisher_list>
Argumentos de sort referem-se ao namespace da cláusula RETURN e não da cláusula FOR
If-Then-Else
FOR $h IN //holding
RETURN <holding>
$h/title,
IF $h/@type = "Journal"
THEN $h/editor
ELSE $h/author
</holding> SORTBY (title)
Quantificador Existencial
FOR $b IN //book
WHERE SOME $p IN $b//para SATISFIES
contains($p, "sailing")
AND contains($p, "windsurfing")
RETURN $b/title
Quantificador Universal
FOR $b IN //book
WHERE EVERY $p IN $b//para SATISFIES
contains($p, "sailing")
RETURN $b/title