首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用两个索引的MarkLogic光学查询不返回结果

使用两个索引的MarkLogic光学查询不返回结果
EN

Stack Overflow用户
提问于 2020-12-15 15:30:09
回答 1查看 80关注 0票数 1

我想使用MarkLogic optic连接两个范围索引,但不知怎么它们没有加入。我写的查询是错误的还是不能比较所使用的索引?

我定义了两个索引:

  • 一个元素属性范围索引x/@refid
  • 一个范围字段索引'id'

两者都是字符串类型,并定义了相同的排序规则。这两个索引都有我可以使用cts:value()函数检索的数据。这两个索引都是很大的索引,我希望使用光学连接它们,因此我构建了以下查询:

代码语言:javascript
复制
import module namespace op="http://marklogic.com/optic"
at "/MarkLogic/optic.xqy";

let $subfrag := op:fragment-id-col("subfrag") 
let $notfrag := op:fragment-id-col("notfrag") 

let $query :=
cts:and-query((
  cts:collection-query("latest")
))

let $subids := op:from-lexicons(
   map:entry("subid", cts:field-reference("id")), (), $subfrag) => op:where($query)

let $notids := op:from-lexicons(
   map:entry("notid", cts:element-attribute-reference(xs:QName("x"), xs:QName("refid"))),
   (),
       $notfrag)
    
return $subids
   => op:join-cross-product($notids)
   => op:where(op:eq($notfrag, $subfrag))
   => op:result() 

这个查询使用连接交叉产品,当我删除op:where子句时,我得到了所有的值。我验证了其中一些是相等的,所以子句应该只过滤我真正感兴趣的行。但不知怎么的,它不起作用了,我得到了一个空洞的结果。另外,如果我用字符串值替换op:eq中的一个值,则不会返回结果。

当我在op:eq操作符中使用相同的变量(如op:eq($notfrag,$notfrag))时,我会得到结果,这样语句就可以工作了。而不是这两个指数之间的比较。

我还使用了各种类型的连接,内部连接和左外部连接,但是这些变量也没有返回结果。

我是在比较两个不可比较的索引,还是缺少一些语句(因为文档/示例有点薄)。

(当然,我可以通过不使用光学来解决问题,但在这种情况下,这将是一个非常合适的方法)

更新

我最终改变了最后的陈述,让它发挥作用:

代码语言:javascript
复制
return $subids
=> op:join-cross-product($notids)
=> op:where(op:eq(op:col('subid'), op:col('notid')))
=> op:result() 

因此,您无法在条件中使用片段定义。在此之后,我用连接内部结构替换了连接-交叉产品,这应该是更有效的。

为了完整起见,我最初使用了这里找到的MarkLogic文档(https://docs.marklogic.com/guide/app-dev/OpticAPI#id_87356)中的示例,特别是最后一个示例,其中他们使用片段列定义作为联接内部语句中的param,但在我的示例中没有工作。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-12-16 21:19:20

交叉产品通常只对小行集有用。

将两个引用放在相同的from-lexicons()访问器中进行隐式连接,这意味着引擎通过构造为每个文档索引的值的本地交叉乘积来形成行。

这样的查询可通过以下方式表示:

代码语言:javascript
复制
op:from-lexicons(
   map:entry("subid", cts:field-reference("id"))
   =>map:with("notid", cts:element-attribute-reference(xs:QName("x"),
     xs:QName("refid")))
=>op:where(cts:collection-query("latest"))
=>op:result() 

可以使用以下方法显式地进行联接:

代码语言:javascript
复制
let $subids := op:from-lexicons(
   map:entry("subid", cts:field-reference("id")), (), $subfrag)
   => op:where($query)

let $notids := op:from-lexicons(
   map:entry("notid", cts:element-attribute-reference(xs:QName("x"),
       xs:QName("refid"))),
   (),
   $notfrag)

return $subids
   => op:join-inner($notids, op:on($notfrag, $subfrag))
   => op:result() 

希望这有帮助,

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

https://stackoverflow.com/questions/65308883

复制
相关文章

相似问题

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