我想在xml标签上进行分面,并在标签值上进行子分面,我有一个像下面这样的xml文档
<TermiteJServiceResponse>
<EntityTypeHit type="DRUG">
<HitCollection>
<Hit type="DRUG" id="CHEMBL1201288">
<Name>Dantrolene</Name>
</Hit>
<Hit type="DRUG" id="CHEMBL286398">
<Name>Propylene Glycol</Name>
</Hit>
<Hit type="DRUG" id="GXC376D7F8C0E7A0C3787E8A2384DC56E80">
<Name>PEG400</Name>
</Hit>
</HitCollection>
</EntityTypeHit>
<EntityTypeHit type="COMPOUNDS">
<HitCollection>
<Hit type="COMPOUNDS" id="A-409912.5">
<Name>A-409912.5</Name>
</Hit>
<Hit type="COMPOUNDS" id="A-409912">
<Name>A-409912</Name>
</Hit>
</HitCollection>
</EntityTypeHit>
<EntityTypeHit type="GENE">
<HitCollection>
<Hit type="GENE" id="TRH">
<Name>thyrotropin-releasing hormone</Name>
</Hit>
</HitCollection>
</EntityTypeHit>
<EntityTypeHit type="BIOPROC">
<HitCollection>
<Hit type="BIOPROC" id="BP70302">
<Name>infusion</Name>
</Hit>
<Hit type="BIOPROC" id="D009200">
<Name>Myocardial Contraction</Name>
</Hit>
<Hit type="BIOPROC" id="BP70198">
<Name>cmax values</Name>
</Hit>
<Hit type="BIOPROC" id="D001835">
<Name>Body Weight</Name>
</Hit>
<Hit type="BIOPROC" id="D062186">
<Name>Arterial Pressure</Name> …Run Code Online (Sandbox Code Playgroud) 我正在使用Ubuntu机器.我正在使用curl命令进行POST调用,并以字符串格式将xquery代码作为--data 发送.作为回应我得到以下错误:
xdmp:database()HTTP/1.1 500 REST-UNSUPPORTEDPARAM: (rest:UNSUPPORTEDPARAM) Endpoint does not support query parameter: xdmp:database()
Run Code Online (Sandbox Code Playgroud)
下面是完整的curl命令
curl -v --digest -u username --request POST "http://host:port/qconsole/endpoints/evaler.xqy?dbid=someid&querytype=xquery&action=eval" --data "xdmp:database()"
Run Code Online (Sandbox Code Playgroud)
在上面的命令基本上我试图在目标机器上运行xquery代码(主机:端口/端点/ evaler.xqy)
这是传递xquery代码的正确方法吗?
更新:
我正在使用ML 7
传递头文件后,我能够运行XQuery代码,但又面临一个问题.
当我传递"xdmp:database()"作为数据它工作正常(参见下面的命令),在响应中我得到数据库ID.
curl -v --digest -uusername --data "xdmp:database()" --header "Content-type:text/x-www-form-urlencoded" --header "Accept: multipart/mixed; boundary=BOUNDARY" --request POST "http://host:port/qconsole/endpoints/evaler.xqy?dbid=dbid&querytype=xquery&action=eval"
Run Code Online (Sandbox Code Playgroud)
当我尝试传递"let $ x:= 10 return $ x"作为数据时(如下面的命令所示)我得到了
x:未定义的变量
甚至不要求密码!!
curl -v --digest -u username --data "let $x := 10 return $x" --header "Content-type:text/x-www-form-urlencoded" --header "Accept: multipart/mixed; boundary=BOUNDARY" --request POST …Run Code Online (Sandbox Code Playgroud) 更新:见结束 - 一个例子表明 cts:uris 不是一种有效的方法,因为它不会在所有情况下都返回正确的结果。
我有一个用例,在 MarkLogic 中,有时在包含 cts:reverse-query 的搜索结果中会有数十万个匹配项。有了这个,我想要返回的是与结果匹配的文档的 URI,以便我可以缓存它们并稍后通过 Corb2 处理它们。
示例代码:
xquery version "1.0-ml";
let $_ := xdmp:invoke-function(function(){
for $val in ("foo", "bar", "baz")
let $query := <query>{cts:element-word-query(xs:QName("what"), ($val))}</query>
return (
xdmp:document-insert("/test/reverse-" || $val ||".xml", $query, (), ("test-reverse")),
xdmp:commit()
)
},<options xmlns="xdmp:eval">
<transaction-mode>update</transaction-mode>
</options>
)
return for $result in cts:search(collection("test-reverse"), cts:reverse-query(<what>baz</what>))
return xdmp:node-uri($result)
Run Code Online (Sandbox Code Playgroud)
这将返回:
/test/reverse-baz.xml
Run Code Online (Sandbox Code Playgroud)
这是预期的。
但是,我觉得我在这里做了太多处理,因为我已经有了来自 cts:search() 的文档。但话又说回来,因为 ML 是懒惰的,也许即使是现在,我真的只有一个参考,因为我没有访问文档中的任何内容..?
我想要的是使用 cts:uris() 来获得与上述相同的结果。但是,您不能将 cts:reverse-query 与 cts:uris() 一起使用
是的,我知道反向查询不一定需要作为文档存在于数据库中才能使用它(cts:包含示例),因此在某些用例中,URI 甚至不存在。但对我来说,他们做到了。
另外,我很确定我可以使用xdmp:plan()通过拉出最终计划 …
我想从文档的数组元素部分搜索具有键值的元素.让我说我有json看起来像 -
{
"name":"abc",
"lastName":"xyz",
"description":"aaaaa aaaa",
"dob":11-10-1988,
"workInformation":[
{
"address":"kolkata",
"workFor":"vvv Pvt Ltd"
},
{
"address":"bangalore",
"workFor":"www Pvt Ltd"
}
]
}
Run Code Online (Sandbox Code Playgroud)
假设我想在数组属性workInformation中使用java api搜索下面提到的键和值 -
key - workFor,value - vvv私人有限公司
请让我知道,怎么做.
谢谢阅读.
我已经发布了示例 XML 和预期的输出有助于获得结果。
示例 XML
<root>
<A id="1">
<B id="2"/>
<C id="2"/>
</A>
</root>
Run Code Online (Sandbox Code Playgroud)
预期输出:
<A id="1"/>
Run Code Online (Sandbox Code Playgroud) 我正在使用MarkLogic 9开发基于Web的搜索应用程序.我有一个查询构建接口,允许用户将字符串输入到与db中文档的特定JSON属性相对应的文本框中.这个想法是用户可以输入搜索条件,就像cts.parse(我使用服务器端javascript,而不是XQuery)所期望的那样,因此他们的搜索可能是任意复杂的,我不必处理自己解析查询.然而,经过一些测试,我发现了一个关于在布尔逻辑中使用括号的奇怪现象.也就是说,当你在括号中添加像cat和(dog OR bird)这样的语句时,cts.parse会将OR误认为是搜索词.
我将从我的网站提供一个实际的例子:
我构造了一个绑定对象来将查询绑定到我的文档的元素,
var qOpts = ["case-insensitive","punctuation-insensitive","whitespace-insensitive","wildcarded"];
var bindings = {
main: function(operator, values, options){
return(
cts.orQuery([
cts.jsonPropertyWordQuery('title',values,qOpts),
cts.jsonPropertyWordQuery('abstract',values,qOpts),
cts.jsonPropertyWordQuery('meshterms',values,qOpts),
])
);
},
}Run Code Online (Sandbox Code Playgroud)
我的服务器端脚本调用,例如,
cts.parse('main:'+params.mainQuery,bind)Run Code Online (Sandbox Code Playgroud)
以下是输入的字符串和返回的查询的一些示例:
cts.orQuery([cts.jsonPropertyWordQuery("title", "brain", ["case-insensitive","punctuation-insensitive","whitespace-insensitive","wildcarded","lang=en"], 1), cts.jsonPropertyWordQuery("abstract", "brain", ["case-insensitive","punctuation-insensitive","whitespace-insensitive","wildcarded","lang=en"], 1), cts.jsonPropertyWordQuery("meshterms", "brain", ["case-insensitive","punctuation-insensitive","whitespace-insensitive","wildcarded","lang=en"], 1), cts.wordQuery("heart", ["lang=en"], 1), cts.wordQuery("lung", ["lang=en"], 1)], [])Run Code Online (Sandbox Code Playgroud)
这个适当地为"大脑"术语的3个字段(标题,摘要,网格术语)生成jsonPropertyWordQuery,但是对于其他两个术语不能这样做,它只是生成一个cts.wordQuery().
cts.orQuery([cts.jsonPropertyWordQuery("title", "brain", ["case-insensitive","punctuation-insensitive","whitespace-insensitive","wildcarded","lang=en"], 1), cts.jsonPropertyWordQuery("abstract", "brain", ["case-insensitive","punctuation-insensitive","whitespace-insensitive","wildcarded","lang=en"], 1), cts.jsonPropertyWordQuery("meshterms", "brain", ["case-insensitive","punctuation-insensitive","whitespace-insensitive","wildcarded","lang=en"], 1), cts.andQuery([cts.wordQuery("heart", ["lang=en"], 1), cts.wordQuery("lung", ["lang=en"], 1)], ["unordered"])], [])Run Code Online (Sandbox Code Playgroud)
cts.orQuery([cts.jsonPropertyWordQuery("title", "brain", ["case-insensitive","punctuation-insensitive","whitespace-insensitive","wildcarded","lang=en"], 1), cts.jsonPropertyWordQuery("abstract", "brain", ["case-insensitive","punctuation-insensitive","whitespace-insensitive","wildcarded","lang=en"], …Run Code Online (Sandbox Code Playgroud)我正在使用 Marklogic 8.0.6 和 xquery 请求。
我通过应用程序服务器执行那些 xquery 请求,但似乎巨大的请求已达到超时并返回以下错误:
eval XQuery on server: cannot process response with 504 status
Run Code Online (Sandbox Code Playgroud)
您能否给出要修改的设置以增加此超时?
谢谢,罗曼:)
我正在使用mem:node-replace来替换内容。但它花费了太多时间。我遇到了超时错误。有什么替代方法吗?
找到示例 Xquery:
xquery version "1.0-ml";
declare namespace html = "http://www.w3.org/1999/xhtml";
import module namespace mem = "http://xqdev.com/in-mem-update"
at '/MarkLogic/appservices/utils/in-mem-update.xqy';
let $uri := cts:uri-match((concat('*',$id ,'*')),(),cts:collection-query($collection))
let $data := doc($uri)
let $final := mem:node-replace($data//title[@id='2'],doc($uri1)//title[@id='2'])
return (
xdmp:document-insert('/test/sample.xml',$final)
)
Run Code Online (Sandbox Code Playgroud) 我在MarkLogic中有以下XML存储,
<testDoc>
<test>
<test1>test1</test1>
<test2>test2</test2>
<test3>test3</test3>
</test>
</testDoc>
Run Code Online (Sandbox Code Playgroud)
我的要求是只获得子节点的xpath,如果我将测试(部分节点名称)传递给我的xquery然后我期待
/testDoc/test/test1
/testDoc/test/test2
/testDoc/test/test3
Run Code Online (Sandbox Code Playgroud)
但是我的xquery回来了,
/testDoc
/testDoc/test
/testDoc/test/test1
/testDoc/test/test2
/testDoc/test/test3
Run Code Online (Sandbox Code Playgroud)
我在qconsole上执行的XQuery是,
xquery version "1.0-ml";
let $xml := document { fn:doc("/test/testDoc")}
let $elem-name := "test"
let $elems := $xml//*[local-name()[contains(lower-case(.), lower-case($elem-name))]]
return $elems ! xdmp:path(.)
Run Code Online (Sandbox Code Playgroud)
请指导我达到我的要求.
一旦在 qconsole Marklogic 中运行以下代码,我就会遇到以下错误
XDMP-UNEXPECTED: (err:XPST0003) 意外的令牌语法错误,意外的 For_,需要 Order_ 或 Return_ 或 Stable_
let $prices := fn:doc('/training/prices.xml')/prices
let $order := fn:doc('/training/order.xml')/order
where $prices/priceList/prod[@num=$order/item/@num]
for $kk in $prices/priceList/prod[@num=$order/item/@num]
return
<item>
{$kk}
</item>
Run Code Online (Sandbox Code Playgroud)
谢谢..
marklogic ×10
marklogic-8 ×5
xquery ×5
xpath ×2
curl ×1
javascript ×1
marklogic-9 ×1
ubuntu ×1