我目前正在尝试从表中提取数据,以将其用作 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 查询检索的结果。
Optic 可以将 SPARQL 查询限制为从与动态查询匹配的文档投影的三元组,包括与地理空间 cts 查询匹配的文档。
一般模式是:
op.fromSparql(...SPARQL query...)
.where(...cts query...)
虽然构建器在 SPARQL 查询之后指定 cts.query,但引擎不会按顺序执行这些步骤。相反,引擎会忽略文档中与 cts.query 不匹配的所有三元组。
约束 cts.query 对于行和词典值的工作方式相同。
事实上,提供带有 where() 子句的约束 cts.query 是提高检索效率的最佳实践。对于三元组来说尤其如此,因为三元组根据定义是连接密集型的。
这个模式是否可以满足要求?
希望有帮助,