Xquery 使用两个索引的MarkLogic optic查询不返回任何结果

Xquery 使用两个索引的MarkLogic optic查询不返回任何结果,xquery,marklogic,Xquery,Marklogic,我想使用MarkLogic optic API连接两个范围索引,但不知为什么它们没有连接。我写的查询是错误的还是不能比较使用的索引 我定义了两个索引: 元素属性范围索引x/@refid 范围字段索引“id” 两者都是字符串类型,并且定义了相同的排序规则。这两个索引都有我可以使用cts:values()函数检索的数据。这两个都是巨大的索引,我想使用光学技术将它们连接起来,因此我构建了以下查询: import module namespace op="http://marklogic.

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

我定义了两个索引:

  • 元素属性范围索引x/@refid
  • 范围字段索引“id”
两者都是字符串类型,并且定义了相同的排序规则。这两个索引都有我可以使用cts:values()函数检索的数据。这两个都是巨大的索引,我想使用光学技术将它们连接起来,因此我构建了以下查询:

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() 
这个查询使用join叉积,当我删除op:where子句时,我会得到左右所有的值。我验证了,其中一些是相等的,因此子句应该只过滤我真正感兴趣的行。但不知何故,它不起作用,我得到了一个空的结果。另外,如果我用字符串值替换op:eq中的一个值,它不会返回结果

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

我还使用了带有内部联接和外部联接的变量,但这些变量也没有返回任何结果

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

(当然,我可以通过不使用光学解决,但在这种情况下,它将是一个完美的匹配)

[更新]

我最终通过修改最终声明实现了这一目标:

return $subids
=> op:join-cross-product($notids)
=> op:where(op:eq(op:col('subid'), op:col('notid')))
=> op:result() 
因此,您无法在条件中使用片段定义。在这之后,我用一个连接内部结构替换了连接叉积,这应该更有效一些


完整地说,我最初使用了此处()的MarkLogic文档中的示例,特别是最后一个示例,在该示例中,他们使用了片段列定义作为join INTERNAR语句中的参数,但在我的情况下,该语句不起作用。

叉积通常仅对小行集有用

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

这种疑问可以通过以下方式表达:

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() 
可以使用以下方法显式创建联接:

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() 

希望这能有所帮助,

嗨,谢谢你的回复。不幸的是,这不起作用(我将=>with改为=>map:with)。不过,我最终还是让它工作了,请参阅更新原始帖子。它仍然需要片段列定义。