【问题标题】:Marklogic: Find documents containing elements without a particular attribute (maybe many per document)Marklogic:查找包含没有特定属性的元素的文档(每个文档可能有很多)
【发布时间】:2019-03-15 23:28:54
【问题描述】:

我有一些看起来像这样的数据:

<wrapper>
  <inner a="1"/>
  <inner a="2" b="3"/>
</wrapper>

属性 b 可能出现在每个内部元素上,也可能不出现。我的目标是找到包含至少一个没有属性 b.* 的内部元素的所有文档。*

This similar question提出答案:

cts:not-query(cts:element-attribute-value-query(xs:QName('inner'), xs:QName('b'), '*', ("wildcarded"))))

但这不起作用,因为同一文档上的 一些 内部元素可能具有属性 b,并且非查询适用于整个片段,因此像上面示例这样的混合情况不会被退回。将其包装在元素查询中没有帮助,并且 cts:and-not-query 的行为方式似乎相同。

我也尝试过使用共现/值函数来读取相关属性 a 的值来解决问题,但这似乎也是不可能的。除了没有元素文本之外,在同现调用上可能使用邻近设置,因此属性使用相同的单词位置进行索引。

blunt xpath 有什么替代品吗?

//inner[@a and not(@b)]

【问题讨论】:

    标签: xquery marklogic


    【解决方案1】:

    使 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 的问题。

    【讨论】:

      【解决方案2】:

      如果简单不是您的目标,您总是可以使 xpath 更复杂。 这个怎么样:(它更准确地回答了'返回所有包含'innner'元素但没有属性@b'的文档'

      doc()[exists(//inner[not(@b)])]
      

      我不知道这优化得有多好——一些 xpath 表达式优化到等效的 cts: query 而有些则没有。

      还有另一个“技巧”涉及组合表示为映射的 cts 表达式。取 2 次搜索的结果,使用将结果作为地图返回的选项,然后您可以使用此页面上的操作https://developer.marklogic.com/blog/im-a-map 进行极其高效的集合操作(​​并、交、差等)。如果构造得当,这种技术可以与“本地”cts 搜索一样快——cts 搜索在内部使用相同的通用技术来解析结果。

      【讨论】:

      • 令人头疼的问题是是否有一个等效的 cts 可以优化到。我认为 cts 搜索无法返回地图?执行QueryA except QueryB 会耗尽树缓存。我很想做ValueMapA - ValueMapB,但似乎没有办法生成 ValueMapB。
      猜你喜欢
      • 2015-01-13
      • 1970-01-01
      • 2016-12-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-08-05
      • 1970-01-01
      • 2011-12-09
      相关资源
      最近更新 更多