我有一个Oracle查询,并希望转换为Marklogic查询。看起来,Marklogic不允许在"and-query“中包含"and-query”。我不知道Marklogic是如何工作的。提前谢谢。
Where子句查询:
where (collection = "TRBA" AND fulltext = 1
AND (dnta = "Briefing" OR dnta = "Conference" OR snta = "Workshop"
OR snta = "Published in" AND (snta = "this article" OR dnta = "Journal")
)
AND (cand IN ("Research","Development Center") OR scn IN("424778","98814","393825")) 翻译成Marklogic:
let $uris:= cts:uris(
(),
(),
cts:and-query((
cts:collection-query("/dbs/"TRBA"),
cts:element-value-query(xs:QName("meta:FullTextExists"),"1"),
cts:field-word-query("dnta",("briefing","conference")),
cts:or-query((
cts:element-word-query(xs:QName("meta:snta"),("this article")),
cts:field-word-query("dnta",("Journal")),
cts:and-query((
cts:or-query((
cts:field-word-query("cand", ("Research","Development Center"))
cts:field-word-query("scn",("424778","98814","393825"))
))
))(:inside and-query:)
))(:or-query:)
))(:outside and-query:)
return fn:doc($uris)发布于 2017-12-12 16:31:07
cts:parse,它使用一个带有ANDs和for等的字符串,加上字段的绑定,并将查询字符串解析为cts:query。尽管如此,如果假设并与ORs混合在一起绑定到最近的子句,即作为括号,所以:
(collection = "TRBA" AND
fulltext = 1 AND
(dnta = "Briefing" OR
dnta = "Conference" OR
snta = "Workshop" OR
(snta = "Published in" AND (snta = "this article" OR dnta = "Journal"))
) AND
(cand IN ("Research","Development Center") OR
scn IN ("424778","98814","393825"))我会把这个翻译成这样:
cts:and-query((
cts:collection-query("/dbs/TRBA"),
cts:element-value-query(xs:QName("meta:FullTextExists"),"1"),
cts:or-query((
cts:field-value-query("dnta",("Briefing","Conference")),
cts:field-value-query("snta","Workshop"),
cts:and-query((
cts:field-value-query("snta","Published in"),
cts:or-query((
cts:field-value-query("snta","this article"),
cts:field-value-query("dnta","Journal")
))
))
)),
cts:or-query((
cts:field-value-query("cand",("Research","Development Center")),
cts:field-value-query("scn",("424778","98814","392825"))
))
))这是一个相当直接的映射。
发布于 2017-12-12 16:30:55
您只需在代码中输入几个字即可。在collection-query中有一个额外的双引号,在上一个or-query中的项目之间缺少一个逗号。
一旦修复了这些代码,代码就会运行。但是,有一点建议:永远不要只为获取文档而获取URI。你在浪费精力。只需直接使用传递查询的搜索来获取文档。
let $q := cts:and-query((...))
return cts:search(doc(), $q)[1 to 10]除非您真的打算返回完整的结果集,否则您可能也希望添加像[1 to 10]这样的限制。
https://stackoverflow.com/questions/47776012
复制相似问题