2015-12-02 3 views
0

Я пытаюсь найти термин, используя XQuery в MarkLogic. Когда я запускаю следующий код, я ничего не получаю. Кто-нибудь знает, в чем проблема? Я не использую пространство имен, но я не думаю, что это проблема.Возврат результатов поиска с использованием xquery в marklogic

Примечание: при запуске этого запроса в консоли запросов в MarkLogic я получаю сообщение:

your query returned an empty sequence 

Код:

{ 
    for $article-title in /article/front/article-meta/title-group/article-title[cts:contains(., xdmp:get-request-field("term"))] 
    let $article-title := fn:tokenize(fn:string($article-title/article/front/article-meta/title-group/article-title), " ")[1 to 100] 
    let $journal-title := $article-title/article/front/journal-meta/journal-title-group/journal-title/text() 
    let $contrib := $article-title/article/front/article-meta/contrib-group/contrib/text() 
    let $year:= $article-title/article/front/article-meta/pub-date/text() 
    let $sec-title:= $article-title/article/body/section/sec-title/text() 

    return (
    <tr> 
     <td colspan="10"><hr/></td> 
    </tr>, 
    <tr> 
     <td><b>{$article-title}</b></td> 
     <td><b>{$journal-title}</b></td> 
     <td>{$contrib}</td> 
     <td>{$year}</td> 
     <td>{$sec-title}</td> 
    </tr>, 
    <tr> 
     <td colspan="10" class="article-title">{$article-title} ...</td> 
    </tr> 
) 
} 

XML пример:

<?xml version="1.0" encoding="UTF-8"?> 
<article article-type="article" xml:lang="en" structure-type="article" dtd- version="1.0" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:mml="http://www.w3.org/1998/Math/MathML" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 
    <front> 
    <journal-meta> 
     <journal-title-group> 
     <journal-title xml:lang="en">Psychology of Addictive Behaviors</journal-title> 
     </journal-title-group> 
     <issn pub-type="print">0893-164X</issn> 
     <issn pub-type="online">1939-1501</issn> 
     <publisher> 
     <publisher-name>American Psychological Association</publisher-name> 
     </publisher> 
    </journal-meta> 
    <article-meta> 
     <article-id pub-id-type="apaID">adb_21_4_462</article-id> 
     <article-id pub-id-type="doi">10.1037/0893-164X.21.4.462</article-id> 
     <article-id pub-id-type="pi-uid">2007-18113-004</article-id> 
     <article-categories> 
     <subj-group subj-group-type="toc-heading"> 
      <subject>Articles</subject> 
     </subj-group> 
     </article-categories> 
     <title-group> 
     <article-title>Social Dominance Mediates the Association of Testosterone and Neurobehavioral Disinhibition With Risk for Substance Use Disorder</article-title> 
     </title-group> 
     <contrib-group content-type="journal-editors"> 
     <contrib contrib-type="editor" corresp="no" xlink:type="simple"> 
      <string-name> 
      <given-names>Howard J.</given-names> <surname>Shaffer</surname> 
      </string-name> 
      <role>Editor</role> 
     </contrib> 
     </contrib-group> 
     <contrib-group content-type="primary-authors"> 
     <contrib contrib-type="author" corresp="yes" rid="aff1 corr1" xlink:type="simple"> 
      <string-name> 
      <given-names>Ralph E.</given-names> <surname>Tarter</surname> 
      </string-name> 
     </contrib> 
     <contrib contrib-type="author" corresp="no" rid="aff1" xlink:type="simple"> 
      <string-name> 
      <given-names>Levent</given-names> <surname>Kirisci</surname> 
      </string-name> 
     </contrib> 
     <contrib contrib-type="author" corresp="no" rid="aff1" xlink:type="simple"> 
      <string-name> 
      <given-names>Galina P.</given-names> <surname>Kirillova</surname> 
      </string-name> 
     </contrib> 
     <contrib contrib-type="author" corresp="no" rid="aff1" xlink:type="simple"> 
      <string-name> 
      <given-names>Judy</given-names> <surname>Gavaler</surname> 
      </string-name> 
     </contrib> 
     <contrib contrib-type="author" corresp="no" rid="aff2" xlink:type="simple"> 
      <string-name> 
      <given-names>Peter</given-names> <surname>Giancola</surname> 
      </string-name> 
     </contrib> 
     </contrib-group> 
    </article-meta> 
    </front> 
</article> 
+0

Без образца XML в вашей базе данных будет почти невозможно определить ошибки в вашем запросе. – wst

