dam-m6

Introducción

Es conocido por todo el mundo que las bases de datos son una parte fundamental de todas las organizaciones, pues en ellas se almacena información que será utilizada por éstas. Además, hay que decir que XML es parte del presente y seguramente el futuro de la administración de datos ya que ha permitido romper ciertas barreras y crear un formato estándar para procesar información. Pues bien, XML está provocando la aparición de nuevas tecnologías, entre ellas la aparición de una nueva generación de bases de datos que aunque por ahora se encuentran en una fase de investigación y desarrollo, en un futuro pueden ser una alternativa a las bases de datos relacionales. Son las llamadas native XML database, las bases de datos XML nativas BD:XML.

Comparativa entre las XML:DB y las bases de datos relacionales

La principal característica de las XML:DB es la capacidad de obtener resultados de consultas con formato XML y por eso estas bases de datos pertenecen a la categoría XML-enabled database. La organización XML:DB Initiative for XML Databases describe una base de datos de este tipo como una: modelo lógico para documentos XML y almacena y recupera documentos de acuerdo con este modelo. Todas las bases de datos relacionales son centradas en los Datos, data-centric databases, ya que lo que ellas almacenan son datos atómicos. Una BD:XML, ni tiene campos, ni almacena datos atómicos ya que lo que ella almacena son documentos XML, por lo que a este tipo de bases de datos se les llama bases de datos centradas en documentos, “documento-céntrico databases” .

Varios productos ofrecen diferentes características para las bases de datos nativas XML, y son generalmente estas:

XPath y XQuery

XPath y XQuery son dos lenguajes de consulta diferentes que se utilizan para acceder y manipular datos en documentos XML y otros tipos de datos estructurados. A continuación, se presentan algunas diferencias clave entre XPath y XQuery:

XPath es una herramienta más limitada diseñada para navegar por documentos XML, mientras que XQuery es una herramienta más completa diseñada para realizar consultas complejas en documentos XML y otros tipos de datos estructurados..

XQuery y XPath son dos lenguajes de consulta diferentes pero relacionados que se utilizan para buscar y manipular datos en documentos XML. A continuación, se presentan algunas similitudes y diferencias clave entre XQuery y XPath:

Similitudes

Diferencias

XPath se utiliza para seleccionar elementos y atributos específicos dentro de un documento XML, mientras que XQuery se utiliza para realizar consultas más complejas y para manipular y transformar datos XML. Ambos lenguajes se basan en expresiones XPath, pero XQuery es un lenguaje más completo y complejo que XPath, y puede manejar consultas más complejas y operaciones sobre múltiples documentos XML

Colecciones de datos

Colección de Datos 1: Lista de Empleados

<employees>
    <employee id="1001">
        <name>John Doe</name>
        <department_id>D001</department_id>
        <salary>60000</salary>
        <years_of_experience>7</years_of_experience>
        <supervisor_id>2001</supervisor_id>
    </employee>
    <employee id="1002">
        <name>Jane Smith</name>
        <department_id>D002</department_id>
        <salary>55000</salary>
        <years_of_experience>4</years_of_experience>
        <supervisor_id>2002</supervisor_id>
    </employee>
    <!-- Otros empleados -->
</employees>

Atributos de los empleados:

Colección de Datos 2: Registro de Estudiantes

<students>
    <student id="1001">
        <name>Emily Johnson</name>
        <course_id>CS101</course_id>
        <grades>
            <subject name="Math">
                <grade>95</grade>
            </subject>
            <!-- Otros sujetos y calificaciones -->
        </grades>
        <absences>2</absences>
        <tutor_id>2001</tutor_id>
    </student>
    <student id="1002">
        <name>Michael Brown</name>
        <course_id>PH101</course_id>
        <grades>
            <subject name="Physics">
                <grade>85</grade>
            </subject>
            <!-- Otros sujetos y calificaciones -->
        </grades>
        <absences>4</absences>
        <tutor_id>2002</tutor_id>
    </student>
    <!-- Otros estudiantes -->
