2015-12-02 112 views
0

我試圖在MarkLogic中使用XQuery搜索術語。當我運行下面的代碼時,我什麼也得不到。有誰知道問題是什麼?我不使用命名空間,但我不認爲這是問題。在marklogic中使用xquery返回搜索結果

注:當我在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元素,但在以下XPath中將其視爲article元素。接下來,您將一個字符串重新分配了$article-title變量(在大多數XQuery處理器中實際上不可能實現 - MarkLogic是一個例外),然後在其上執行XPath,就像它是一個節點一樣。然後,對於其餘的變量賦值,您都對字符串進行操作,就像它是一個節點AND將該變量當作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

當我運行你編輯的代碼時,我得到了錯誤'500內部服務器錯誤 XDMP-UNDVAR:(err:XPST0008)未定義變量$ xml in /search.xqy,at 39:23 [1.0-ml] ' – 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

您也可以運行Michael在查詢控制檯中建議的XPath。如果您沒有收到結果,請首先確認您選擇了正確的內容來源(因此您正在查詢正確的數據庫)。將該XPath封裝在fn:count()或($ xpath)[1至10]中,直到您有足夠小的集合用於處理。如果您的計數爲零,則從頭開始刪除部分XPath,直到獲得某些內容。當你的數量從零增加時,你最後刪除的是你的問題。 –