MarkLogic:绑定cts:将表达式搜索到变量

时间:2013-12-11 13:12:39

标签: xquery marklogic cts-search

在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

但是,我不知道如何传递表达本身,而不是它返回的内容。

3 个答案:

答案 0 :(得分:4)

Geert的答案是正确和实用的:重用cts:query项,而不是数据库访问表达式。使用cts:query根据需要查询数据库。

但在某些情况下,像原始问题一样“传递表达本身”会很有用。这似乎很难,因为XQuery 1.0并不真正允许元编程。变量绑定到项目序列,这是评估表达式的结果。变量不会绑定到未评估的表达式。

MarkLogic提供了一种方法,使用http://docs.marklogic.com/xdmp:pathhttp://docs.marklogic.com/xdmp:valuehttp://docs.marklogic.com/xdmp:eval等函数进行通用表达式评估。在大多数情况下,最好绑定cts:query,就像在Geert的答案中一样。但是如果你真的需要元编程,你可以将表达式构建为字符串并按需评估它们。

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||')')

答案 1 :(得分:3)

MarkLogic中的XQuery 3支持可能对此有所帮助,但是否则没有。您可以将cts:query部分放在$ 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

HTH!

答案 2 :(得分:1)

在一般情况下,您可以完全按照自己的意愿行事,只是xdmp:estimate()是一种特殊情况,需要内联可搜索表达式而不是可搜索表达式的变量。这就是xdmp:estimate(cts:search(doc(), $query))有效的原因。