Facultad de Estadística e Informática
Manejadores de Bases de DatosBASES DE DATOS NO ESTRUCTURADAS - XQUERY
Facultad de Estadística e Informática
BibliografíaA. Rodríguez, Publicación en Internet y Tecnología XML, Alfa-Omega Ra-Ma, Madrid. España, 2004
World Wide Web Consortium (W3C). 14 de diciembre de 2010. XQuery 1.0: An XML Query Language (Second Edition). Consultado el 4 de marzo de 2017 desde https://www.w3.org/TR/xquery/.
World Wide Web Consortium (W3C). 16 de noviembre de 1999. XML Path Language (XPath)Version 1.0. Consultado el 4 de marzo de 2017 desde https://www.w3.org/TR/xpath/.
Facultad de Estadística e Informática
Manejadores de Bases de Datos
XQUERY
Facultad de Estadística e Informática
Bases de datos no estructuradas - XML
XQueryXQuery 1.0 se convirtió en estándar con la recomendación del W3C el 23 de enero de 2007.Última versión: XQuery 3.1. W3C Recommendation 21 March 2017. https://www.w3.org/TR/2017/REC-xquery-31-20170321/
Facultad de Estadística e Informática
Bases de datos no estructuradas - XML
XQueryXQuery es un lenguaje de consulta para extraer y manipular datos almacenados en XML.XQuery->XMLSQL->Bases de datos
Facultad de Estadística e Informática
Bases de datos no estructuradas - XML
XQueryUtiliza expresiones xPath para el acceso a los nodos del documento XML.La expresión más importante es FLOWR: FOR, LET, WHERE, ORDER BY y RETURN, que es similar a SQL SELECT y las cláusulas FROM, WHERE y ORDER BY
Facultad de Estadística e Informática
Bases de datos no estructuradas - XML. XQuery
FOR – Selecciona los nodos
LET – Permite hacer asignaciones de variables.
WHERE – Filtra los nodos.
ORDER BY – Ordena los nodos
RETURN – Regresa el valor correspondiente, una vez que se ha evaluado cada nodo.
Facultad de Estadística e Informática
Bases de datos no estructuradas - XML. XQueryEjemplo: Extraer los nodos <nombre>, <genero>; del archivo catalogoPelis.xml, ordenados por longitud de nombre.
Selecciona los nodos
Ordena los nodos
for $a in /catalogo/peliculaorder by string-length($a/nombre) return<nuevaPelicula>
{ $a/nombre }{ $a/genero }
</nuevaPelicula>
Facultad de Estadística e Informática
Bases de datos no estructuradas - XML. XQueryEjemplo: Obtener los nodos <nombre>, <genero>; del archivo catalogoPelis.xml, ordenados por longitud de nombre.
Resultado XQuery
Facultad de Estadística e Informática
Bases de datos no estructuradas - XML. XQuery
Ejemplo 2:
Ejemplo: Genera resultado con el nodo <nombre>; donde id es igual a 0001 e id es igual a 0002.
Selecciona los nodos
Asigna el valor a la variable $peliID
Filtra los nodos según la condición
Regresa el valor deseado
for $peli in /catalogo/peliculalet $peliID := $peli/@idwhere $peliID = "0001" or$peliID = "0002"return $peli/nombre
Facultad de Estadística e Informática
Bases de datos no estructuradas -XML. XQuery
Ejemplo: Genera resultado con el nodo <nombre>; donde id es igual a 0001 e id es igual a 0002.
Resultado XQuery
Facultad de Estadística e Informática
Bases de datos no estructuradas -XML. XQuery
Ejercicio: Obtener los nodos <nombre> y <duracion> del nodo <pelicula>; donde id sea igual a 0003.
Facultad de Estadística e Informática
Ejercicios Base de Datos proveedores.XML
Datos
proveedores
partes
proyectos
suministros
nombre
estado
ciudad
@numprov
@numpartenombrepartecolorpesociudad
@numproyectonombreproyectociudad
numprovnumpartenumproyectocantidad
proveedor
parte
proyecto
suministra
Facultad de Estadística e Informática
Bases de datos no estructuradas - XML. XQuery
Ejercicios Base de Datos proveedores.XML
Facultad de Estadística e Informática
Bases de datos no estructuradas - XML
Consulta: ciudad de los proveedoresExtraer la ciudad de los proveedores (solo texto, no debe aparecer la etiqueta) que tengan un estado mayor de 15.
for $proveedor in /datos/proveedores/proveedor
where $proveedor/estado > 15
return $proveedor/ciudad/text()
Facultad de Estadística e Informática
Consulta: ciudad de los proveedoresExtraer el nombre de los proveedores (solo texto, no debe aparecer la etiqueta) donde la ciudad sea París.
Datos
proveedores
partes
proyectos
suministros
nombreprov
estado
ciudad
@numprov
@numpartenombrepartecolorpesociudad
@numproyectonombreproyectociudad
numprovnumpartenumproyectocantidad
proveedor
parte
proyecto
suministra
Facultad de Estadística e Informática
Bases de datos no estructuradas - XML
Consulta: ciudad de los proveedoresExtraer el nombre de los proveedores (solo texto, no debe aparecer la etiqueta) donde la ciudad sea París.
for $proveedor in /datos/proveedores/proveedor
where $proveedor/ciudad =“Paris”
return $proveedor/nombreprov/text()
Facultad de Estadística e Informática
Bases de datos no estructuradas - XML
Consulta: filas de la tabla partesCuántas partes existen, es decir, el total de filas de la «tabla» partes.
count (/datos/partes/parte)
Facultad de Estadística e Informática
Bases de datos no estructuradas - XML
Consulta: filas de la tabla partesCuántos proveedores existen, es decir, el total de filas de la «tabla» proveedor.
count (/datos/proveedores/proveedor)
Facultad de Estadística e Informática
Bases de datos no estructuradas - XML
Consulta con “uniones”Obtener el nombre de los proyectos cuya ciudad sea Paris y que reciban una cantidad de partes > 350.
Facultad de Estadística e Informática
Ejercicios Base de Datos proveedores.XML
Paso 0: análisis
La cantidad de partes está en las filas (elementos XML) suministrapero el nombreproyecto está en las filas proyecto. Será necesario «cruzar» elementos proyecto con elementos suministra usando como condición que @numproyecto de los elementos proyecto sea igual a los campos numproyecto de los elementos suministra
Datos
proveedores
partes
proyectos
suministros
nombre
estado
ciudad
@numprov
@numpartenombrepartecolorpesociudad
@numproyectonombreproyectociudad
numprovnumpartenumproyectocantidad
proveedor
parte
proyecto
suministra
Facultad de Estadística e Informática
Bases de datos no estructuradas - XMLPaso 1: Se hace el cruce
Una primera aproximación sería esta:
for $suministra in
/datos/suministros/suministra
for $proyecto in
/datos/proyectos/proyecto
where $suministra/numproyecto = $proyecto/@numproyecto
return $proyecto/nombreproyecto
Devuelve «todos los proyectos» que aparecen
en la tabla suministra
Facultad de Estadística e Informática
Bases de datos no estructuradas - XMLPaso 2: añadir condiciones
La tabla suministra debe ser mayor de 350, en el where o en el for de suministra se añade una condición de filtrado:
Asimismo se filtran los proyectos cuyo campo ciudad sea Paris.
for $suministra in
/datos/suministros/suministra[cantidad>350]
for $proyecto in
/datos/proyectos/proyecto[ciudad="Paris"]
where $suministra/numproyecto = $proyecto/@numproyecto
return $proyecto/nombreproyecto
Facultad de Estadística e Informática
Bases de datos no estructuradas - XMLOfor $suministra in
/datos/suministros/suministra
for $proyecto in
/datos/proyectos/proyecto
where $suministra/numproyecto = $proyecto/@numproyecto
and
$suministra/cantidad > 350
and
$proyecto/ciudad="Paris"
return $proyecto/nombreproyecto
Facultad de Estadística e Informática
Bases de datos no estructuradas - XMLConsulta: ciudades iguales
Obtener los nombres de proyecto y nombres de parte que estén en la misma ciudad.
Datos
proveedores
partes
proyectos
suministros
nombre
estado
ciudad
@numprov
@numpartenombrepartecolorpesociudad
@numproyectonombreproyectociudad
numprovnumpartenumproyectocantidad
proveedor
parte
proyecto
suministra
Facultad de Estadística e Informática
Bases de datos no estructuradas - XMLConsulta: ciudades iguales
Obtener los nombres de proyecto y nombres de parte que estén en la misma ciudad.
for $proyecto in
/datos/proyectos/proyecto
for $parte in
/datos/partes/parte
where
$parte/ciudad = $proyecto/ciudad
return concat(
$parte/nombreparte, " en la misma ciudad que ",
$proyecto/nombreproyecto, “- “, $parte/ciudad
)
Facultad de Estadística e Informática
Consulta: partes con colores iguales
Obtener parejas de partes que tengan el mismo color (indicando el nombre de ambas partes y el color que comparten)
Datos
proveedores
partes
proyectos
suministros
nombre
estado
ciudad
@numprov
@numpartenombrepartecolorpesociudad
@numproyectonombreproyectociudad
numprovnumpartenumproyectocantidad
proveedor
parte
proyecto
suministra
Facultad de Estadística e Informática
Consulta: partes con colores iguales
Obtener parejas de partes que tengan el mismo color (indicando el nombre de ambas partes y el color que comparten)
for $p1 in
/datos/partes/parte
for $p2 in
/datos/partes/parte
where
$p1/color = $p2/color
return concat ($p1/nombreparte,
" tiene el mismo color que ",
$p2/nombreparte,
"el color es:",
$p1/color, "
")
Facultad de Estadística e Informática
Para mejorar la consulta, vamos a eliminar parejas en la cuales el numparte sea el mismo, es decir no vamos a contemplar el emparejar una parte consigo misma.
for $p1 in
/datos/partes/parte
for $p2 in
/datos/partes/parte
where
$p1/color = $p2/color
and
$p1/@numparte != $p2/@numparte
return concat ($p1/nombreparte,
" tiene el mismo color que ",
$p2/nombreparte,
" en concreto el color es:",
$p1/color, "
")
Facultad de Estadística e Informática
Consulta: cantidad de partes de Londres
Cuántas partes existen cuya ciudad sea «Londres», es decir, el total de filas de la «tabla» partes pero teniendo en cuenta la condición de que el «campo» ciudad debe ser Londres.
count (/datos/partes/parte[ciudad='Londres'])
Facultad de Estadística e Informática
Consulta: La media de la cantidad de partes que aparecen en la «tabla» suministra
avg (/datos/suministros/suministra/cantidad)
Facultad de Estadística e Informática
Consulta: media de partes rojas
La media de partes suministradas cuyo color sea “Rojo”.
Datos
proveedores
partes
proyectos
suministra
nombre
estado
ciudad
@numprov
@numpartenombrepartecolorpesociudad
@numproyectonombreproyectociudad
numprovnumpartenumproyectocantidad
Facultad de Estadística e Informática
Consulta: media de partes rojas
La media de partes suministradas cuyo color sea “Rojo”.
Paso 1: cruce de tablas
for $parte in
/datos/partes/parte
for $suministra in
/datos/suministros/suministra
where
$parte/@numparte = $suministra/numparte
Facultad de Estadística e Informática
Paso 2: añadir condicion de filtrado
for $parte in
/datos/partes/parte
for $suministra in
/datos/suministros/suministra
where
$parte/@numparte = $suministra/numparte
and
$parte/color='Rojo'
return $suministra/cantidad
Facultad de Estadística e Informática
Ó
for $parte in
/datos/partes/parte[color='Rojo']
for $suministra in
/datos/suministros/suministra
where
$parte/@numparte = $suministra/numparte
return $suministra/cantidad
Facultad de Estadística e Informática
Paso 3: calcular la media
avg (
for $parte in
/datos/partes/parte[color='Rojo']
for $suministra in
/datos/suministros/suministra
where
$parte/@numparte = $suministra/numparte
return $suministra/cantidad
)
Facultad de Estadística e Informática
Ejercicio:
Consulta: suministros en grandes cantidades
Extraer el nombre de los proyectos (sin que haya repeticiones) que reciban una cantidad en la tabla suministra mayor de 650.
Facultad de Estadística e Informática
Manejadores de Bases de Datos
Gracias por su atención