在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
但是,我不知道如何传递表达本身,而不是它返回的内容。
答案 0 :(得分: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等函数进行通用表达式评估。在大多数情况下,最好绑定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))
有效的原因。