【问题标题】:MarkLogic: binding cts:search expression to a variableMarkLogic:将 cts:search 表达式绑定到变量
【发布时间】:2013-12-29 11:33:51
【问题描述】:

在 MarkLogic 中,是否可以将 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

但是,我不确定如何传递表达式本身,而不是它返回的内容。

【问题讨论】:

    标签: xquery marklogic cts-search


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

      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!

      【讨论】:

        【解决方案3】:

        在一般情况下,您可以完全按照自己的意愿行事,只是xdmp:estimate() 是一种特殊情况,需要内联可搜索表达式,而不是可搜索表达式的变量。这就是 xdmp:estimate(cts:search(doc(), $query)) 起作用的原因。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2015-11-29
          • 1970-01-01
          • 2020-04-05
          • 1970-01-01
          • 2016-09-16
          • 2022-12-17
          • 2016-10-28
          相关资源
          最近更新 更多