MarkLogic: привязка выражения cts:search к переменной

В 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

Но я не уверен, как передать само выражение, а не то, что оно возвращает.

3 ответа

Решение

Поддержка XQuery 3 в MarkLogic может помочь с этим, но в противном случае нет. Вы можете поместить часть 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

НТН!

Ответ Гирта правильный и практичный: cts:query элемент, а не выражение доступа к базе данных. Использовать cts:query запрашивать базу данных по мере необходимости.

Но в некоторых случаях может быть полезно "передать само выражение", как в первоначальном вопросе. Это может показаться сложным, потому что XQuery 1.0 на самом деле не позволяет метапрограммирование. Переменная связывается с последовательностями элементов, которые являются результатом вычисления выражений. Переменные не привязываются к неоцененным выражениям.

MarkLogic предлагает способ обойти это, используя такие функции, как http://docs.marklogic.com/xdmp:path или http://docs.marklogic.com/xdmp:value или http://docs.marklogic.com/xdmp:eval для оценки общего выражения. В большинстве случаев лучше связать запрос 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")
                                   ))
                                 )'
return xdmp:value('xdmp:estimate('||$query||')')

В общем случае вы можете делать именно то, что вы хотите, просто xdmp:estimate() это особый случай, который требует встроенного поискового выражения, а не переменной для поиска. Вот почему xdmp:estimate(cts:search(doc(), $query)) работает.

Другие вопросы по тегам