2

MarkLogic xml データベースに多数のドキュメントがあります。1つのドキュメントには次のものがあります:

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

複数の色があっても問題ありません。両方とも赤である複数の色を持つことは問題です。データが重複しているドキュメントを見つけるにはどうすればよいですか?

4

4 に答える 4

3

MarkLogic が返すものはすべてノードのシーケンスにすぎないため、シーケンス全体のサイズをカウントし、それを個別の値のシーケンスのカウントと比較できます。それらが明確でない場合、それらは重複しており、サブセットがあります。

for $c in doc()//colors
where fn:count($c/color) != fn:count(fn:distinct-values($c/color))
return $c
于 2010-01-11T22:13:29.937 に答える
2

または、インデックスから完全に実行できます:)

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

それが役立つことを願っています。

于 2013-07-30T01:18:55.117 に答える
2

これでうまくいくはずです。私は MarkLogic にあまり詳しくないので、一連のドキュメントを取得する最初の行が間違っている可能性があります。これにより、同じ文字列値を持つ 2 つ以上の色要素を持つすべてのドキュメントが返されます。

for $doc in doc()
let $colors = $doc//color/string(.)
where some $color in $colors
      satisfies count($colors[. = $color] > 1)
return doc()
于 2009-01-15T10:04:49.100 に答える
1

この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 &gt; 1">
                <xsl:text>Color value of </xsl:text><xsl:value-of select="."/><xsl:text> has multiple entries &#xa;</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 

したがって、少なくともそれらを見つけることができますが、繰り返されるすべての色だけでなく、繰り返される色の各発生を報告します。

于 2009-01-26T19:10:15.010 に答える