2016-03-23 15 views
3

私は、次のCTSの検索クエリを持っている:CTSとxPathの両方が必要ですか?

cts:search(/parent, 
    cts:and-query((
     cts:element-attribute-value-query(xs:QName('parent'), xs:QName('attr'), 'value'), 
     cts:element-attribute-value-query(xs:QName('child'), xs:QName('attr-1'), 'value-2'), 
     cts:element-attribute-value-query(xs:QName('child'), xs:QName('attr-2'), 'value-3') 
    )) 
)/child[@attr-1 eq 'value-2' and @attr-2 eq "value-3"] 

(: Returns /parent/child elements matching criteria :) 

は、私はいくつかの親の修飾子だけでなく、子供たちに修飾子を持っています。私が望む最終的な結果はただの子供です。あなたは上から見ることができるよう、そのためには、私が持っている:同じ基準ロジックによって子どもを除外し、+子供基準

  • その文書を取得した後、親の条件に一致する文書のための

    • 検索上記のように

    これはうまくいきますが、私は子供のxPathで行うのと同じ論理をcts:クエリで持たなければなりません。ロジックは不必要に重複しています。

    上記のサンプルのように、私はcts:クエリでこれをすべて実行でき、xPath式を追加する必要はありませんか?


    これは私が欲しいものに似ていますが、それはコメントで指定された問題のために動作しません:

    cts:search(/parent/child, 
        cts:and-query((
         cts:element-attribute-value-query(xs:QName('parent'), xs:QName('attr'), 'value'), (: The problem is this line... I can't filter by the parent, as it is above the scope of my first parameter (/parent/rule) :) 
         cts:element-attribute-value-query(xs:QName('child'), xs:QName('attr-1'), 'value-2'), 
         cts:element-attribute-value-query(xs:QName('child'), xs:QName('attr-2'), 'value-3') 
        )) 
    ) 
    
  • 答えて

    3

    あなたはまだあなたの検索は全体の場合でも、親を照会することができます子:

    これはフィルタリングされた検索として実行されますが、手動でフィルタリングを行っていたため、パフォーマンスはほぼ同等になるはずです。

    更新:

    私はこれをテストし、上記の主張は間違っています。私はそれが正しいと思ったが、明らかにcts:searchフィルタリングは、検索可能な表現に正確に一致しない結果をフィルタリングする。親は、検索可能な表現の範囲外になります。

    理想的には、child要素の上にドキュメントを破るだろうが、あなたは、少なくともこのような重複クエリとXPathを削除することができます。

    cts:search(/parent/child, 
        cts:and-query((
         cts:element-attribute-value-query(xs:QName('child'), xs:QName('attr-1'), 'value-2'), 
         cts:element-attribute-value-query(xs:QName('child'), xs:QName('attr-2'), 'value-3') 
        )) 
    )[parent::parent/@attr = 'value'] 
    
    +0

    これは私のためには機能しません。検索可能な式として '/ parent'があると、私は親をcts:searchから戻します。検索可能な式として '/ parent/child'を入れると、何も戻ってこない。 cts:クエリ自体は決して変更されず、私が変更しているのは検索可能な式だけです。私は '/ parent/child'を持っていても動作しません。私の前提は、検索可能な式(?)の下にないので、親の最初の要素属性値のクエリはすべてをスローします。 – CtheGood

    +0

    更新wstをお寄せいただきありがとうございます。ロジックを簡単に逆にして、cts:searchから親を取得し、xPathを使って子をフィルタリングすることもできます。あなたが子供をフィルタリングしたところでは、私の場合、実際には親よりも具体的であるため、実際には高速になります。私はまだctsのすべてを解決することを望んでいました(純粋に文体的な理由で検索しますが、おそらく不可能です)。計算コストは​​、xPath式によるフィルタリングの場合と同じように、cts:検索のフィルタリングと同じですか? – CtheGood

    +2

    は、CTSを作り、計算上の@CtheGood:検索が可能と重労働の多くを行う最善の戦略です。返すことができるすべての結果*は、インデックスのみを使用して解決されるため、非常に高速になります。あなたはCTSを経由してフィルタリングを使用する必要がある場合:検索または手動でのXPathを経由して、データベースを1に持っている)、それはかもしれないより多くの文書を選択し、それ以外の場合は2)フィルタリングを実行するためにメモリにロードします。どのように元を最大化し、後者を最小限にするための一般的なルールはありません - それはちょうどあなたの文書に依存するため、異なるアプローチをテストすることは、あなたが行うことができますについてのすべてです。 – wst

    1

    WSTはあなたに答えを与えました。しかし、これはすべてフィルタリングが必要であることから始まります。 MarkLogicでは、1つの文書に1つの「レコード」を反映させるという考えがあります。第1の場所でフィルタリングする必要性を避けるために、ドキュメントをリファクタリングすることは可能ですか?

    +0

    いいえ、そうではありません。私の文書は、すでに各文書は(すなわち)のみ1深い子供を持つルート要素を有する場合、非常に単純です。親には属性があり、すべての子もそうです。私はすでにターゲットの親のいくつかのターゲットを絞った子を取得したい。私はいつも二重論理でそれをやらなければならなかった - cts:親で検索し、xPathを使って同じロジックでフィルタリングする。しかし、私は統合したいと思います。リレーショナルアナロジーを使ってデイヴィッドの提案にエラボレーション – CtheGood

    +1

    @CtheGoodは、MarkLogicでは、行ではなく、表などの文書を考えるのが一番です。理想的な照会パフォーマンスを得るには、照会する必要があるデータと単一の文書との間に1対1の関係が必要です。あなたのケースでは、私は文書を作成(またはフラグメント根を使用して...しかし、注意してください)と(複製)子ドキュメントに親からの照会のための重要なすべてのデータを伝播する可能性があります。このタイプの「非正規化」は、MLでの非常に一般的なプラクティスです。 – wst

    +1

    もちろん、これはバランスです。かなり芸術ではありませんが、いくつかの個人的な選択肢があります。また、MarkLogicでは小さなフラグメントを必要としないように考慮する必要があります。そのため、子ドキュメントが「細かい」場合(ガイドについてはドキュメントを参照)、それらをまとめて特定のサイズにパッケージ化し、フィルタリングを適用することは実行可能なオプションです。 MLの三つ組(3つの要素と親要素)は、例えば、それらがインポートされたときに個別ではなく断片に約100で格納されます。 –

    関連する問題