Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用XQuery在xml文档中查找重复数据?_Xml_Xquery_Duplicate Data_Marklogic - Fatal编程技术网

如何使用XQuery在xml文档中查找重复数据?

如何使用XQuery在xml文档中查找重复数据?,xml,xquery,duplicate-data,marklogic,Xml,Xquery,Duplicate Data,Marklogic,我在MarkLogic xml数据库中有一堆文档。一份文件包括: <colors> <color>red</color> <color>red</color> </colors> 红色 红色 拥有多种颜色不是问题。有多种颜色都是红色是一个问题。如何找到具有重复数据的文档?这应该可以解决问题。我不太熟悉MarkLogic,因此获取文档集的第一行可能是错误的。这将返回具有2个或更多颜色元素且具有相同字符串值的所有文

我在MarkLogic xml数据库中有一堆文档。一份文件包括:

<colors>
  <color>red</color>
  <color>red</color>
</colors>

红色
红色

拥有多种颜色不是问题。有多种颜色都是红色是一个问题。如何找到具有重复数据的文档?

这应该可以解决问题。我不太熟悉MarkLogic,因此获取文档集的第一行可能是错误的。这将返回具有2个或更多颜色元素且具有相同字符串值的所有文档

用于doc()中的$doc
让$colors=$doc//color/string(.)
其中一些$color在$colors中
满足计数($colors[..=$color]>1)
退货单()
对于此XML:

<?xml version="1.0"?>
<colors>
    <color>Red</color>
    <color>Red</color>
    <color>Blue</color>
</colors>

这样至少可以找到它们,但它会报告每一个重复出现的颜色,而不仅仅是每一个重复出现的颜色

MarkLogic返回的所有内容都只是一个节点序列,因此我们可以计算整个序列的大小,并将其与不同值序列的计数进行比较。如果它们不是不同的,那么它们是重复的,并且你有你的子集

$c在doc()中的
//颜色
其中fn:count($c/颜色)!=fn:计数(fn:不同的值($c/颜色))
返回$c

或者您可以完全不使用索引:)

for$c in doc()//colors
可能会在较大的数据集上创建一个扩展树缓存错误

当数据量很大时,这里有一种稍微复杂一点的方法来解决这个问题,确保打开URI词典,然后在元素颜色上添加元素范围索引,并计算在某个地方有重复的不同颜色值。然后逐个循环遍历具有此颜色的文档,并计算文档中感兴趣的颜色的项目频率计数。如果频率超过1,则此文档需要重复数据消除

let $qn := xs:QName("color")
let $colorsWithItemFreq := cts:element-values($qn, (), ("ascending", "item-order", "item-frequency"))
let $colorsOfInterest := 
    for $color at $i in cts:element-values($qn, (), ("ascending", "item-order", "fragment-frequency"))
    let $fragFrequency := cts:frequency($color)
    let $itemFrequency := cts:frequency($colorsWithItemFreq[$i])
    where $itemFrequency gt $fragFrequency
    return 
        $color

for $uri in cts:uris( (), ("document"), cts:element-value-query($qn, $colorsOfInterest)
let $colorsWithDuplicationInThisDoc :=
    for $color in cts:element-values($qn, (), ("item-frequency"), cts:document-query($uri) )
    where $color = $colorsOfInterest and cts:frequency($color) gt 1
    return
        $color
where fn:count( $colorsWithDuplicationInThisDoc ) gt 1
return
    $uri

希望这会有所帮助。

迭代所有文档是唯一的方法吗?根据您的缩放需要,这会很快耗尽内存。请参见下面的仅索引方法
Color value of Red has multiple entries 
Color value of Red has multiple entries 
let $qn := xs:QName("color")
let $colorsWithItemFreq := cts:element-values($qn, (), ("ascending", "item-order", "item-frequency"))
let $colorsOfInterest := 
    for $color at $i in cts:element-values($qn, (), ("ascending", "item-order", "fragment-frequency"))
    let $fragFrequency := cts:frequency($color)
    let $itemFrequency := cts:frequency($colorsWithItemFreq[$i])
    where $itemFrequency gt $fragFrequency
    return 
        $color

for $uri in cts:uris( (), ("document"), cts:element-value-query($qn, $colorsOfInterest)
let $colorsWithDuplicationInThisDoc :=
    for $color in cts:element-values($qn, (), ("item-frequency"), cts:document-query($uri) )
    where $color = $colorsOfInterest and cts:frequency($color) gt 1
    return
        $color
where fn:count( $colorsWithDuplicationInThisDoc ) gt 1
return
    $uri