首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何构造cts查询

如何构造cts查询
EN

Stack Overflow用户
提问于 2017-12-12 15:22:21
回答 2查看 180关注 0票数 1

我有一个Oracle查询,并希望转换为Marklogic查询。看起来,Marklogic不允许在"and-query“中包含"and-query”。我不知道Marklogic是如何工作的。提前谢谢。

Where子句查询:

代码语言:javascript
复制
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:

代码语言:javascript
复制
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)
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-12-12 16:31:07

  1. 上面的代码中有一些基本的语法错误:缺少parens、额外的双引号。
  2. 我认为您不希望word查询作为“=”的翻译;word查询只是说单词出现在相关字段的某个地方;我认为这将是一个值查询。
  3. 您可能想看一看cts:parse,它使用一个带有ANDs和for等的字符串,加上字段的绑定,并将查询字符串解析为cts:query

尽管如此,如果假设并与ORs混合在一起绑定到最近的子句,即作为括号,所以:

代码语言:javascript
复制
(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"))

我会把这个翻译成这样:

代码语言:javascript
复制
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"))
  ))
))

这是一个相当直接的映射。

票数 4
EN

Stack Overflow用户

发布于 2017-12-12 16:30:55

您只需在代码中输入几个字即可。在collection-query中有一个额外的双引号,在上一个or-query中的项目之间缺少一个逗号。

一旦修复了这些代码,代码就会运行。但是,有一点建议:永远不要只为获取文档而获取URI。你在浪费精力。只需直接使用传递查询的搜索来获取文档。

代码语言:javascript
复制
let $q := cts:and-query((...))
return cts:search(doc(), $q)[1 to 10]

除非您真的打算返回完整的结果集,否则您可能也希望添加像[1 to 10]这样的限制。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47776012

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档