2013-12-11 8 views
5

In MarkLogic, è possibile associare un'espressione cts:search a una variabile e quindi utilizzare la variabile altrove in XQuery?MarkLogic: binding cts: cerca espressione a una variabile

voglio fare qualcosa di simile:

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 

Ma, io non sono sicuro di come passare l'espressione stessa, piuttosto che quello che restituisce.

risposta

3

Il supporto XQuery 3 in MarkLogic può essere d'aiuto, ma altrimenti no. Puoi inserire i termini: query parte in $ query come questa:

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

Nel caso generale si può fare esattamente quello che si vuole, è solo che xdmp:estimate() è un caso speciale che richiede un'espressione ricercabile in linea e non una variabile per un'espressione ricercabile. Ecco perché xdmp:estimate(cts:search(doc(), $query)) funziona.

4

La risposta di Geert è corretta e pratica: riutilizzare l'elemento cts:query, non l'espressione di accesso al database. Utilizzare cts:query per interrogare il database in base alle esigenze.

Ma in alcuni casi può essere utile "passare l'espressione stessa" come nella domanda originale. Potrebbe sembrare difficile perché XQuery 1.0 non consente realmente la metaprogrammazione. Legatura variabile alle sequenze di oggetti, che sono il risultato della valutazione delle espressioni. Le variabili non si associano a espressioni non valutate.

MarkLogic offre un modo per aggirare questo, utilizzando funzioni come http://docs.marklogic.com/xdmp:path o http://docs.marklogic.com/xdmp:value o per la valutazione di espressioni generiche. Nella maggior parte dei casi è meglio associare i cts: query invece, come nella risposta di Geert. Ma se hai davvero bisogno di metaprogrammazione, puoi costruire espressioni come stringhe e valutarle su richiesta.

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