Unidade 3- Consulta a dados semi-estruturados. Requisitos desejáveis (Maier ’98) Expressividade...

Post on 07-Apr-2016

214 views 0 download

Transcript of Unidade 3- Consulta a dados semi-estruturados. Requisitos desejáveis (Maier ’98) Expressividade...

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