+0

Вопрос обновлен с помощью примера xml – user3054453

+0

Ваш образец XML не является корректным, например, он пропускает закрывающие теги. –

ответ

3

Во-первых, некоторые ошибки в вашем XPath. Вы выбирали элемент article-title, но рассматривали его как элемент article в следующем XPath. Затем вы переназначили переменную $article-title (что на самом деле невозможно в большинстве процессоров XQuery - MarkLogic - это исключение) для строки, а затем выполнили XPath, как если бы это был узел. Затем для остальных назначений переменных вы оба работали на строке, как если бы это был узел И обрабатывая переменную как article, когда это было бы article-title.

Я обновил запрос, изменив назначение переменной for на article и переместив остальную часть XPath в предикат. Затем другие переменные были обновлены для запроса из переменной $article вместо $article-title, которая является строкой.

for $article in /article[front/article-meta/title-group/article-title/cts:contains(., xdmp:get-request-field("term"))] 
let $article-title := fn:tokenize(fn:string($article/front/article-meta/title-group/article-title), " ")[1 to 100] 
let $journal-title := $article/front/journal-meta/journal-title-group/journal-title/text() 
let $contrib := $article/front/article-meta/contrib-group/contrib/text() 
let $year:= $article/front/article-meta/pub-date/text() 
let $sec-title:= $article/body/section/sec-title/text() 

Есть несколько других возможностей я бы проверить, если вы по-прежнему есть проблемы: 1) Убедитесь, что ваш призыв к xdmp:get-request-field() фактически возвращая значение, которое вы ожидаете; 2) Настройки индекса базы данных влияют на поведение cts:contains, поэтому, если какой-либо из элементов в выбранном вами пути исключается из индекса, то cts:contains будет рассматривать его так, как если бы он не существовал.

+0

Когда я запустил код, который вы редактировали, я получил tis error '500 Internal Server Error XDMP-UNDVAR: (err: XPST0008) Неопределенная переменная $ xml в /search.xqy, в 39:23 [1.0 мл] ' – user3054453

+0

@ user3054453 Извините, это был артефакт, оставшийся от моего локального тестирования. Я обновил запрос, чтобы удалить его. – wst

+0

все еще ничего не возвращает Я проверю 'cts: contains' – user3054453

3

Я думаю, что мета-вопрос здесь: как вы отлаживаете сложный запрос при выполнении запроса, ничего не возвращает (пустая последовательность)? Нам не очень полезно отлаживать запрос для вас, гораздо полезнее узнать, как его отлаживать самостоятельно.

Если у вас есть схема для источника, то ее запуск как запроса, ориентированного на схему, может быть очень полезным, даже если вы выполняете это только временно для целей отладки. Обработчик запросов, ориентированный на схему, проверит ваши выражения пути на схему и скажет вам, хотите ли вы выбирать элементы или пути, которые, согласно схеме, никогда не могут существовать.

После этого это процесс логического вывода и/или экспериментирование, чтобы отделить запрос от его сущности. Поскольку у вас есть только одно предложение «for», и предложение return всегда производит что-то, единственный способ получить пустую последовательность в качестве результата - если предложение for ничего не выбирает. Так что уменьшает ее к задаче с выражением

/article/front/article-meta/title-group/article-title 
    [cts:contains(., xdmp:get-request-field("term"))] 

На этом этапе с использованием IDE подобно кислороду может реально помочь: поместить исходный документ в редакторе, откройте оценщик XPath, и введите этот путь. Вам нужно будет изменить его, потому что он использует функции расширения MarkLogic. Но вы можете начать с устранения предиката и просмотра, если путь выбирает что-либо. Я попытался это сделать, но, к сожалению, ваш XML не очень хорошо сформирован, поэтому я сдался. Но это не сложно сделать самому.Если выражение пути ничего не выбирает, удалите завершающие шаги с пути до получения результата: последний шаг, который вы удалили, является неправильным.

+1

Вы также можете запустить XPath, который предложил Майкл в Query Console. Если вы не получили никаких результатов, сначала убедитесь, что вы выбрали правильный источник контента (так что вы запрашиваете правильную базу данных). Оберните этот XPath в fn: count() или ($ xpath) [от 1 до 10], пока у вас не будет достаточно малого набора для работы. Если ваш счет равен нулю, начните удалять части XPath с конца, пока не получите что-то. Когда ваш счет поднимается с нуля, последнее, что вы удалили, было вашей проблемой. –

Смежные вопросы