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: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||')')
于 2013-12-11T17:26:39.770 回答
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

于 2013-12-11T14:01:46.907 回答
1

In the general case you can do exactly what you want, it's just that xdmp:estimate() is a special case that requires an inline searchable expression and not a variable to a searchable expression. That's why xdmp:estimate(cts:search(doc(), $query)) works.

于 2013-12-11T15:40:03.077 回答