【问题标题】:How to identify duplicate records in MarkLogic如何识别 MarkLogic 中的重复记录
【发布时间】:2022-01-05 12:25:08
【问题描述】:

我想在 MarkLogic 中识别具有重复值的文档。我有一个像下面这样的 xml,BillNo 是文档的主键,我需要找出是否有任何文档具有重复的 BillNo 即。在多个文档中多次出现相同的BillNo

<BillData>
  <Date>20211112</Date>
  <BillNo>123</BillNo>
  <Description>ABC</Description>
</BillData>

我正在使用 XQuery 进行编码

【问题讨论】:

    标签: xquery marklogic


    【解决方案1】:

    如果您在 BillNo 上有一个范围索引,那么您可以使用 cts:values() 获取不同的 BillingNo 值列表,并使用 cts:frequency() 过滤多次出现的值:

    for $value in cts:values(cts:element-reference(xs:QName("BillNo")))
    where cts:frequency($value) gt 1
    return $value
    

    如果您想列出具有相同 BillingNo 的文档的 URI,那么您可以将 cts:element-value-co-occurrences 用于 BillingNoxdmp:document。如果您使用map 选项将结果作为映射返回,其中BillingNo 作为键,文档URI 作为值,您可以删除只有一个对应URI 的条目,并且然后会有一个地图,其中列出了多个文档中使用的BillingNo 及其 URI。

    let $co-occurrences := cts:element-value-co-occurrences(xs:QName("BillNo"), xs:QName("xdmp:document"), "map")
    let $_remove_entries_with_only_one_uri :=
      for $key in map:keys($co-occurrences)
      where map:get($co-occurrences, $key) => tail()
      return map:put($co-occurrences, $key, ())
    return
      $co-occurrences
    

    如果您没有索引,那么您可能可以执行这样的操作,但会冒扩展树缓存错误的风险:

    let $dups := map:new()
    let $_ :=
      for $value in /BillData/BillNo/string()
      return map:put($dups, $value, head((map:get($dups, $value), 0)) + 1)
    let $values-by-count := -$dups  
    let $_remove_entries_with_only_one_uri:= map:put($values-by-count, "1", ())
    return 
    (: flip the map back to values as keys, get BillingNo that have occurred multiple times :)
      map:keys(-$values-by-count)
    

    【讨论】:

    • 您还可以按频率顺序返回值,以便首先列出值出现的最高频率。如果第一个返回值的频率为 1,那么您就不必费心检查序列的其余部分了。
    猜你喜欢
    • 2020-11-10
    • 1970-01-01
    • 2010-10-14
    • 1970-01-01
    • 2020-08-01
    • 1970-01-01
    • 2018-10-04
    • 2015-10-30
    • 2012-07-01
    相关资源
    最近更新 更多