XQuery — запрос соседних тегов

Я никогда не имел дело с базами данных XML (или запрашивал XML в сложной форме), поэтому этот xquery для меня совершенно новый. Я прочитал книгу Datypic и изначально пытался разобрать XML в базу данных, но теги имеют значение, а реляционная база данных добавляет сложности.

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

<text id="KBY">
  <bncDoc xml:id="KBY">
    <stext type="CONVRSN">
      <u who="KBYPSUNK">
        <w tag="UH" hw="hi" pos="INTERJ" sem="Z4" semo="|Z4|">Hi</w>
        <w tag="YEX" hw="PUNC" pos="STOP" sem="" semo="|">!</w>
      </u>
      <u who="PS10L">
        <w tag="VVGK" hw="going" pos="VERB" sem="T1:1:3" semo="|T1:1:3|">Gon</w>
        <w tag="TO" hw="to" pos="PREP" sem="Z5" semo="|Z5|">na</w>
        <w tag="RR21" hw="at" pos="ADV" sem="A13:7" semo="|A13:7;i1:2:1|">at</w>
        <w tag="RR22" hw="least" pos="ADV" sem="A13:7" semo="|A13:7;i1:2:2|A13:7|">least</w>
        <w tag="VVI" hw="stop" pos="VERB" sem="T2" semo="|T2d|S8d|M8|H4|A1:1:1|">stop</w>
        <w tag="II" hw="at" pos="PREP" sem="Z5" semo="|Z5|">at</w>
        <w tag="NP1" hw="gerald" pos="SUBST" sem="Z1" semo="|Z1m|">Gerald</w>
        <w tag="GE" hw="'s" pos="UNC" sem="Z5" semo="|Z5|">'s</w>
        <w tag="VHZ" hw="have" pos="VERB" sem="Z5" semo="|Z5|A9u|A2:2|S4|">has</w>
        <w tag="XX" hw="not" pos="ADV" sem="Z6" semo="|Z6|">n't</w>
        <w tag="PPHS1" hw="he" pos="PRON" sem="Z8" semo="|Z8m|">he</w>
        <w tag="YQUE" hw="PUNC" pos="STOP" sem="" semo="|">?</w>
      </u>

Тривиально, я знаю, что могу запросить отдельные слова, используя:

for $w in //w
where $w = "houses"
return $w

OR

for $w in //w//text()
where $w = "houses"
return $w

Но я не могу, на всю жизнь, понять, как я могу запросить более одного термина. т.е. «Было три дома». Это потребует проверки того, что каждое слово является соседним и не находится в отдельном теге u. В идеале я мог бы ухватить несколько слов до и после. До сих пор я предполагаю, что это сложно из-за структуры, но поиск простого файла занимает> 6 секунд, и BaseX кажется очень эффективным с этим.

Любая помощь приветствуется!


person Christopher Gwilliams    schedule 18.06.2017    source источник
comment
Не могли бы вы изменить свой пример. Фраза, которая встречается в вашем примере XML, содержала три дома? Кроме того, не могли бы вы уточнить, пытаетесь ли вы искать текстовые узлы или нормализованные слова в @hw? Наконец, не могли бы вы дать ссылку на какую-либо информацию об этом формате — что-то, что могло бы объяснить многие атрибуты? (Или, если они не важны, возможно, лучше удалить их из вашего образца, улучшив отношение сигнал/шум.) Что мне странно, так это то, что нет явной информации о пробелах между <w> элементами - важно при поиске текст.   -  person Joe Wicentowski    schedule 18.06.2017
comment
Кроме того, не могли бы вы отредактировать образец текста, чтобы он был правильно сформированным XML?   -  person Joe Wicentowski    schedule 18.06.2017
comment
Дома сделаю, спасибо за отзыв. Эта структура xml была создана нетехническими людьми, и я привязан к ней. Я создал для него схему, но согласен, что ее сложно разобрать. Единственный способ, которым я смог справиться с пробелами, — это использовать правила для атрибута pos, но я знаю, что это не идеально.   -  person Christopher Gwilliams    schedule 19.06.2017


Ответы (1)


С XQuery 1.0 вы можете сделать что-то вроде

for $x at $p in w 
where string-join(subsequence(w, $p, 4), ' ') = "There were three houses"
return ...

В XQuery 3.0 (или 3.1) вы можете использовать новое предложение «для скользящего окна», но я не думаю, что это делает ответ проще, чем приведенный выше.

person Michael Kay    schedule 18.06.2017