2013-12-11 18 views
5

Trong MarkLogic, có thể liên kết biểu thức cts:search với một biến và sau đó sử dụng biến đó ở nơi khác trong XQuery?MarkLogic: ràng buộc cts: biểu thức tìm kiếm thành biến

tôi muốn làm một cái gì đó như thế này:

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 

Nhưng, tôi không chắc chắn làm thế nào để vượt qua sự biểu hiện bản thân, chứ không phải là những gì nó trả về.

Trả lời

3

Hỗ trợ XQuery 3 trong MarkLogic có thể trợ giúp với điều này, nhưng nếu không thì không. Bạn có thể đặt phần cts: query trong $ query như thế này:

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

Trong trường hợp chung, bạn có thể thực hiện chính xác những gì bạn muốn, chỉ xdmp:estimate() là trường hợp đặc biệt yêu cầu biểu thức có thể tìm kiếm nội tuyến và không phải là biến cho biểu thức có thể tìm kiếm được. Đó là lý do tại sao xdmp:estimate(cts:search(doc(), $query)) hoạt động.

4

Câu trả lời của Geert là chính xác và thực tế: sử dụng lại mục cts:query, không phải biểu thức truy cập cơ sở dữ liệu. Sử dụng cts:query để truy vấn cơ sở dữ liệu khi cần.

Nhưng trong một số trường hợp, có thể hữu ích khi "chuyển biểu thức" như trong câu hỏi ban đầu. Điều đó có vẻ khó khăn vì XQuery 1.0 không thực sự cho phép lập trình meta. Biến liên kết với chuỗi các mục, là kết quả của việc đánh giá các biểu thức. Các biến không liên kết với các biểu thức chưa được đánh giá.

MarkLogic cung cấp cách thức này, sử dụng các chức năng như http://docs.marklogic.com/xdmp:path hoặc http://docs.marklogic.com/xdmp:value hoặc http://docs.marklogic.com/xdmp:eval để đánh giá biểu thức chung. Trong hầu hết các trường hợp, tốt hơn là ràng buộc cts: query, như trong câu trả lời của Geert. Nhưng nếu bạn thực sự cần lập trình meta, bạn có thể xây dựng các biểu thức như các chuỗi và đánh giá chúng theo yêu cầu.

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||')') 
Các vấn đề liên quan