Методические указания к выполнению ЛР4 - Полуструктурированные данные в формате XML и запросы к ним, отображение в реляционную модель
Описание файла
Документ из архива "Методические указания к выполнению ЛР4 - Полуструктурированные данные в формате XML и запросы к ним, отображение в реляционную модель", который расположен в категории "". Всё это находится в предмете "постреляционные базы данных" из 10 семестр (2 семестр магистратуры), которые можно найти в файловом архиве МГТУ им. Н.Э.Баумана. Не смотря на прямую связь этого архива с МГТУ им. Н.Э.Баумана, его также можно найти и в других разделах. Архив можно найти в разделе "лабораторные работы", в предмете "постреляционные базы данных" в общих файлах.
Онлайн просмотр документа "Методические указания к выполнению ЛР4 - Полуструктурированные данные в формате XML и запросы к ним, отображение в реляционную модель"
Текст из документа "Методические указания к выполнению ЛР4 - Полуструктурированные данные в формате XML и запросы к ним, отображение в реляционную модель"
Методические указания к лабораторной работе «Полуструктурированные данные в формате XML и запросы к ним, отображение в реляционную модель » по дисциплине «Постреляционные базы данных»
Виноградова М.В.
Введение
Учебно-методические материалы «Полуструктурированные данные в формате XML и запросы к ним, отображение в реляционную модель» представляют собой методические указания к лабораторной работе по дисциплине «Постреляционные базы данных».
В теоретической части материалов рассмотрены принципы построения запросов к XML-данным на языке XQuery и Xpath. Приведено краткое описание языковых конструкций для работы в среде СУБД Microsoft SQL Server. Рассмотрены примеры различных запросов по извлечению,изменению данных и преобразованию к реляционной модели. В заключительной части методических указаний приведены контрольные вопросы, список рекомендуемой литературы и пример задания.
Ознакомившись с методическими указаниями и разобрав приведенные в нем примеры, студент может получить у преподавателя свой вариант задания и приступить к его выполнению.
Оглавление
Введение 1
Цель работы 2
Время выполнения 2
Теоретическая часть 2
Выражения XQuery 2
Выражения пути 3
Предикаты 4
Конструкторы элементов 6
Итерация и сортировка 8
Арифметические операции 9
Условные выражения 9
XML и Xquery в MS SQL Server 11
Преобразование XML и реляционных данных 11
Выполнение запросов 11
Преобразование реляционных данных в формат XML 11
Варианты вывода в XML: 12
Преобразование XML-документа в реляционную таблицу 17
Построение запросов к XML данным с помощью языка Xquery 19
Запросы на языке Xquery с применением FLWOR 22
Пример задания 24
Содержание отчета 25
Вопросы для самопроверки 25
Литература 26
Цель работы
-
Изучить различные технологии работы с XML.
-
Освоить методы работы с XML в постреляционных СУБД.
-
Получить навыки работы с инструментальными средствами СУБД.
Время выполнения
Время выполнения лабораторной работы 2 часа.
Теоретическая часть
XQuery — язык запросов, разработанный для обработки данных в формате XML. XQuery использует XML как свою модель данных. XQuery — функциональный язык, состоящий из нескольких видов выражений, которые могут использоваться в разных сочетаниях. Язык базируется на системе типов XML Schema и совместим с другими стандартами, связанными с XML.
Выражения XQuery
Подобно XML и XPath, в XQuery различаются прописные и строчные буквы, а все ключевые слова состоят из строчных букв. Символы, заключенные между «{—» и «—}» считаются комментариями и при обработке запроса игнорируются (конечно, кроме тех случаев, когда они входят в строку, заключенную в кавычки, и считаются частью этой строки).
Простейший вид выражения XQuery — литерал (literal), который представляет атомарное значение.
Атомарные значения других типов могут создаваться путем вызова конструкторов. Конструктор (constructor) представляет собой функцию, которая создает значение определенного типа на основе строки, содержащей лексическое представление значения этого типа. В общем случае конструктор имеет то же имя, что и тип, значения которого он конструирует. Ниже конструктор используется для создания значения типа date.
date(«2012-12-22»)
Переменная (variable) в XQuery — имя, начинающееся со знака доллара. Переменная может быть связана со значением и использоваться в выражении для представления этого значения. Один из способов связывания переменной состоит в использовании выражения LET, которое связывает одну или несколько переменных, а затем вычисляет внутреннее выражение. Значение выражения LET — результат вычисления внутреннего выражения со связанными переменными. Следующий пример иллюстрирует выражение LET, которое возвращает последовательность 1, 2, 3.
let $start := 1, $stop := 3
return $start to $stop
Выражение LET — частный случай выражения FLWR (for, let, where, return), которое обеспечивает дополнительные способы связывания переменных.
Выражения пути
Выражения пути в XQuery базируются на синтаксисе XPath. Выражение пути состоит из серии шагов, разделенных символом слэша («/»). Результат каждого шага — последовательность узлов. Значение выражения пути — последовательность узлов, которая формируется на последнем шаге.
Каждый шаг вычисляется в контексте некоторого узла, называемого контекстным узлом (context node). В общем случае шаг может быть любым выражением, возвращающим последовательность узлов. Один из важных видов шага, называемый осевым шагом (axis step), можно считать перемещением от контекстного узла по иерархии узлов в некотором направлении, называемом осью (axis). При перемещении по указанной оси осевой шаг выбирает узлы, которые удовлетворяют критерию выбора. Критерий выбора может выбирать узлы на основе их имен, положения по отношению к контекстному узлу или предикату, базирующемуся на значении узла. В XPath определяются 13 осей, и часть из них или все будут поддерживаться и в XQuery. Пока планируется реализовать в XQuery поддержку шести осей: child, descendant, parent, attribute, self и descendant-or-self.
Выражения пути могут быть записаны в полном или в сокращенном синтаксисе. Полный синтаксис для осевого шага предусматривает указание оси и критерия выбора, разделенных парой двоеточий. Q1 иллюстрирует четырехшаговое выражение пути, оформленное в полном синтаксисе. На первом шаге вызывается встроенная функция document, которая возвращает узел-документ документа items.xml. Второй шаг — осевой шаг, который находит всех потомков узла-документа («*» выбирает все узлы на данной оси; в данном случае будет выбран единственный узел-элемент с именем items). Третий шаг снова выполняет поиск вдоль оси child, чтобы найти на следующем уровне все элементы-потомки с именем item, которые, в свою очередь, имеют потомков с именем seller и значением «Smith». Результатом третьего шага является последовательность узлов-элементов item. Каждый из этих узлов item служит контекстным узлом для четвертого шага, который опять предусматривает поиск по оси child элементов description, являющихся потомками данного item. Окончательный результат выражения пути — результат четвертого шага: последовательность узлов-элементов description, перечисленных в порядке документа.
(Q1) Перечислить описания всех товаров, предлагаемых к продаже Смитом.
document("items.xml")/child::*
/child::item [child::seller = "Smith"]
/child::description
На практике, выражения пути часто записываются с помощью сокращенного синтаксиса. Пожалуй, наиболее важным является то, что спецификатор оси может быть пропущен в том случае, когда используется ось child. Поскольку child является наиболее часто используемой осью, такое сокращение помогает сократить длину многих выражений пути. К примеру, Q1 можно сократить следующим образом:
document("items.xml")
/*/item[seller = "Smith"]/description
Разделение двух шагов двойным, а не одинарным слэшем означает, что второй шаг может выполнять поиск в нескольких уровнях иерархии, используя для этого ось descendants, а не одноуровневую ось child. Так, Q2 выполняет поиск элементов description, которые являются потомками (необязательно прямыми) корневого узла данного документа. Результат Q2 — это последовательность узлов-элементов, которые могут, в принципе, быть найдены на различных уровнях иерархии узлов (хотя в нашем примере все узлы description находятся на одном и том же уровне).
(Q2) Перечислить все элементы описания товаров, имеющиеся в документе items.xml.
document(«items.xml»)//description
В выражении пути одинарная точка («.») указывает на контекстный узел, а две последовательные точки («..») — на предка контекстного узла. Эти нотации представляют собой сокращенное указание осей self и axes соответственно. Имена, присутствующие в выражениях пути, как правило, интерпретируются как имена узлов-элементов, однако если имя имеет префикс «@», оно интерпретируется как имя узла-атрибута. Это сокращение для шага, который выполняет поиск вдоль оси attribute. Эти аббревиатуры иллюстрируются в Q3, где поиск начинается с узла, связанного с переменной $description, вдоль оси parent к родительскому узлу item, а затем — вдоль оси attribute в поисках атрибута с именем status. Результатом Q3 является единственный узел-атрибут.
(Q3) Найти атрибут статуса для товара, который является предком данного описания товара.
$description/../@status
Предикаты
В XQuery предикат (predicate) — это заключенное в квадратные скобки выражение, которое используется для фильтрации последовательности значений. Предикаты часто применяются в шагах выражения пути. Например, в шаге item[seller = «Smith»] фраза seller = «Smith» — это предикат, который применяется для выбора определенных узлов item и отбрасывания остальных. Будем называть объекты последовательности, фильтруемые с помощью предиката, объектами-кандидатами. Предикат вычисляется для каждого объекта-кандидата с использованием этого объекта-кандидата в качестве контекстного объекта для вычисления выражения предиката. Термин «контекстный объект» — это обобщение термина «контекстный узел», и ему может соответствовать как узел, так и атомарное значение. В предикатном выражении одинарная точка («.») обозначает контекстный объект. Каждый объект-кандидат выбирается или отвергается в соответствии со следующими правилами.
Если в результате вычисления предикатного выражения получается булевское значение, то объект-кандидат выбирается в том случае, если значение предикатного выражение равно true. Этот тип предиката иллюстрируется в примере, где выбираются узлы item, имеющие узел-потомок reserve-price, чье значение больше 1000:
item [reserve-price > 1000]
Если результатом вычисления предикатного выражения является число, то объект-кандидат выбирается в том случае, если его порядковый номер в списке объектов-кандидатов равен этому числу. Такой тип предиката представлен в примере, где выбирается пятый узел item по оси child:
item [5]
Если в результате вычисления предикатного выражения получается пустая последовательность, объект-кандидат отвергается. Однако если результат вычисления предикатного выражения представляет собой последовательность, содержащую хотя бы один узел, объект-кандидат выбирается. Такая форма предиката может применяться для проверки существования узла-потомка, удовлетворяющего некоторому условию. Это иллюстрирует пример, где выбираются узлы item, у которых имеется узел-потомок reserve-price, вне зависимости от его значения:
item [reserve-price]
Внутри предикатов часто используется несколько видов операций и функций.
Операции сравнения значений (value comparison operator): eq, ne, lt, le, gt, ge. Эти операции могут сравнивать два скалярных значения, но порождают ошибку, если любой из операндов является последовательностью с длиной, большей единицы. Если один из операндов — узел, то прежде, чем выполнить сравнение, операция сравнения значений извлекает его значение. Например, item[reserve-price gt 1000] выбирает узел item только в том случае, если он имеет в точности один узел-потомок reserve-price со значением, большим 1000.
Общие операции сравнения (general comparison operator): =, !=, >, >=, <, <=. Эти операции могут работать с операндами, которые представляются собой последовательности, при условии неявного наличия семантики «существования» для обоих операндов. Как и операции сравнения значений, общие операции сравнения автоматически извлекают значения узлов. Например, item[reserve-price = 1000] выбирает узел item, если у него имеется хотя бы один узел-потомок со значением, большим 1000.
Операции сравнения узлов (node comparison operator): is и isnot. Эти операторы определяют идентичность двух узлов. Например, $node1 is $node2 принимает значение «истина», если переменные $node1 и $node2 связаны с одним и тем же узлом (т. е. для обеих переменных узел один и тот же).
Операции сравнения порядка (order comparison operator). Эти операции сравнивают позиции двух узлов. Например, $node1 << $node2 принимает значенией true, если узел, связанный с $node1, в порядке документа встречается раньше, чем узел, связанный с $node2.
Логические операции (logical operator): and и or. Эти операции могут использоваться для объединения логических условий в предикате. Например, следующий предикат выбирает узлы item, имеющие ровно один элемент-потомок seller со значением «Smith», а также, по крайней мере, один элемент-потомок reserve-price с любым значением.
item [seller eq «Smith» and reserve-price].