Открыть сервис

XQuery Update Facility

XQuery Update Facility — это расширение языка запросов XQuery, предоставляющее возможность создания, изменения и удаления данных (нодам, их содержимому и структуре) в XML-документах. В отличие от базового XQuery, который предназначен только для чтения и формирования результатов запросов (функциональный подход), XQuery Update Facility вводит понятие обновляющих выражений (updating expressions) и модифицирующих функций, позволяя выполнять операции, изменяющие состояние данных в источнике (например, в базе данных XML или на файловой системе). Формально специфицирована консорциумом World Wide Web Consortium (W3C) в качестве отдельного документа «XQuery Update Facility 1.0» (рекомендация W3C от 17 марта 2011 года).

История

Первый рабочий проект спецификации XQuery Update Facility был опубликован W3C в 2007 году. Необходимость создания отдельного расширения была вызвана недостаточностью чисто функционального XQuery для реальных задач по управлению XML-данными: базовые запросы не могли изменять базу данных, а для модификации требовались либо отдельные языковые интерфейсы (например, XSLT для преобразований на выходе), либо встроенные средства конкретной СУБД. После нескольких лет обсуждений и рецензирования окончательная версия 1.0 была утверждена в 2011 году. Работа над версией 1.1 велась до 2013 года, но официальной рекомендации 1.1 не получила; в 2020-х годах разработка была фактически заморожена. Основные положения первой версии реализованы в ряде существующих процессоров XQuery (например, MarkLogic, BaseX, eXist-db, Saxon — в режиме XSLT/XQuery 3.0 с поддержкой update). В 2022 году W3C возобновил дискуссии о возможной новой версии, однако до 2024 года официальных проектов не опубликовано.

Ключевые понятия

Обновляющие выражения (Updating Expressions)

XQuery Update Facility вводит четыре типа обновляющих выражений, каждое из которых изменяет XML-дерево:

Эти выражения могут использоваться как в скриптах (XQuery Scripting Extension, не входящий в базовый стандарт), так и внутри блоков let / for с помощью ключевого слова updating или специальных обновляющих функций.

Могутые выражения (Snapshot, Pending Update List)

Выполнение обновляющего выражения происходит не мгновенно, а через формирование списка ожидающих обновлений (Pending Update List, PUL). Каждое обновляющее выражение порождает запись в PUL, а затем, после завершения всей последовательности обновлений (например, внутри одного flwor-выражения с предикатом updating), эти изменения применяются к исходному документу как атомарная операция (транзакция). Если какая-либо часть обновления не может быть выполнена (например, нарушение целостности), список отбрасывается, и исходное состояние восстанавливается. Такая модель гарантирует изоляцию и согласованность данных.

Модифицирующие функции (Updating Functions)

Пользовательские и встроенные функции могут быть объявлены с пометкой %updating (или аналогичным синтаксисом в конкретных реализациях), что указывает на их способность изменять данные. Такие функции могут вызывать обновляющие выражения и возвращать только пустые последовательности (не допускается возврат не-обновляющего результата), что отделяет их от чистых функций. Например, функция, увеличивающая цену товара на 10%, может быть написана с использованием replace node — она должна быть помечена как обновляющая.

Основные особенности

Синтаксис

Базовый синтаксис обновляющих выражений близок к естественному языку:

Выражения могут комбинироваться с обычными выражениями XQuery (например, for $x in //item where $x/price > 100 return delete node $x), что позволяет выполнять массовые обновления.

Ограничения

Модель данных

XQuery Update Facility основана на модели данных XQuery 1.0 (XDM). Все модификации производятся над копиями документа (или его фрагментами), которые затем атомарно заменяют исходное состояние. Это обеспечивает изоляцию от одновременных запросов: пока обновление не завершено, другие запросы видят старую версию документа.

Применение

Базы данных XML

Основная область применения — системы управления базами данных (СУБД)/native XML-базы (например, BaseX, eXist-db, MarkLogic). С их помощью администраторы и разработчики могут выполнять вставку новых записей, массовое обновление полей, удаление устаревших данных и переименование элементов без необходимости писать процедуры на внешних языках (Java, PHP) и без потери производительности — все манипуляции выполняются на уровне сервера.

Обработка XML-документов в памяти

XQuery Update Facility может использоваться в библиотеках обработки XML (например, Saxon/C для .NET) для модификации XML-документов, загруженных в память. Это позволяет писать скрипты-трансформации, в которых документ последовательно изменяется: удаляются нежелательные секции, вставляются новые данные, меняются значения атрибутов. Результат можно сохранить обратно на диск.

ETL и интеграция

В pipeline-потоках данных (Extract, Transform, Load) XQuery Update Facility может применяться для массового преобразования XML-данных при загрузке в хранилище или при синхронизации между системами. Например, вставка новых записей, замена невалидных символов или переименование полей в соответствии с новой схемой.

Критика и ограничения

Реализации

Пример использования

``xquery (: Удалить все товары с ценой < 10 и увеличить цену остальных на 5% :) let $items := //item return ( delete nodes $items[price < 10], for $item in $items[price >= 10] return replace value of node $item/price with $item/price * 1.05 ) ``

В данном примере сначала формируется PUL, включающий удаление (для дешёвых товаров) и замены значений (для остальных). Если какая-либо операция невозможна (например, удаляемый элемент не существует), все изменения отклоняются, и документ остаётся нетронутым.

Источники

  1. W3C Recommendation, 17 March 2011. «XQuery Update Facility 1.0». (https://www.w3.org/TR/xquery-update-10/)
  2. W3C Working Draft (abandoned), 2013. «XQuery Update Facility 1.1». (https://www.w3.org/TR/2013/WD-xquery-update-11-20130219/)
  3. BaseX Documentation. «Update Operations». (https://docs.basex.org/wiki/Update_Operations)
  4. eXist-db Documentation. «XQuery Update». (https://exist-db.org/exist/apps/fundocs/view.html?uri=http://exist-db.org/xquery/update)
  5. Saxon Documentation. «XQuery Update Facility». (http://www.saxonica.com/documentation/index.html#!updates)
  6. Michael Kay, «XSLT 3.0 and XQuery 3.0», 2014, chapter 17 (Update Facility).
  7. Статья «XQuery Update: The Story So Far» в журнале XML London, 2015.

BFOmetr — база данных и аналитика по компаниям России.

На главную BFOmetr →