Unidade 3- Consulta a
dados semi-estruturados
Consulta
Requisitos desejáveis (Maier ’98)

Expressividade
–
–

Semântica precisa
–

o resultado de uma consulta deve poder ser utilizado dentro
de uma outra consulta
Consulta ao esquema
–

muito importante para XML
Composição
–

linguagem de consulta ao estilo SQL
possibilitar a restruturação de dados semi-estruturados
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
root.pessoas.filhos
–
{&p1,&p2,&p3}
{&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
&n1
author
author
date
title
book
author
db
biblio
&bib
book
&n2
paper
&n3
date
title
Roux
Combalusier
1976
Database
systems
Smith
1999
Database
systems
Consulta
LOREL


Sintaxe baseada em OQL
Exemplo
select author:X
from 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"}
SELECT author: X
FROM biblio.book.author X
Query 1:
resposta
biblio
&o1
paper
book
book
author
author
&o12
&o24
&o29
...
title
author
author
date
title
author
&o52
&o47
Smith
&o48
1999
&o50
author
&96
date
&25
1976
Roux Combalusier
Database
Systems
Resposta =
{author: “Smith”,
author: “Roux”,
author: “Combalusier”}
&30
Database
Systems
Consulta
LOREL


Restrição dentro da cláusula where
Exemplo
select row:X
from biblio._ X
where "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
SELECT row: X
FROM biblio._ X
WHERE “Smith” in X.author
Query 2:
row
biblio
. . .
&o1
paper
&o12
book
book
&o24
title
author
date
title
author
&o52
&o47
Smith
&o48
1999
resposta =
{row: {author:“Smith”,
date: 1999,
title: “Database…”},
row: …
}
row
&o29
...
author
resposta
&o50
&96
date
&25
1976
Roux Combalusier
Database
Systems
&30
Database
Systems
Consulta
LOREL


Restrições dentro da cláusula where
Exemplo
select author:Y
from biblio._ X,
X.author Y,
X.title Z
where 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ção
select row:{title:Y, author:Z}
from biblio.book X, X.title Y, X.author Z

Composição de consultas
select 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.author
from biblio.book X
SELECT row: ( SELECT author: Y
FROM X.author Y)
FROM biblio.book X
Query 3:
row
resposta
biblio
&o1
paper
&o12
book
&o29
...
title
author
&o52
&o47
Smith
&o48
1999
&o50
author
author
title
author
date
&a2
author
&o24
author
row
&a1
book
&96
date
&25
1976
Roux Combalusier
Database
Systems
Resposta =
{row: {author:“Smith”},
row: {author:“Roux”,
author:“Combalusier”,},
}
&30
Database
Systems
Consulta
LOREL

Outro exemplo de composição
select row:{ select author:Y, title:T
from X.author Y
X.title T}
from biblio.book X
where "Roux" in X.author
SELECT ( SELECT row: {author: Y, title: T}
FROM X.author Y, X.title T)
FROM biblio.book X
WHERE “Roux” in X.author
Query 4:
row
resposta
biblio
&o1
paper
&o12
&a1
book
book
&o24
author
&o29
...
date
title
author
&o52
&o47
Smith
&o48
1999
&o50
title
&a2
author
title
title
author
author
row
&96
date
&25
1976
Roux Combalusier
&30
Resposta =
{row: {author:“Roux”,
title: “Database…”},
row: {author:“Combalusier”,
title: “Database…”},
}
Database
Systems
Database
Systems
(Query está errada no livro texto)
Consulta
LOREL

Semântica dos predicados de comparação
select a:A,
from r1.row
r2.row
X.a A,
where B=B'
–
–
c:C
X,
Y,
X.b B, Y.b B', Y.c C
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
Consultas
LOREL

Comparações de valores
select row:X
from biblio.paper X
where X.author = "Smith"
–
X.author é um conjunto de objetos, "Smith" é um valor atômico
where exists Y in X.author : Y="Smith"
select row:X
from biblio.paper X
where X.year>1993
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.author
FROM biblio.book
WHERE biblio.book.year = 1999
SELECT X.author
FROM biblio.book X
WHERE X.year = 1999
Lorel

Variáveis existenciais:
SELECT biblio.book.year
FROM biblio.book
WHERE biblio.book.author = “Roux”
–
O que acontece com livros com múltiplos autores?
Author é existencialmente quantificado:
SELECT biblio.book.year
FROM biblio.book X, X.author Y
WHERE Y = “Roux”
UnQL
Patterns:
SELECT row: X
WHERE {biblio.book: {author “Roux”,
title X}} in DB,
Equivalente a:
SELECT row: X
FROM biblio.book Y,
Y.author Z,
Y.title X
WHERE 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
LORE
O sistema LORE




LORE: Lightweight Object Repository
Um SGBD para dados semi-estruturados
Desenvolvido em Stanford
Utiliza o modelo OEM
LORE
Arquitetura
GUI
Applications
API
consultas
parser
préprocessador
Compilação de consultas
gerador de
planos de consultas
optimizador
de consultas
Data Engine
Armazenamento
físico
gerente
de objetos
operadores
físicos
gerente
de índices
gerente
de dados externos
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
Encontre todos os autores que publicaram pela Morgan Kaufmann:
WHERE <book>
<publisher>
<name> Morgan Kaufmann </>
</>
<author> $A </>
</book> in “www.a.b.c/bib.xml”
CONSTRUCT <author> $A </>
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
Encontre as linguagens nas quais Jones têm publicado:
where <book language=$X>
<author> Jones </author>
</book> in “www.a.b.c/bib.xml”
construct <result> $X </>
Construtores em XML-QL
Encontre todos os autores e as linguagens nas quais eles publicaram:
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>
....
Consultas aninhadas em XML-QL
Encontre os autores e as linguagens nas quais eles publicaram;
agrupando por autores:
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 </>
</>
Obs: book.author é uma expressão de caminho
Resultado:
<result> <author>Smith</author>
<lang>English</lang>
<lang>French</lang>
<lang>…</lang>
…
</result>
<result> <author>Doe</author>
<lang>English</lang>
…
</result>
Junção em XML-QL
Encontre os artigos que têm pelo menos um autor que também escreveu
um livro em inglês
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 </>
Variáveis Tag em XML-QL
Encontre as publicações publicadas em 2000 nas quais Carlos é um
autor ou editor
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 </>
</>
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>
XQuery
Para 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
<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>
count = função (aggregate) que retorna o número de elementos
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
Lista de tuplas
WHERE Clause
Lista de tuplas
RETURN Clause
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>
LET $x IN document("bib.xml")/bib/book
RETURN <result> $x </result>
Retorna:
<result> <book>...</book></result>
<result> <book>...</book></result>
<result> <book>...</book></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
Download

Unidade 3 - Linguagem de Consulta