繁体   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