高效的XQuery查询,用于确定元素不存在的文档

高效的XQuery查询,用于确定元素不存在的文档,xquery,marklogic,marklogic-8,Xquery,Marklogic,Marklogic 8,比如说,我收集了大约5000万张这样的唱片: <record> <some_data> <some_data_id>112423425345235</some_data_id> </some_data> </record> <record> <some_data> </some_data> </record> 112423425345235 所以

比如说,我收集了大约5000万张这样的唱片:

<record>
  <some_data>
    <some_data_id>112423425345235</some_data_id>
  </some_data>
</record>
<record>
  <some_data>
  </some_data>
</record>

112423425345235
所以我可能有一百万条记录(坏数据)看起来像这样:

<record>
  <some_data>
    <some_data_id>112423425345235</some_data_id>
  </some_data>
</record>
<record>
  <some_data>
  </some_data>
</record>

某些_数据元素为空。 因此,如果我在一些数据\u id上设置了
元素范围索引
,那么什么样的高效XQuery查询会让我删除所有的空索引

我想我要寻找的是一个查询,它不是一个FLWOR,您可以检查每个元素是否存在子记录,因为我认为这样做效率很低(即,将数据拉回来,然后进行过滤)

然而,如果我在
cts:search
查询中这样做,那么它会更有效,就像在将数据拉回来之前过滤数据一样


请编写一个能够有效执行此操作的查询,并确认我对FLWOR语句的假设是否正确。

我认为您不需要范围索引来有效执行此操作。通过
cts:query
构造函数使用“通用”元素索引应该可以:

cts:element-query(xs:QName('record'),
  cts:element-query(xs:QName('some_data'),
    cts:not-query(cts:element-query(xs:QName('some_data_id'), cts:and-query(())))
  )
)

非常感谢。我在一份FLWOR声明中检查了孩子们的长度,结果很糟糕。这是指数级的速度。您可能还希望尝试
cts:element查询(xs:QName('some_data_id')、cts:或query(())
,而不是not查询。行为上有细微的差别。。