Или вы можете сделать это полностью из индексов:)
for $c in doc()//colors
может привести к ошибке РАСШИРЕННОЕ КУШКА ДЕРЕВА в больших наборах данных.
Вот несколько более сложный способ атаковать это, когда данные огромны, убедитесь, что URI Lexicon включен *1009*, а затем добавьте индекс диапазона элемента на элемент color и вычислить различные значения цвета, которые имеют дублирование где-то . Затем зацикливайте только те документы, которые имеют этот цвет один за другим, и вычисляйте значения частоты элементов для интересующих цветов в документах. Если вы получаете частоту более 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
Надеюсь, это поможет.