Xquery MarkLogic:将cts:search表达式绑定到变量

Xquery MarkLogic:将cts:search表达式绑定到变量,xquery,marklogic,cts-search,Xquery,Marklogic,Cts Search,在MarkLogic中,是否可以将cts:search表达式绑定到变量,然后在XQuery中的其他位置使用该变量 我想这样做: let $query := cts:search(doc(), cts:and-query(( cts:element-attribute-word-query( xs:

在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

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

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

在一般情况下,您可以完全执行您想要的操作,只是
xdmp:estimate()
是一种特殊情况,它需要内联可搜索表达式,而不是可搜索表达式的变量。这就是为什么
xdmp:estimate(cts:search(doc(),$query))
有效的原因。

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

但在某些情况下,如在原始问题中那样“传递表达式本身”是有用的。这似乎很困难,因为XQuery1.0实际上不允许元编程。变量绑定到项序列,这些项是计算表达式的结果。变量不绑定到未赋值的表达式

MarkLogic提供了一种解决方法,使用诸如或之类的函数进行泛型表达式求值。在大多数情况下,最好是绑定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||')')