MarkLogic xml データベースに多数のドキュメントがあります。1つのドキュメントには次のものがあります:
<colors>
<color>red</color>
<color>red</color>
</colors>
複数の色があっても問題ありません。両方とも赤である複数の色を持つことは問題です。データが重複しているドキュメントを見つけるにはどうすればよいですか?
MarkLogic xml データベースに多数のドキュメントがあります。1つのドキュメントには次のものがあります:
<colors>
<color>red</color>
<color>red</color>
</colors>
複数の色があっても問題ありません。両方とも赤である複数の色を持つことは問題です。データが重複しているドキュメントを見つけるにはどうすればよいですか?
MarkLogic が返すものはすべてノードのシーケンスにすぎないため、シーケンス全体のサイズをカウントし、それを個別の値のシーケンスのカウントと比較できます。それらが明確でない場合、それらは重複しており、サブセットがあります。
for $c in doc()//colors
where fn:count($c/color) != fn:count(fn:distinct-values($c/color))
return $c
または、インデックスから完全に実行できます:)
for $c in doc()//colors
大規模なデータ セットではEXPANDED TREE CACHEエラーが発生 する可能性があります。
これは、データが巨大な場合にこれを攻撃するための少し複雑な方法です。URI レキシコンがオンになっていることを確認してから、要素の色に要素の範囲インデックスを追加し、どこかに重複がある個別の色の値を計算します。次に、この色を持つドキュメントのみを 1 つずつループし、ドキュメント内の関心のある色の項目頻度カウントを計算します。頻度が 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
それが役立つことを願っています。
これでうまくいくはずです。私は MarkLogic にあまり詳しくないので、一連のドキュメントを取得する最初の行が間違っている可能性があります。これにより、同じ文字列値を持つ 2 つ以上の色要素を持つすべてのドキュメントが返されます。
for $doc in doc()
let $colors = $doc//color/string(.)
where some $color in $colors
satisfies count($colors[. = $color] > 1)
return doc()
このXMLの場合:
<?xml version="1.0"?>
<colors>
<color>Red</color>
<color>Red</color>
<color>Blue</color>
</colors>
このXSDの使用:
<?xml version="1.0"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method = "text" />
<xsl:strip-space elements="*"/>
<xsl:template match="colors">
<xsl:for-each select="color">
<xsl:variable name="node_color" select="text()"/>
<xsl:variable name="numEntries" select="count(../color[text()=$node_color])"/>
<xsl:if test="$numEntries > 1">
<xsl:text>Color value of </xsl:text><xsl:value-of select="."/><xsl:text> has multiple entries 
</xsl:text>
</xsl:if>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>
私はこの出力を得ました:
Color value of Red has multiple entries
Color value of Red has multiple entries
したがって、少なくともそれらを見つけることができますが、繰り返されるすべての色だけでなく、繰り返される色の各発生を報告します。