MarkLogic中如何快速将SPARQL查询的Solution转为Sequence?
问题描述
在QConsole中执行以下SPARQL查询,正常返回包含2346条数据的solution,耗时仅5 ms:
xquery version "1.0-ml"; import module namespace sem = "http://marklogic.com/semantics" at "/MarkLogic/semantics.xqy"; let $distinct-ids := ' SELECT DISTINCT ?itemId WHERE { ?itemId <hasListName> ?listName . FILTER (lcase(str(?listName)) = "test") } ' return sem:sparql($distinct-ids)
需求是将结果转换为sequence而非solution以便后续处理。尝试用return map:get(sem:sparql($distinct-ids), "itemId")实现功能,虽能正常工作但耗时长达90 ms。请问有没有不使用map:get的更快方法?
优化方案
可以通过给sem:sparql()函数传入额外参数,让查询直接返回值序列,避免后续映射遍历的开销:
xquery version "1.0-ml"; import module namespace sem = "http://marklogic.com/semantics" at "/MarkLogic/semantics.xqy"; let $distinct-ids := ' SELECT DISTINCT ?itemId WHERE { ?itemId <hasListName> ?listName . FILTER (lcase(str(?listName)) = "test") } ' return sem:sparql($distinct-ids, ("format", "values"))
这个方法直接让SPARQL查询返回itemId的原生序列,不需要再通过map:get逐个提取,性能会和原查询接近,避免了额外的耗时开销。
内容的提问来源于stack exchange,提问作者marklogic_coder
相关产品推荐
相关产品推荐

