Дерево навигационных выражений

From <XAnswer Wiki>

Английский термин: Path tree


Contents

Определение

Дерево навигационных выражений (ДНВ) -- широко известная и используемая структура в области управления слабоструктурированными данными. Является вариантом путеводителя по данным (ПД). В отличие от ПД, дуги в ДНВ не помечаются (все дуги обозначают отношение предок-потомок), названия XML элементов хранятся в узлах. Кроме этого, в узлах также может храниться число, равное количеству стянутых в узел элементов исходного документа. ДНВ всегда строится на основе какого-то документа, не существует абстрактного ДНВ.

Использование

Название соответствует сути структуры: в ДНВ представлены ВСЕ возможные пути исходного документа, и только они. Благодаря этому свойству, ДНВ (в совокупности с числом стянутых в узел элементов) является очень полезным инструментом работы с данными. Так ДНВ широко используется в качестве основы для индексов, статистических структур.

Пример

Пример построения ДНВ (справа) из исходного документа (слева): path-tree.gif

XQuery запрос для построения ДНВ

Условие "$deep < 10" приводит к построению ДНВ глубины не больше чем 9. Это нужно для текущей версии eXist, который неправильно обрабатывает пустые (типа <smth/>) теги.

declare function local:pathtree($seq, $deep) {
  if (count($seq) and $deep < 10) then
    let $names := distinct-values($seq/name())
    let $newdeep := $deep + 1
    for $nm in $names
      let $nodes := $seq[name() = $nm]
      let $nextnodes := $nodes/*
    return
      element {$nm} {
        attribute {"c"} {count($nodes)},
        attribute {"d"} {$deep},
        local:pathtree($nextnodes,$newdeep)
      }
  else
    ""
};

local:pathtree(doc("/db/samples/shakespeare/r_and_j.xml")/PLAY, 0)


Смотрите также