簡體   English   中英

Marklogic:查找包含沒有特定屬性的元素的文檔(每個文檔可能有很多)

[英]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 索引。 必須啟用通配符索引。

http://docs.marklogic.com/cts:not-in-query

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM