Linguagens de interrogação de dados XML XPath Helena Galhardas DEI IST Agenda Introdução Expressões de caminho (path expressions) XPath 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 reestruturação dos dados Linguagens de interrogação para documentos 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 XSL: conjunto de template rules – W3C XQL: extensão do XSL – Microsoft .... XQuery Linguagem de interrogação para dados semi-estruturados Poder expressivo Semântica precisa Composição Saída de uma interrogação pode ser usada como entrada noutra interrogação Esquema Capacidade de re-estruturação de dados SS Explorar a estrutura (se existir) para verificação de tipos Manipulação de programas Interrogações podem ser geradas automaticamente logo convém ser linguagem verbosa Expressões de caminho (path expressions) Seja l1.l2.l3…ln - sequência de etiquetas de arcos, Expressão de caminho (path expression) - é uma interrogação simples, cujo resultado é um conjunto de nós para um dado grafo de nós. resultado de l1.l2.l3…ln sobre um grafo de dados: é um conjunto de nós vn tal que existem arestas (r,l1,v1), (v1,l2,v2),…, (vn-1, ln, vn) no grafo de dados onde r é a raíz. mas ainda não é um conjunto de dados semi-estruturados. Exemplo Roux author author biblio book date n1 db title Combalusier 1976 Database Systems book n2 paper author date Smith 1999 title n3 ... Database Systems Exemplo Roux author author biblio book date n1 db title Combalusier 1976 Database Systems book n2 paper author date Smith 1999 title n3 ... biblio.book: {n1, n2} Database Systems Exemplo Roux author author book date n1 Combalusier 1976 biblio db title Database Systems book n2 author paper Smith date 1999 title n3 ... 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, paragrahs 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 infinito de caminhos sempre que existe um ciclo. 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 => Linguagem de interrogação é necessária Sintaxe básica (Lorel) Select author: X From biblio.book.author X Resultado: {author: “Roux”, author: “Combalusier”, author: “Smith”} Roux author author q1 author Combalusier Smith select row: X from biblio._ X where “Smith” in X.author {row: {author: “Smith”, date: 1999, title: “Database Systems”,...} n2 author date q2 Smith 1999 title ... Database Systems select author: Y 3º from biblio._ X, 1º X.author Y, X.title Z where matches(“.*(D|d)atabase.*”, Z) 2º Resultado: todos os autores de publicações cujo título contém a palavra “database” 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) XML Pointer (XPointer) XML Query 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 part/*/*/subpart/../name = part/*/*[subpart]/name 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> Modelo de dados para XPath A raíz bib book publisher Addison-Wesley O elemento raíz book author . . . . Serge Abiteboul Idêntico ao modelo de dados de XQuery 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 Predicados: filtra os nós que são encontrados; compreendem: exps booleanas, exps numéricas, exps com um conjunto de nós, funções sobre um cjto de nós. 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 profundidade Resultado: <first-name> Rick </first-name> 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()) name() = retorna o nome da etiqueta corrente Wildcard //author/* Resultado: <first-name> Rick </first-name> <last-name> Hull </last-name> “*“ Corresponde a qualquer elemento debaixo de “autor” a qualquer profundidade 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> Nós atributo /bib/book/@price Resultado: “55” @price significa que price tem que ser um atributo Qualificadores (1) /bib/book/author[firstname] 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[firstname][address[//zip][city]]/last name 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 dos exemplos 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 db/book[@price=’10’] books com price igual a 10 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 / = returna a raíz Se tivermos comentários antes e depois de <bib>, estes tornam-se irmãos de <bib> 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> 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 publicado pela Deutsche Grammophon Todos os CDs que têm execuções pela London Symphony Orchestra 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 CD[performance[orchestra="London Symphony Orchestra"]] Referências Peter Wood, Slides on “Representing and Querying Data on the Web”, http://www.dcs.bbk.ac.uk/~ptw/teaching/data-on-theweb.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) www.w3.org/TR/xpath Recomendação W3C do XPath www.w3schools.com/xpath Tutorial XPath Próximo tópico XSLT 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ó E os predicates são opcionais Navegação Podemos navegar ao longo de 13 eixos: ancestor ancestor-or-self Attribute – todos os atributos do nó de contexto child descendant descendant-or-self following following-sibling namespace Parent – o pai do nó de contexto preceding preceding-sibling self – o nó de contexto, ele mesmo 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]] Os eixos de navegação dão-nos mais poder Sintaxe abreviada vs sintaxe completa Sintaxe completa child:: attribute:: /descendant-or-self::node()/ self::node() parent::node() [position()=i] Sintaxe abreviada nada (child eixo por omissão) @ // . .. [i] Se o caminho começa com //, então o contexto inicial é a raíz.