我试图在MarkLogic中使用XQuery搜索一个术语。当我运行以下代码时,我什么也得不到。有谁知道问题是什么?我没有使用命名空间,但我认为这不是问题所在。
注意:当我在MarkLogic的Query Console中运行此查询时,我收到以下消息:
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 :(得分:3)
首先,XPath中存在一些错误。您正在选择article-title
元素,但在以下XPath中将其视为article
元素。接下来,您将$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
会将其视为不存在。
答案 1 :(得分:3)
我认为这里的元问题是:在运行查询时如何调试复杂查询(空序列)?对我们来说,为你调试查询并不是很有用,你应该知道如何自己调试它会更有用。
如果您有源的架构,那么将其作为架构感知查询运行可能非常有用,即使您仅为调试目的而暂时执行此操作也是如此。模式感知查询处理器将根据模式检查路径表达式,并告诉您是否尝试选择根据模式永远不存在的元素或路径。
之后,这是一个逻辑演绎和/或实验的过程,以将查询提炼到其本质。因为你只有一个“for”子句,并且return子句总是产生一些东西,所以获得一个空序列的唯一方法就是如果for子句没有选择任何东西。这样就可以将它减少到表达式
的问题/article/front/article-meta/title-group/article-title
[cts:contains(., xdmp:get-request-field("term"))]
在此阶段,使用类似oXygen的IDE可以提供帮助:将源文档放入编辑器,打开XPath评估程序,然后输入此路径。您需要对其进行修改,因为它使用MarkLogic扩展功能。但是你可以从消除谓词开始,看看路径是否选择了任何东西。我试过了,但遗憾的是你的XML格式不正确,所以我放弃了。但做自己并不困难。如果路径表达式没有选择任何内容,请从路径中删除尾随步骤,直到获得结果:删除的最后一步是错误的步骤。