2013-12-11 4 views
5

In MarkLogic, ist es möglich, eine cts:search Ausdruck an eine Variable zu binden und dann diese Variable an anderer Stelle in der XQuery?MarkLogic: bindenden cts: Suche Ausdruck zu einer Variablen

möchte ich so etwas wie dies zu tun:

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 

Aber, ich bin nicht sicher, wie der Ausdruck passieren selbst, sondern als das, was er zurückkehrt.

Antwort

3

Unterstützung von XQuery 3 in MarkLogic könnte dabei helfen, aber ansonsten nicht. Sie können den cts: query-Teil jedoch in $ query wie folgt setzen:

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

Im allgemeinen Fall können Sie genau das tun, was Sie wollen, nur dass xdmp:estimate() ein Sonderfall ist, der einen durchsuchbaren Inline-Ausdruck und keine Variable für einen durchsuchbaren Ausdruck benötigt. Deshalb funktioniert xdmp:estimate(cts:search(doc(), $query)) funktioniert.

4

Geerts Antwort ist korrekt und praktisch: Verwenden Sie das Element cts:query nicht den Ausdruck für den Datenbankzugriff. Verwenden Sie die cts:query, um die Datenbank nach Bedarf abzufragen.

Aber in einigen Fällen kann es nützlich sein, den Ausdruck selbst zu übergeben, wie in der ursprünglichen Frage. Das mag schwierig erscheinen, weil XQuery 1.0 Metaprogrammierung nicht wirklich erlaubt. Variable binden an Sequenzen von Elementen, die das Ergebnis der Auswertung von Ausdrücken sind. Variablen sind nicht an nicht bewertete Ausdrücke gebunden.

MarkLogic bietet eine Möglichkeit, Funktionen wie http://docs.marklogic.com/xdmp:path oder http://docs.marklogic.com/xdmp:value oder http://docs.marklogic.com/xdmp:eval für die generische Ausdruckauswertung zu verwenden. In den meisten Fällen ist es besser, die cts: query zu binden, als in Geerts Antwort. Aber wenn Sie wirklich Metaprogrammierung benötigen, können Sie Ausdrücke als Strings erstellen und diese bei Bedarf auswerten.

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