Xquery MarkLogic:将cts:search表达式绑定到变量
在MarkLogic中,是否可以将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:
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||')')