从表中提取数据(MarkLogic)

问题描述 投票:0回答:1

我目前正在尝试从表中提取数据,以将其用作 XQuery CTS 搜索的 URI 列表。目前,我创建了一个光学查询,它以类似表格的格式返回数据。

例如通过使用以下光学查询

import module namespace op="http://marklogic.com/optic" at "/MarkLogic/optic.xqy";
import module namespace ofn="http://marklogic.com/optic/expression/fn" at "/MarkLogic/optic/optic-fn.xqy";


let $people := op:from-sparql('SELECT * WHERE {?person </id> "000". ?person </path> ?animal}', "sparql")
                => op:select(( op:as('personStr',ofn:string(op:col('person'))), op:as('animalStr',ofn:string(op:col('animal'))) ))


return(
$people => op:result()
)

我将检索一个看起来像这样的表格

personStr      |    animalStr
-------------------------------
/people/000         /animal/001
/people/000         /animal/002

在此表中将包含指向各种文档的 URI,我希望从中提取(例如animalStr)并通过使用

cts:search(fn:doc(uri_list), ....)

进行一些过滤

===使用当前方法更新===

let $people := op:from-sparql('SELECT * WHERE {?person </id> "000". ?person </path> ?animal}', "sparql")
                => op:select(( op:as('personStr',ofn:string(op:col('person'))), op:as('animalStr',ofn:string(op:col('animal'))) ))

let $animal := op:from-lexicons(
  map:entry("animal",cts:uri-reference()),
  "lexicon")
  =>op:where(
     cts:path-geospatial-query("animal_data/location",
    cts:circle(5500, cts:point(-55.854526273011, -151.93342455372309)),
    "type=long-lat-point")
  )

return(
$animal  => op:join-inner(
    $people,
    op:on(
      "animal","animalStr"
    )
  )
  => op:select(("personStr", "animalStr"))
  => op:result()
)

基于这种方法,可以看出,在执行内连接以获得结果之前,我总是需要检索某个位置内的所有动物。但是,理想情况下,我希望将地理空间查询直接应用于从 SPARQL 查询检索的结果。

marklogic marklogic-optic-api
1个回答
2
投票

Optic 可以将 SPARQL 查询限制为从与动态查询匹配的文档投影的三元组,包括与地理空间 cts 查询匹配的文档。

一般模式是:

op.fromSparql(...SPARQL query...)
  .where(...cts query...)

虽然构建器在 SPARQL 查询之后指定 cts.query,但引擎不会按顺序执行这些步骤。相反,引擎会忽略文档中与 cts.query 不匹配的所有三元组。

约束 cts.query 对于行和词典值的工作方式相同。

事实上,提供带有 where() 子句的约束 cts.query 是提高检索效率的最佳实践。对于三元组来说尤其如此,因为三元组根据定义是连接密集型的。

这个模式是否可以满足要求?

希望有帮助,

© www.soinside.com 2019 - 2024. All rights reserved.