</students>

<courses>
    <course id="CS101">
        <name>Computer Science</name>
        <professor>
            <name>Dr. Smith</name>
        </professor>
        <student_id>1001</student_id>
        <!-- Otros datos del curso -->
    </course>
    <course id="PH101">
        <name>Physics</name>
        <professor>
            <name>Dr. Johnson</name>
        </professor>
        <student_id>1002</student_id>
        <!-- Otros datos del curso -->
    </course>
    <!-- Otros cursos -->
</courses>

<professors>
    <professor id="2001">
        <name>Dr. Adams</name>
        <!-- Otros datos del profesor -->
    </professor>
    <professor id="2002">
        <name>Dr. Davis</name>
        <!-- Otros datos del profesor -->
    </professor>
    <!-- Otros profesores -->
</professors>

Atributos de los estudiantes:

Colección de Datos 3: Registro de Películas

<movies>
    <movie id="1">
        <title>The Shawshank Redemption</title>
        <genre>Drama</genre>
        <director>Frank Darabont</director>
        <year>1994</year>
        <rating>9.3</rating>
    </movie>
    <movie id="2">
        <title>The Godfather</title>
        <genre>Crime</genre>
        <director>Francis Ford Coppola</director>
        <year>1972</year>
        <rating>9.2</rating>
    </movie>
    <!-- Otros registros de películas -->
</movies>

Colección de Datos 4: Registro de Libros

<books>
    <book id="1">
        <title>To Kill a Mockingbird</title>
        <author>Harper Lee</author>
        <genre>Fiction</genre>
        <year>1960</year>
        <rating>4.27</rating>
    </book>
    <book id="2">
        <title>1984</title>
        <author>George Orwell</author>
        <genre>Dystopian</genre>
        <year>1949</year>
        <rating>4.18</rating>
    </book>
    <!-- Otros registros de libros -->
</books>

Colección de Datos 5: Registro de Canciones

<songs>
    <song id="1">
        <title>Bohemian Rhapsody</title>
        <artist>Queen</artist>
        <genre>Rock</genre>
        <year>1975</year>
        <rating>4.9</rating>
    </song>
    <song id="2">
        <title>Thriller</title>
        <artist>Michael Jackson</artist>
        <genre>Pop</genre>
        <year>1982</year>
        <rating>4.8</rating>
    </song>
    <!-- Otros registros de canciones -->
</songs>

Colección de Datos 6: Registro de automóviles

<cars>
    <car>
        <id>1</id>
        <brand>Toyota</brand>
        <model>Corolla</model>
        <year>2020</year>
        <sales>15000</sales>
        <price>20000</price>
        <color>Red</color>
        <mileage>5000</mileage>
    </car>
    <car>
        <id>2</id>
        <brand>Ford</brand>
        <model>Mustang</model>
        <year>2019</year>
        <sales>20000</sales>
        <price>35000</price>
        <color>Blue</color>
        <mileage>10000</mileage>
    </car>
    <car>
        <id>3</id>
        <brand>Honda</brand>
        <model>Civic</model>
        <year>2018</year>
        <sales>18000</sales>
        <price>25000</price>
        <color>Black</color>
        <mileage>8000</mileage>
    </car>
    <!-- Otros coches -->
</cars>

Ejercicios XPath

Ejercicios: Registro de Películas

  1. Obtener el título de una película específica:
//movies/movie[@id="1"]/title/text()
  1. Listar los directores de las películas de un género determinado:
//movies/movie[genre="Drama"]/director/text()
  1. Encontrar los títulos de las películas que tienen una calificación superior a 8:
//movies/movie[number(rating) > 8]/title/text()
  1. Obtener los años de lanzamiento de las películas dirigidas por un director específico:
//movies/movie[director="Francis Ford Coppola"]/year/text()
  1. Encontrar los géneros de las películas que fueron lanzadas después de 2000:
//movies/movie[number(year) > 2000]/genre/text()

