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))
работает.