2013-12-11 41 views
5

在MarkLogic中,是否可以將cts:search表達式綁定到變量,然後在XQuery的其他位置使用該變量?MarkLogic:將cts:搜索表達式綁定到變量

我想要做這樣的事情:

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

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!

1

在一般情況下,您可以按照自己的想法進行操作,只是xdmp:estimate()是一種特殊情況,需要內聯可搜索表達式而不是可搜索表達式的變量。這就是爲什麼xdmp:estimate(cts:search(doc(), $query))有效。

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