Ejercicios: Registro de Libros

  1. Obtener el autor de un libro específico:
//books/book[@id="1"]/author/text()
  1. Listar los títulos de los libros de un género determinado:
//books/book[genre="Dystopian"]/title/text()
  1. Encontrar los autores de los libros que tienen una calificación superior a 4.5:
//books/book[number(rating) > 4.5]/author/text()
  1. Obtener los años de publicación de los libros escritos por un autor específico:
//books/book[author="Harper Lee"]/year/text()
  1. Encontrar los géneros de los libros que fueron publicados después de 2000:
//books/book[number(year) > 2000]/genre/text()

Ejercicios: Registro de Canciones

  1. Obtener el título de una canción específica:
//songs/song[@id="1"]/title/text()
  1. Listar los artistas de las canciones de un género determinado:
//songs/song[genre="Pop"]/artist/text()
  1. Encontrar los títulos de las canciones que tienen una calificación superior a 4.7:
//songs/song[number(rating) > 4.7]/title/text()
  1. Obtener los años de lanzamiento de las canciones interpretadas por un artista específico:
//songs/song[artist="Queen"]/year/text()
  1. Encontrar los géneros de las canciones que fueron lanzadas después de 2000:
//songs/song[number(year) > 2000]/genre/text()

Ejercicios: Registro de Estudiantes

  1. Obtener los nombres completos de todos los estudiantes.
//student/name/text()
  1. Obtener el nombre completo de los estudiantes que tienen una calificación superior a 90 en matemáticas.
//student[grades/subject[@name='Math']/grade > 90]/name/text()
  1. Contar el número total de estudiantes que están en el curso “CS101”.
