Ou vous pourriez le faire complètement hors d'index :)
for $c in doc()//colors
est susceptible de créer un ETENDUE TREE CACHE erreur sur des ensembles de données plus importants.
Voici une façon un peu plus compliqué d'attaquer quand les données est énorme, assurez-vous que l'URI Lexicon est activée, puis ajoutez un indice de gamme d'éléments sur l'élément couleur et calculer la couleur distincte valeurs qui ont la duplication quelque part. Ensuite, bouclez seulement les documents qui ont cette couleur un par un et calculez les nombres d'éléments-fréquences des couleurs d'intérêt dans les documents. Si vous obtenez une fréquence supérieure à 1, ce document doit être dédupliqué.
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
Espérons que cela aide.
En fonction de vos besoins de mise à l'échelle, la mémoire sera rapidement épuisée. Voir l'approche index seulement ci-dessous – derickson