2017-12-12 15 views
1

私はOracleクエリを持っており、Marklogic ctsクエリに変換したいと考えています。 Marklogic CTSは "and-query"の中に "and-query"を持つことはできません。私はMarklogicがどのように動作するのかよくわかりません。前もって感謝します。Marklogic ctsクエリを構築する方法

句クエリ

where (collection = "TRBA" AND fulltext = 1 
     AND (dnta = "Briefing" OR dnta = "Conference" OR snta = "Workshop" 
      OR snta = "Published in" AND (snta = "this article" OR dnta = "Journal") 
    ) 
     AND (cand IN ("Research","Development Center") OR scn IN("424778","98814","393825")) 

がMarklogicに翻訳:

let $uris:= cts:uris(
        (), 
        (), 
        cts:and-query((
          cts:collection-query("/dbs/"TRBA"), 
          cts:element-value-query(xs:QName("meta:FullTextExists"),"1"), 
          cts:field-word-query("dnta",("briefing","conference")), 

         cts:or-query((
           cts:element-word-query(xs:QName("meta:snta"),("this article")), 
           cts:field-word-query("dnta",("Journal")), 

         cts:and-query((
          cts:or-query((
            cts:field-word-query("cand", ("Research","Development Center")) 
            cts:field-word-query("scn",("424778","98814","393825")) 
          )) 
         ))(:inside and-query:) 
         ))(:or-query:) 
        ))(:outside and-query:) 

return fn:doc($uris) 

答えて

3
  1. 上記のコードでは、基本的な構文エラーがあります:行方不明括弧、余分な二重引用符
  2. は、私はあなたが「=」のための翻訳などの単語のクエリをしたいとは思いません。単語のクエリは、その単語が問題のフィールドのどこかに現れると言うだけです。私は代わりにそれが価値のクエリだと思うだろう。あなたはフィールドの論理積と論理和などプラスバインディングの文字列を取り、あなたはAND中の混合を仮定した場合、言っcts:query

にクエリ文字列を解析しcts:parseを見てすることがあります

  • cts:and-query((
        cts:collection-query("/dbs/TRBA"), 
        cts:element-value-query(xs:QName("meta:FullTextExists"),"1"), 
        cts:or-query((
        cts:field-value-query("dnta",("Briefing","Conference")), 
        cts:field-value-query("snta","Workshop"), 
        cts:and-query((
         cts:field-value-query("snta","Published in"), 
         cts:or-query((
         cts:field-value-query("snta","this article"), 
         cts:field-value-query("dnta","Journal") 
        )) 
        )) 
    )), 
        cts:or-query((
        cts:field-value-query("cand",("Research","Development Center")), 
        cts:field-value-query("scn",("424778","98814","392825")) 
    )) 
    )) 
    

    (collection = "TRBA" AND 
    fulltext = 1 AND 
    (dnta = "Briefing" OR 
        dnta = "Conference" OR 
        snta = "Workshop" OR 
        (snta = "Published in" AND (snta = "this article" OR dnta = "Journal")) 
    ) AND 
    (cand IN ("Research","Development Center") OR 
        scn IN ("424778","98814","393825")) 
    

    は、私はこのようなこの何かを翻訳します:そう括弧と論理和ですなわち最も近い句に結合します

    かなり直接的なマッピングです。

  • +0

    ありがとうございます。今私はmarklogicクエリを構築する方法を理解しました。 – thichxai

    2

    は、単にあなたのコード内のいくつかの誤植を持っています。 collection-queryに余分な二重引用符があり、最後のor-queryの項目の間にカンマがありません。

    これらを修正すると、コードが実行されます。しかし、プロのヒント:ドキュメントを取得するためだけにURIを取得することはありません。あなたは努力を無駄にしています。クエリを渡す検索で直接ドキュメントを取得するだけです。

    let $q := cts:and-query((...)) 
    return cts:search(doc(), $q)[1 to 10] 
    

    あなたはおそらくあなたが本当に完全な結果セットを返すつもりがない限り、同様[1 to 10]のような制限を追加します。

    +0

    ありがとうございます。私は初心者のmarklogicを学んでいます。 – thichxai

    関連する問題