Marklogic:如何在绑定中传递整数给sem:sparql-triples



我想传递一个整数给sem:sparql-triples用作LIMIT或OFFSET。我已经通过绑定映射传递了其他变量,但是很难让查询接受整数。从ML的文档中借用一些代码来演示:

import module namespace sem = "http://marklogic.com/semantics" 
  at "/MarkLogic/semantics.xqy";
let $string := "
<http://dbpedia.org/resource/Jacqueline_Kennedy_Onassis>
<http://xmlns.com/foaf/0.1/knows>
<http://dbpedia.org/resource/Eunice_Kennedy_Shriver> .
<http://dbpedia.org/resource/John_F._Kennedy,_Jr.>
<http://xmlns.com/foaf/0.1/knows>
<http://dbpedia.org/resource/Jacqueline_Kennedy_Onassis> .
<http://dbpedia.org/resource/Rosemary_Kennedy>
<http://xmlns.com/foaf/0.1/knows> <http://dbpedia.org/resource/Jacqueline_Kennedy_Onassis> .
<http://dbpedia.org/resource/Joseph_Patrick_Kennedy_Sr.>
<http://xmlns.com/foaf/0.1/knows> <http://dbpedia.org/resource/Rosemary_Kennedy> .
"
let $triples := sem:rdf-parse($string, "turtle")
let $bindings := map:map()
let $put := map:put($bindings,"limit",1)
return
sem:sparql-triples("
SELECT ?s ?p ?o
WHERE{ 
?s ?p ?o.
} 
ORDER BY ?o
LIMIT ?limit
", $triples, $bindings)

在QConsole中返回错误:

意外的标记语法错误,意外的变量,期望整数字面值

因此,我尝试了一些事情来将值作为整数添加到绑定映射中:

let $put := map:put($bindings,"limit",xs:integer(1))

let $put := map:put($bindings,"limit",sem:typed-literal('1',sem:iri("xs:integer")))

但是到目前为止我还没有成功。什么好主意吗?

完整的错误信息为:

XDMP-UNEXPECTED: (err:XPST0003) Unexpected token syntax error,
unexpected <variable>, expecting <integer literal>

在第7行,极限表达式在这里。所以我的结论是,这不是整数与非类型的问题。你不能在那里使用变量:它必须是一个文字整数。

使用7.0-3:

import module namespace sem = "http://marklogic.com/semantics" 
  at "/MarkLogic/semantics.xqy";
let $string := "
<http://dbpedia.org/resource/Jacqueline_Kennedy_Onassis>
<http://xmlns.com/foaf/0.1/knows>
<http://dbpedia.org/resource/Eunice_Kennedy_Shriver> .
<http://dbpedia.org/resource/John_F._Kennedy,_Jr.>
<http://xmlns.com/foaf/0.1/knows>
<http://dbpedia.org/resource/Jacqueline_Kennedy_Onassis> .
<http://dbpedia.org/resource/Rosemary_Kennedy>
<http://xmlns.com/foaf/0.1/knows> <http://dbpedia.org/resource/Jacqueline_Kennedy_Onassis> .
<http://dbpedia.org/resource/Joseph_Patrick_Kennedy_Sr.>
<http://xmlns.com/foaf/0.1/knows> <http://dbpedia.org/resource/Rosemary_Kennedy> .
"
let $triples := sem:rdf-parse($string, "turtle")
let $bindings := map:map()
return
sem:sparql-triples("
SELECT ?s ?p ?o
WHERE{ 
?s ?p ?o.
} 
ORDER BY ?o
LIMIT "||1,
$triples, $bindings)

我觉得需要一个更新的答案,因为在MarkLogic 8中,您的初始查询将工作-您可以传递一个变量来设置限制。

(注意:仅在8.0-4.2上测试)

最新更新