Linguagens de
interrogação de dados
XML - XPath
Gestão e Tratamento de Informação
DEI IST
Agenda
Introdução
Expressões de caminho (path expressions)
Porquê uma linguagem de
interrogação para dados SS?
Essencial para dados Web
Seleccionar partes de um documento
Interessante ter uma linguagem de
interrogação do tipo de BD para aplicar
predicados aos dados, e executar
Linguagens de
interrogação para
docum
e
ntos XML
LOREL e UnQL:
linguagens de consulta p/ dados semi-estruturados
XML-QL
: estende SQL
Strudel Project - AT&T Labs
XML-GL
: linguagem gráfica
Transforma o DTD e os documentos XML em
grafos
XSLT: conjunto de template rules – W3C
XQL: extensão
do XSL – Microsoft + W3C
Linguagem de
interrogação para dados
semi-estruturados
Poder expressivo
Capacidade de re-estruturação de dados SS
Semântica precisa
Composição
Saída de uma interrogação pode ser usada como entrada
noutra interrogação
Esquema
Expressões de caminho
(path expressions)
Seja l
1.l
2.l
3…l
n- sequência de etiquetas de arcos,
Expressão de caminho (path expression) - é uma
interrogação simples, cujo resultado é um conjunto de nós
de um dado grafo.
resultado de l
1
.l
2.l
3…l
nsobre um grafo de dados
: é um conjunto
de nós v
ntal que existem arestas (r,l
1,v
1), (v
1,l
2,v
2),…,(v
n-1, l
n, v
n)
no grafo de dados onde r é a raíz.
Exemplo
db book n1 n2 n3 biblio author author date title author date title paper Roux Combalusier 1976 Database Systems Smith 1999 Database Systems ... bookExemplo
db book n1 n2 n3 biblio author author date title author date title paper Roux Combalusier 1976 Database Systems Smith 1999 Database Systems ...biblio.book: {n1, n2}
bookExemplo
db book n1 n2 n3 biblio author author date title author date title paper Roux Combalusier 1976 Database Systems Smith 1999 Database Systems ...biblio.book.author: nós e conteúdo {“Roux”, “Combalusier”, “Smith”}
Expressões regulares
Sintaxe genérica:
e::= l |
∈
| _ | e’.’e | ‘(‘e’)’ | e ’|’e | e’*’ | e’+’ |
e’?’ ,
Em que
l
varia entre as etiquetas,
e
sobre
expressões e
∈
é o conjunto vazio.
Exemplo:
((s|S)ection|paragraph)(s)?
Corresponde a :
section, Section, sections, Sections, paragraph,
Outro exemplo
biblio._*.section.([tT]itle | paragraph.*heading)
Corresponde a qualquer caminho que começa com a
etiqueta biblio e acaba com uma etiqueta section,
seguido quer por um título (com possível primeira letra
maiúscula) ou uma aresta paragraph seguida por uma
aresta que contém a cadeia de caracteres heading.
A expressão regular _* corresponde a um número
Lacunas das path
expressions
Não constroiem nós novos
Não conseguem executar o equivalente a um
join
Não conseguem testar valores da base de
dados
XML Path Language
(XPath)
Recomendação W3C
Linguagem declarativa para especificar
caminhos nas árvores
Sintaxe semelhante à usada para caminhos
em hierarquias de ficheiros
Serve de base a outros standards do W3C:
XSL Transformations (XSLT)
XML Link (
XLink
)
Xpath: Definição
Uma
expressão XPath
,
p
, estabelece uma
relação entre:
Um nó de contexto e
Um nó que pertence ao conjunto de respostas
Exemplos:
author/firstname
.
= self
..
= parent
Exemplo
<bib>
<book> <publisher> Addison-Wesley </publisher> <author> Serge Abiteboul </author>
<author> <first-name> Rick </first-name> <last-name> Hull </last-name> </author>
<author> Victor Vianu </author>
<title> Foundations of Databases </title> <year> 1995 </year>
</book>
<book price=“55”>
<publisher> Freeman </publisher> <author> Jeffrey D. Ullman </author>
<title> Principles of Database and Knowledge Base Systems </title> <year> 1998 </year>
</book> </bib>
<bib>
<book> <publisher> Addison-Wesley </publisher> <author> Serge Abiteboul </author>
<author> <first-name> Rick </first-name> <last-name> Hull </last-name> </author>
<author> Victor Vianu </author>
<title> Foundations of Databases </title> <year> 1995 </year>
</book>
<book price=“55”>
<publisher> Freeman </publisher> <author> Jeffrey D. Ullman </author>
<title> Principles of Database and Knowledge Base Systems </title> <year> 1998 </year>
</book> </bib>
Modelo de dados para
XPath
bib
book book
publisher author
. . . .
Addison-Wesley Serge Abiteboul
A raíz
Expressão XPath
Pode ser:
-
Expressão absoluta
: começa com ‘/’, é seguida por uma
expressão relativa, e é avaliada começando pelo nó raiz
-
Expressão relativa
: sequência de passos de localização
separados por ‘/’.
Passo de localização
pode ser:
-
Vazio (//)
: procura todos os descendentes de cada nó no
contexto
-
NomeElemento [predicados]
: procura todos os elementos filho
de cada nó no contexto que têm o nome dado
-
@nomeAtributo [predicados] :
procura o nó atributo de cada nó
no contexto que tem o nome dado
Expressões simples
/bib/book/year
Resultado: <
year
> 1995 </
year
>
<
year
> 1998 </
year
>
/bib/paper/year
Resultado: empty (não existem artigos)
Expressões um pouco
mais complicadas
//author
Significado: todos os elementos autor que são
descendentes da raíz
Resultado:
<
author
> Serge Abiteboul </
author
>
<
author
> <
first-name
> Rick </
first-name
>
<
last-name
> Hull </
last-name
>
</
author
>
<
author
> Victor Vianu </
author
>
<
author
> Jeffrey D. Ullman </
author
>
/bib//first-name
Significado: “first-name” debaixo de “bib” a qualquer
Nós de texto
/bib/book/author/
text()
Significado: os textos debaixo de todos os autores
Resultado: Serge Abiteboul
Jeffrey D. Ullman
Rick Hull não aparece porque tem
firstname
,
lastname
Algumas funções em XPath:
text()
= retorna o valor textual
node()
= retorna qq. nó (= * or @* or
text()
)
Wildcard
//author/*
Resultado:
<
first-name
> Rick </
first-name
>
<
last-name
> Hull </
last-name
>
“*
“ Corresponde a qualquer elemento debaixo
de “autor” a qualquer profundidade
Nós atributo
/bib/book/@price
Resultado: “55”
@price
significa que price tem que ser um
atributo
Qualificadores (1)
/bib/book/author[first-name]
Significado: os elementos “author” que tenham
um “firstname”
Resultado:
<
author
> <
first-name
> Rick </
first-name
>
<
last-name
> Hull </
last-name
>
</
author
>
Qualificadores (2)
/bib/book/author[first-name][address[//zip][city]
]/lastname
Significado: os lastname dos “author” que tenham
“firstname” e cujo endereço contenha um “zip code”, a
qualquer profundidade, e uma cidade
Resultado: <
lastname
> … </
lastname
>
<
lastname
> … </
lastname
>
Qualificadores (3)
/bib/book[@price < “60”]
/bib/book[author/@age < “25”]
/bib/book[author/
text()
]
Sumário
bib
elemento
bib
*
qualquer elemento
/
root
/bib
bib
debaixo de
root
bib/paper
paper
debaixo de
bib
bib//paper
paper
bebaixo de
bib
, a qq profundidade
//paper
paper a qualquer profundidade
paper|book
um
paper
ou um
book
@price
atributo
price
bib/book/@price
atributo
price
em
book
, em
bib
db/book[@price]
books
que têm um atributo
price
A raíz
<
bib
> <
paper
> 1 </
paper
> <
paper
> 2 </
paper
>
</
bib
>
bib é o “document element”
A “root” está acima de bib
/bib
= retorna o elemento documento
/
= retorna a raíz
Exercício
Considere um documento XML d que representa uma colecção de CDs. Assuma que o documento é válido no que diz respeito à seguinte DTD:
<!ELEMENT CDlist ((CD)+)>
<!ELEMENT CD (composer, (performance)+, publisher, (length)?)>
<!ELEMENT performance (composition, (soloist)?, (orchestra, conductor)?)> <!ELEMENT composer (#PCDATA)>
<!ELEMENT publisher (#PCDATA)> <!ELEMENT length (#PCDATA)>
<!ELEMENT composition (#PCDATA)> <!ELEMENT soloist (#PCDATA)>
<!ELEMENT orchestra (#PCDATA)> <!ELEMENT conductor (#PCDATA)>
Quais as expressões XPath que retornam o seguinte de d, assumindo que o contexto inicial é o elemento CDlist:
Todas as composições
Todas as composições envolvendo um solista
Todas as execuções com uma orquesta mas sem solista
Todos os solistas que tocaram com a London Symphony Orchestra num CD
Todas as composições:
CD/performance/composition
Todas as composições envolvendo um solista:
CD/performance[soloist]/composition
Todas as execuções com uma orquestra mas sem
solista: CD/performance[orchestra and not(soloist)]
Todos os solistas que tocaram com a London Symphony
Orchestra num CD publicado pela Deutsche
Grammophon
CD[publisher="Deutsche Grammophon"]/performance
[orchestra="London Symphony Orchestra"]/soloist
Todos os CDs com execuções pela London Symphony
Orchestra
Navegação usando a sintaxe
completa
Passo de localização tem a sintaxe:
axis :: node-test predicates
Em que:
Axis
selecciona um conjunto de nós
candidatos
node-test
filtra os candidatos baseado no tipo
ou nome do nó
Navegação
Podemos navegar ao longo de 13 eixos:
ancestor
ancestor-or-self
attribute
child
descendant
descendant-or-self
following
following-sibling
namespace
parent
preceding
Exemplos
child::author/child:lastname
=
author/lastname
child::author/descendant::zip
=
author//zip
child::author/parent::*
=
author/..
child::author/attribute::age
=
author/@age
E os seguintes, o que querem dizer?
paper
/
publisher
/
parent
::*/
author
/
bib
//
address
[
ancestor
::
book
]
/
bib
//
author
/
ancestor
::*//
zip
Mais exemplos
name() = o nome do nó corrente
/
bib
//*[name()=
book
] é o mesmo que
/bib//book
O que quer dizer ?
/
bib
//*[
ancestor
::*[
name()
!=
book
]]
Sintaxe abreviada vs sintaxe
completa
Sintaxe completa Sintaxe abreviada
child::
nada (child eixo por omissão)
attribute::
@
/descendant::node() //
self::node() .
parent::node() ..
[position()=i]
[i]
Se o caminho começa com //, então o contexto inicial
Referências
Peter Wood, Slides on “Representing and Querying
Data on the Web”,
http://www.dcs.bbk.ac.uk/~ptw/teaching/data-on-the-web.html.
Dan Suciu, Slides on “The semistructured data model”,
CSE 590ds: Management of XML and Semistructured
Data,
http://www.cs.washington.edu/education/courses/cse5
90ds/01sp/
S. Abiteboul, P. Buneman, D. Suciu, “Data on the
Web, From Relations to Semistructured Data and
XML”, Morgan Kaufmann, 2000, (cap 4)