【问题标题】:XQuery - Query neighbouring tagsXQuery - 查询相邻标签
【发布时间】:2017-06-18 17:04:37
【问题描述】:

我从未处理过 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

但我终其一生都无法弄清楚如何查询多个词。 IE。 “有三间房子”。这将涉及检查每个单词是否相邻并且不在单独的u 标记中。理想情况下,我也可以在前后抓住几句话。到目前为止,我认为由于结构原因这很困难,但搜索普通文件需要 6 秒以上,而 BaseX 似乎对此非常有效。

感谢任何帮助!

【问题讨论】:

  • 您是否考虑将示例“有三间房屋”更改为示例 XML 中出现的短语?另外,您能否澄清一下您是在尝试搜索文本节点还是@hw 中的规范化单词?最后,您能否链接到有关这种格式的任何信息 - 可以解释许多属性的东西? (或者如果它们不重要,也许最好将它们从您的样本中去除,从而提高信噪比。)对我来说奇怪的是,&lt;w&gt; 元素之间没有关于空白的明确信息 - 重要搜索文本时。
  • 另外,您能否将示例文本编辑为格式正确的 XML?
  • 我回家后会这样做,感谢您的反馈。这个 xml 结构是由非技术人员创建的,我受此约束。我已经为它创建了一个模式,但我同意它很难解析。我能够处理空白的唯一方法是在 pos 属性上使用规则,但我知道这并不理想。

标签: xml xquery basex


【解决方案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),您可以使用新的“用于滑动窗口”子句,但我认为它不会比上述更简单。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-07-12
    • 2017-12-03
    • 2015-01-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多