count(//student[course_id = 'CS101'])
  1. Obtener los nombres completos de los estudiantes que tienen más de 3 ausencias.
//student[absences > 3]/name/text()
  1. Obtener el nombre completo de los estudiantes que tienen un tutor con el ID “2001”.
//student[tutor_id = '2001']/name/text()
  1. Obtener la calificación de un estudiante específico en una asignatura dada.
    //student[@id="1001"]/grades/subject[@name="Math"]/grade/text()
    
  2. Listar los nombres de los profesores de un curso determinado.
    //course[@name="Computer Science"]/professor/name/text()
    
  3. Encontrar los nombres de los estudiantes que tienen más de 90 en cualquier asignatura.
    //student[grades/subject/grade > 90]/name/text()
    
  4. Obtener los nombres de los estudiantes que están matriculados en un curso específico.
    //student[course_id="CS101"]/name/text()
    
  5. Encontrar el nombre del curso en el que está inscrito un estudiante con un ID específico.
    //course[student_id="1001"]/name/text()
    
  6. Encontrar los estudiantes que tienen más de 3 ausencias.
    //student[absences > 3]/name/text()
    
  7. Obtener el nombre del tutor de un estudiante específico.
    //student[@id="1001"]/tutor/name/text()
    
  8. Encontrar los IDs de los estudiantes que están bajo la tutoría de un tutor específico.
     //student[tutor_id="2001"]/id/text()
    

Ejercicios: Lista de Empleados

  1. Obtener los nombres completos de todos los empleados.
//employee/name/text()
  1. Obtener los nombres de los departamentos donde trabajan los empleados que tienen un salario mayor a $50000.
//employee[salary > 50000]/department_id/text()
  1. Contar el número total de empleados que tienen más de 5 años de experiencia.
count(//employee[years_of_experience > 5])
  1. Obtener los nombres completos de los empleados que tienen un supervisor con el ID “2002”.
//employee[supervisor_id = '2002']/name/text()
  1. Obtener los nombres de los empleados que trabajan en el departamento con el ID “D002”.
//employee[department_id = 'D002']/name/text()

Ejercicios XQuery

Ejercicios: Registro de automóviles

  1. Obtener todos los coches:
for $car in doc('cars.xml')/cars/car
return $car
  1. Obtener los modelos de todos los coches de la marca “Toyota”:
for $car in doc('cars.xml')/cars/car[brand = 'Toyota']
return $car/model/text()
  1. Contar el número total de coches vendidos:
sum(doc('cars.xml')/cars/car/sales)
  1. Obtener los coches vendidos en el año 2020:
for $car in doc('cars.xml')/cars/car[year = 2020]
return $car
  1. Encontrar el coche más vendido:
let $max-sales := max(doc('cars.xml')/cars/car/sales)
return doc('cars.xml')/cars/car[sales = $max-sales]
  1. Listar las marcas de coches disponibles:
distinct-values(doc('cars.xml')/cars/car/brand)
  1. Obtener los coches cuyas ventas están entre 15000 y 20000:
for $car in doc('cars.xml')/cars/car[sales >= 15000 and sales <= 20000]
return $car
  1. Encontrar el año del coche más antiguo:
min(doc('cars.xml')/cars/car/year)
  1. Obtener los modelos de coches ordenados alfabéticamente:
for $car in doc('cars.xml')/cars/car
order by $car/model
return $car/model/text()
  1. Calcular el total de ventas de coches de la marca “Ford”:
sum(doc('cars.xml')/cars/car[brand = 'Ford']/sales)
  1. Encontrar los coches cuyo precio es mayor a $30000:
for $car in doc('cars.xml')/cars/car[price > 30000]
return $car
  1. Obtener el color de los coches vendidos en el año 2019:
for $car in doc('cars.xml')/cars/car[year = 2019]
return $car/color/text()
  1. Listar los coches ordenados por precio de menor a mayor:
for $car in doc('cars.xml')/cars/car
order by $car/price
return $car
  1. Encontrar los coches con menos de 10000 millas recorridas:
for $car in doc('cars.xml')/cars/car[mileage < 10000]
return $car
  1. Contar el número total de coches de color rojo:
count(doc('cars.xml')/cars/car[color = 'Red'])
  1. Obtener los coches de la marca “Toyota” vendidos en el año 2020:
for $car in doc('cars.xml')/cars/car[brand = 'Toyota' and year = 2020]
return $car
  1. Encontrar el coche más caro:
let $max-price := max(doc('cars.xml')/cars/car/price)
return doc('cars.xml')/cars/car[price = $max-price]
  1. Obtener los coches cuyo año de fabricación sea anterior a 2017:
for $car in doc('cars.xml')/cars/car[year < 2017]
return $car
  1. Calcular el promedio de millas recorridas por los coches:
avg(doc('cars.xml')/cars/car/mileage)
  1. Encontrar los modelos de coches que tienen un precio mayor a $25000:
for $car in doc('cars.xml')/cars/car[price > 25000]
return $car/model/text()

Ejercicios: Registro de Películas

  1. Obtener el título de una película específica.
    for $movie in //movies/movie[@id="1"]
    return $movie/title/text()
    
  2. Listar los directores de las películas de un género determinado.
    for $movie in //movies/movie[genre="Drama"]
    return $movie/director/text()
    
  3. Encontrar los títulos de las películas que tienen una calificación superior a 8.
    for $movie in //movies/movie[number(rating) > 8]
    return $movie/title/text()
    
  4. Obtener los años de lanzamiento de las películas dirigidas por un director específico.
    for $movie in //movies/movie[director="Francis Ford Coppola"]
    return $movie/year/text()
    
  5. Encontrar los géneros de las películas que fueron lanzadas después de 2000.
    for $movie in //movies/movie[number(year) > 2000]
    return $movie/genre/text()
    

Ejercicios: Registro de Libros

  1. Obtener el autor de un libro específico.
    for $book in //books/book[@id="1"]
    return $book/author/text()
    
  2. Listar los títulos de los libros de un género determinado.
    for $book in //books/book[genre="Dystopian"]
    return $book/title/text()
    
  3. Encontrar los autores de los libros que tienen una calificación superior a 4.5.
    for $book in //books/book[number(rating) > 4.5]
    return $book/author/text()
    
  4. Obtener los años de publicación de los libros escritos por un autor específico.
    for $book in //books/book[author="Harper Lee"]
    return $book/year/text()
    
  5. Encontrar los géneros de los libros que fueron publicados después de 2000.
    for $book in //books/book[number(year) > 2000]
    return $book/genre/text()
    

Ejercicios: Registro de Canciones

  1. Obtener el título de una canción específica.
    for $song in //songs/song[@id="1"]
    return $song/title/text()
    
  2. Listar los artistas de las canciones de un género determinado.
    for $song in //songs/song[genre="Pop"]
    return $song/artist/text()
    
  3. Encontrar los títulos de las canciones que tienen una calificación superior a 4.7.
    for $song in //songs/song[number(rating) > 4.7]
    return $song/title/text()
    
  4. Obtener los años de lanzamiento de las canciones interpretadas por un artista específico.
    for $song in //songs/song[artist="Queen"]
    return $song/year/text()
    
  5. Encontrar los géneros de las canciones que fueron lanzadas después de 2000.
    for $song in //songs/song[number(year) > 2000]
    return $song/genre/text()
    

Ejercicios: Registro de Estudiantes

  1. Obtener los nombres completos de todos los estudiantes.
    for $student in //student
    return $student/name/text()
    
  2. Obtener el nombre completo de los estudiantes que tienen una calificación superior a 90 en matemáticas.
    for $student in //student[grades/subject[@name='Math']/grade > 90]
    return $student/name/text()
    
  3. Contar el número total de estudiantes que están en el curso “CS101”.
    count(//student[course_id = 'CS101'])
    
  4. Obtener los nombres completos de los estudiantes que tienen más de 3 ausencias.
    for $student in //student[absences > 3]
    return $student/name/text()
    
  5. Obtener el nombre completo de los estudiantes que tienen un tutor con el ID “2001”.
    for $student in //student[tutor_id = '2001']
    return $student/name/text()
    
  6. Obtener la calificación de un estudiante específico en una asignatura dada.
    //student[@id="1001"]/grades/subject[@name="Math"]/grade/text()
    
  7. Listar los nombres de los profesores de un curso determinado.
    //course[@name="Computer Science"]/professor/name/text()
    
  8. Encontrar los nombres de los estudiantes que tienen más de 90 en cualquier asignatura.
    for $student in //student[grades/subject/grade > 90]
    return $student/name/text()
    
  9. Obtener los nombres de los estudiantes que están matriculados en un curso específico.
    for $student in //student[course_id="CS101"]
    return $student/name/text()
    
  10. Encontrar el nombre del curso en el que está inscrito un estudiante con un ID específico.
    //course[student_id="1001"]/name/text()
    
  11. Encontrar los estudiantes que tienen más de 3 ausencias.
    for $student in //student[absences > 3]
    return $student/name/text()
    
  12. Obtener el nombre del tutor de un estudiante específico.
    //student[@id="1001"]/tutor/name/text()
    
  13. Encontrar los IDs de los estudiantes que están bajo la tutoría de un tutor específico.
    //student[tutor_id="2001"]/id/text()
    

Ejercicios Lista de Empleados

  1. Obtener los nombres completos de todos los empleados.
    for $employee in //employee
    return $employee/name/text()
    
  2. Obtener los nombres de los departamentos donde trabajan los empleados que tienen un salario mayor a $50000.
    for $employee in //employee[salary > 50000]
    return $employee/department_id/text()
    
  3. Contar el número total de empleados que tienen más de 5 años de experiencia.
    count(//employee[years_of_experience > 5])
    
  4. Obtener los nombres completos de los empleados que tienen un supervisor con el ID “2002”.
    for $employee in //employee[supervisor_id = '2002']
    return $employee/name/text()
    
  5. Obtener los nombres de los empleados que trabajan en el departamento con el ID “D002”.
    for $employee in //employee[department_id = 'D002']
    return $employee/name/text()