Docstoc

Query

Document Sample
Query Powered By Docstoc
					 Unidade 3- Consulta a
dados semi-estruturados
Consulta

    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                                    Roux
                                              author
                                              author     Combalusier
                                               date      1976
                                       &n1
                                               title      Database
                                                          systems
                           book
                                               author      Smith
                biblio                           date       1999
           db            &bib           &n2
                                book
                                                 title       Database
                            paper                            systems
                                       &n3
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"}
      Query 1:                                SELECT author: X
                                              FROM biblio.book.author X


                                                                                  resposta
              biblio
                        &o1

        paper                          book              author
                       book
                                                             author                    Resposta =
                                                                            author
 &o12                   &o24                    &o29                                   {author: “Smith”,
...                                    author
                                                                  title                 author: “Roux”,
                                                         date
      author                   title            author                                  author: “Combalusier”}
                  date
                                         &o52               &25           &30
                                                   &96
                                                   1976
          &o47         &o48    &o50
                                         Roux Combalusier                       Database
                                                                                Systems
      Smith        1999          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
                   Query 2:                                    FROM biblio._ X
                                                               WHERE “Smith” in X.author


                                                                row
                                                                                 resposta
              biblio
                        &o1                     . . .
        paper          book
                                       book              row                                resposta =
                                                                                            {row: {author:“Smith”,
 &o12                   &o24                    &o29                                               date: 1999,
...                                    author
                                                                 title                             title: “Database…”},
                                                         date
      author                   title            author                                        row: …
                  date
                                         &o52
                                                   &96     &25           &30                }
                                                   1976
          &o47         &o48    &o50
                                         Roux Combalusier                      Database
                                                                               Systems
      Smith        1999          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
                  Query 3:                                       FROM X.author Y)
                                                   FROM biblio.book X


                                                                row
                                                                                   resposta
              biblio
                        &o1
                                                  &a1                       row
        paper                          book                                             Resposta =
                       book                                         &a2
                                                author
                                                         author
                                                                                        {row: {author:“Smith”},
 &o12                   &o24                    &o29                     author           row: {author:“Roux”,
...                                                              title
                                       author            date
                                                                                                author:“Combalusier”,},
      author                   title            author                                  }
                  date
                                         &o52              &25             &30
                                                   &96
                                                   1976
          &o47         &o48    &o50
                                         Roux Combalusier                        Database
                                                                                 Systems
      Smith        1999          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}
Query 4:                                 FROM X.author Y, X.title T)
                                FROM biblio.book X
                                WHERE “Roux” in X.author

                                                                 row
                                                                                    resposta
              biblio
                        &o1
                                                           &a1
                                       book
                                                                            row             Resposta =
        paper          book                       author             &a2
                                                             title                          {row: {author:“Roux”,
 &o12                   &o24                    &o29       author           title                   title: “Database…”},
                                                                  title                       row: {author:“Combalusier”,
...                                    author            date                                       title: “Database…”},
      author                   title            author
                  date
                                         &o52                              &30
                                                                                            }
                                                   &96      &25

                                                   1976
          &o47         &o48    &o50
                                         Roux Combalusier                        Database
                                                                                 Systems
      Smith        1999          Database
                                 Systems
                                                                           (Query está errada no livro texto)
Consulta

    LOREL

       Semântica dos predicados de comparação
             select a:A,    c:C
             from r1.row    X,
                  r2.row    Y,
                  X.a A,    X.b B, Y.b B', Y.c C
             where 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
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:
                SELECT biblio.book.author
                FROM biblio.book
                WHERE biblio.book.year = 1999
    torna-se:
                 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      Compilação de consultas

                                                gerador de              optimizador
              parser    préprocessador
                                            planos de consultas         de consultas



                                                          Data Engine

                        gerente                     gerente
                                    operadores     de índices          gerente
                       de objetos     físicos                     de dados externos
       Armazenamento
       físico
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

                                         Retorna:
FOR $x IN document("bib.xml")/bib/book    <result> <book>...</book></result>
                                         <result> <book>...</book></result>
RETURN <result> $x </result>             <result> <book>...</book></result>
                                         ...




LET $x IN document("bib.xml")/bib/book     Retorna:
                                            <result> <book>...</book>
RETURN <result> $x </result>                         <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...)


                                                 Retorna:
RETURN <result> $b/author </result>               <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

				
DOCUMENT INFO
Shared By:
Categories:
Tags:
Stats:
views:53
posted:12/30/2011
language:Portuguese
pages:55