Или вы можете сделать это полностью из индексов :)
for $c in doc()//colors
может вызвать ошибку EXPANDED TREE CACHE для больших наборов данных.
Вот немного более сложный способ атаки, когда данные огромны: убедитесь, что лексикон URI включен, а затем добавьте индекс диапазона элементов к элементу >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
Надеюсь, это поможет.
person
Community
schedule
30.07.2013