xquery скобки без FLWOR - PullRequest
       13

xquery скобки без FLWOR

3 голосов
/ 05 декабря 2009

Привет, у меня немного неубедительный вопрос, но я не могу найти ответ.

что произойдет, если я оставлю скобки конструктора недействительными?

, например

{data(doc("somedata.xml")//node[0])}

Я имею в виду, я знаю, что происходит, но как это считается при анализе?

это как?

{
    for $i in "0"
    return
    data(doc("somedata.xml")//node[0])
}

Ответы [ 2 ]

3 голосов
/ 05 декабря 2009

Распространено заблуждение, что любой XQuery является выражением FLWOR. Это неправильное представление возникает, когда люди обращаются к XQuery с точки зрения SQL, рассматривая его как SELECT.

На самом деле это не так; выражение FLWOR во многих отношениях является просто другим выражением. Возможно, выражение FLWOR выполняется как выражение SQL, но это не обязательно так.

XQuery можно рассматривать как функциональный язык программирования (например, Haskell), который имеет некоторые декларативные конструкции (например, where и order by).

Выражение 1+2 - это просто выражение XQuery, которое добавляет числа 1 и 2, вокруг него не должно быть неявного выражения FLWOR.

Если вы хотите рассмотреть XQuery в полностью основанной на кортежах алгебре, то вы можете рассматривать вход как один пустой кортеж. Под этим я подразумеваю следующее.

Посмотрите на этот запрос:

for $x in ...
for $y in ...
where $x/@name=$y/@name
return $x

Если вы рассматриваете это в алгебре на основе кортежей, входом для выражения for будет поток кортежей, определяющих $x и $y. Очевидно, как это может относиться к запросу к базе данных. Это соответствует таблице с двумя столбцами $x и $y и строкой для каждой пары с одинаковыми именами.

Вы могли бы рассмотреть следующий запрос

//foo

как работа с одним кортежем без значений. Это было бы немного похоже на выражение FLWOR без fors или let (просто возвращаемое выражение, если бы это было разрешено). В реляционной земле это будет таблица без столбцов и одной строки. Однако это просто логическая абстракция, и большинство (если не все) реализации XQuery представляют это просто как выражение.

0 голосов
/ 05 декабря 2009

Я не очень понимаю ваш вопрос. Что вы подразумеваете под "оставить скобки конструктора пустыми"?

Ваш запрос - это узел, содержимое которого является выражением. Он анализируется как таковой. Это распространенное заблуждение, что каждое выражение является выражением FLWOR. Выражение FLWOR - это просто другое выражение.

Итак,

<p> {data(doc("somedata.xml")//node[0])}</p>

просто анализируется как

<p> {data(doc("somedata.xml")//node[0])}</p>

Точно так же, как

Console.WriteLine("foo");

не интерпретируется как

foreach (int x in new string[] {"0"})
  Console.WriteLine("foo")

в C #.

Если вам нужно полное расширение формальной семантики, которое является одним из способов интерпретации запроса, то оно выглядит примерно так:

element {p}
{
  fs:item-sequence-to-node-sequence(
    fn:data(
      fs:distinct-doc-order-or-atomic-sequence(
        let $fs:sequence :=
          fs:distinct-doc-order-or-atomic-sequence(
            let $fs:sequence := doc("somedata.xml")
            let $fs:count := count($sequence)
            for $fs:dot at $fs:position in $fs:sequence
            return $fs:dot/descendant-or-self::node())
        let $fs:count := count($fs:sequence)
        for $fs:dot at $fs:position in $fs:sequence
        return item-at($fs:dot/child::node, 0)
      )
    )
  )
} 
...