[英]Marklogic: Find documents containing elements without a particular attribute (maybe many per document)
我有一些看起來像這樣的數據:
<wrapper>
<inner a="1"/>
<inner a="2" b="3"/>
</wrapper>
屬性 b 可能出現在每個內部元素上,也可能不出現。 我的目標是找到所有包含至少一個沒有屬性 b 的內部元素的文檔。*
這個類似的問題提出了答案:
cts:not-query(cts:element-attribute-value-query(xs:QName('inner'), xs:QName('b'), '*', ("wildcarded"))))
但這不起作用,因為同一文檔上的某些內部元素可能具有屬性 b,並且非查詢適用於整個片段,因此不會返回像上面示例這樣的混合大小寫。 將它包裝在元素查詢中沒有幫助,並且 cts:and-not-query 似乎表現相同。
我還嘗試使用共現/值函數來讀取相關屬性 a 的值來解決該問題,但這似乎也是不可能的。 除了沒有元素文本之外,在共現調用上使用鄰近設置可能是可能的,因此屬性使用相同的單詞位置進行索引。
鈍器 xpath 有替代品嗎?
//inner[@a and not(@b)]
如果簡單不是您的目標,您總是可以使 xpath 更復雜。 這個怎么樣:(它更准確地回答了“返回所有包含沒有屬性@b的'innner'元素的文檔”的確切問題
doc()[exists(//inner[not(@b)])]
我不知道這優化得有多好——一些 xpath 表達式優化到等效的 cts: 查詢,而有些則沒有。
還有另一個“技巧”涉及組合表示為地圖的 cts 表達式。 取2次搜索的結果,使用返回結果為map的選項,然后就可以使用這個頁面https://developer.marklogic.com/blog/im-a-map上的操作進行極其高效的set操作(聯合、交叉、差異等)。 如果構建得當,這種技術可以與“本地”cts 搜索一樣快——cts 搜索在內部使用相同的通用技術來解析結果。
使 XPath 成為路徑范圍索引。 //inner[@a and not(@b)]
,或者如果沒有元素文本, //inner[@a and not(@b)]/@a
,然后做
cts:path-range-query('//inner[@a and not(@b)]/@a','>','')
這恰好也允許我們使用cts:values
有效地回答哪些@a
值缺少@b
的問題。
cts:not-in-query
有必要的行為來使這項工作在cts:and-not-query
沒有的地方工作。 例如
cts:not-in-query(
cts:element-query(xs:QName('inner'), cts:true-query()),
cts:element-attribute-query(xs:QName('inner'), xs:QName('b'),'*','wildcarded')
)
在與屬性 b 的 'inner' 元素的位置不匹配的位置處查找所有 'inner' 元素。
必須啟用元素 position 索引。 必須啟用通配符索引。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.