2017-06-18 38 views
0

我從來沒有處理過XML數據庫(或以複雜形式查詢XML),所以這個xquery對我來說都是新手。我已經閱讀了Datypic書,我最初試圖將XML解析爲數據庫,但這些標籤有意義,而且關係數據庫增加了更多複雜性。XQuery - 查詢相鄰標記

我有一個包含關於所使用的詞成績單和一些細節上的文件,該結構是這樣的:

<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似乎對此非常有效。

任何幫助表示讚賞!

+0

您是否考慮將示例中的「有三個房屋」更改爲您的示例XML中出現的短語?另外,你能否澄清一下,如果你正在搜索文本節點或'@ hw'中的規範化單詞?最後,你可以鏈接到關於這種格式的任何信息 - 這將解釋許多屬性? (或者如果它們不重要,或許最好將它們從樣本中剝離出來,從而提高信噪比。)對我而言,奇怪的是沒有關於''元素之間的空白的明確信息 - 重要的搜索文本時。 – joewiz

+0

另外,您可否請編輯您的示例文本是格式良好的XML? – joewiz

+0

當我回家時,我會這樣做,感謝您的反饋。這個XML結構是由非技術人員創建的,我很願意接受它。我爲它創建了一個模式,但我同意這很難解析。我能夠處理空白的唯一方法是使用'pos'屬性的規則,但我知道這並不理想。 –

回答

0

使用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),您可以使用新的「滑動窗口」的條款,但我不認爲它使任何答案更簡單比以上。