2015-12-02 65 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,直到获得某些内容。当你的数量从零增加时,你最后删除的是你的问题。 –