5

MarkLogic では、cts:search式を変数にバインドし、その変数をXQueryの他の場所で使用できますか?

私はこのようなことをしたい:

let $query := cts:search(doc(),
                               cts:and-query((
                                  cts:element-attribute-word-query(
                                    xs:QName("para"),
                                    xs:QName("role"),
                                      "intro") ,

                                  cts:element-attribute-word-query(
                                    xs:QName("title"),
                                    xs:QName("role"),
                                      "inline")
                                       ))
                                     )


let $number-of-results := xdmp:estimate($query)

return $number of results

しかし、それが返すものではなく、式自体を渡す方法がわかりません。

4

3 に答える 3

4

Geert の答えは正しく実用的ですcts:query。データベース アクセス式ではなく、アイテムを再利用します。を使用しcts:queryて、必要に応じてデータベースを照会します。

ただし、場合によっては、元の質問のように「式自体を渡す」ことが役立つ場合があります。XQuery 1.0 では実際にはメタプログラミングが許可されていないため、これは難しいように思えるかもしれません。変数は、式を評価した結果であるアイテムのシーケンスにバインドします。変数は、評価されていない式にバインドされません。

MarkLogic では、http://docs.marklogic.com/xdmp:path または http://docs.marklogic.com/xdmp:value または http://docs.marklogic.com/xdmp などの関数を使用して、これを回避する方法を提供ますジェネリック式評価のeval 。ほとんどの場合、Geert の回答のように、代わりに cts:query をバインドすることをお勧めします。しかし、本当にメタプログラミングが必要な場合は、式を文字列として作成し、必要に応じて評価することができます。

let $query := 'cts:search(doc(),
                           cts:and-query((
                              cts:element-attribute-word-query(
                                xs:QName("para"),
                                xs:QName("role"),
                                  "intro") ,

                              cts:element-attribute-word-query(
                                xs:QName("title"),
                                xs:QName("role"),
                                  "inline")
                                   ))
                                 )'
return xdmp:value('xdmp:estimate('||$query||')')
于 2013-12-11T17:26:39.770 に答える
3

MarkLogic での XQuery 3 サポートはこれに役立つかもしれませんが、それ以外の場合は役に立ちません。ただし、次のように $query に cts:query 部分を配置できます。

let $query := cts:and-query((
                              cts:element-attribute-word-query(
                                xs:QName("para"),
                                xs:QName("role"),
                                  "intro") ,

                              cts:element-attribute-word-query(
                                xs:QName("title"),
                                xs:QName("role"),
                                  "inline")
                                   ))

let $number-of-results := xdmp:estimate(cts:search(doc(), $query))
let $results := cts:search(doc(), $query)

return $number-of-results

チッ!

于 2013-12-11T14:01:46.907 に答える
1

一般的なケースでは、あなたが望むことを正確に行うことができます.それxdmp:estimate()は、検索可能な式の変数ではなく、インラインの検索可能な式を必要とする特別なケースです. それが機能する理由xdmp:estimate(cts:search(doc(), $query))です。

于 2013-12-11T15:40:03.077 に答える