2016-05-30 64 views
0

我正在面对使用SPARQL的奇怪问题。这段代码工作正常上QConsole -XQuery中的SPARQL不返回结果

xquery version "1.0-ml"; 
import module namespace sem = "http://marklogic.com/semantics" at "/MarkLogic/semantics.xqy"; 

declare function local:forex-series (
    $from-currency-id as xs:string, 
    $to-currency-id as xs:string, 
    $forex-supplier-id as xs:string, 
    $feed-name-id as xs:string 
) 
{ 
    let $map := map:map() 
    let $series-sparql := 'PREFIX series: <http://iddn.icis.com/series/> 
        PREFIX predicates: <http://iddn.icis.com/predicates/> 
        PREFIX xmls: <http://www.w3.org/2001/XMLSchema#> 

        SELECT ?series 
        WHERE { 
         ?series predicates:to-currency $toCurrencyId ; 
           predicates:from-currency $fromCurrencyId ; 
           predicates:forex-provider $forexSupplierId ; 
           predicates:forex-feed $feedNameId ; 
        }' 
    let $_ := map:put($map, "toCurrencyId", sem:iri($to-currency-id)) 
    let $_ := map:put($map, "fromCurrencyId", sem:iri($from-currency-id)) 
    let $_ := map:put($map, "forexSupplierId", sem:iri($forex-supplier-id)) 
    let $_ := map:put($map, "feedNameId", sem:iri($feed-name-id)) 
     return 
      sem:query-results-serialize(sem:sparql($series-sparql, $map)) 
}; 

let $to-currency-id := "http://iddn.icis.com/ref-data/currency/10" 
let $from-currency-id := "http://iddn.icis.com/ref-data/currency/18" 
let $forex-supplier-id := "http://iddn.icis.com/asset/forex/xe" 
let $feed-name-id := "http://iddn.icis.com/asset/forex/current" 
return local:forex-series($from-currency-id, $to-currency-id, $forex-supplier-id, $feed-name-id) 

但是当加入到XQuery的开发代码并将其部署到模块中它不能正常工作。 sem:sparql在这种情况下不会返回任何内容。

是否有任何设置需要完成?或者我错过了什么?请关注这个问题!

+0

SPARQL查询本身是否返回预期结果? – AKSW

+0

是的,它的确如此。即使从QConsole执行此代码也能正常工作。在部署代码运行时,它只会以意想不到的方式运行。 –

+0

模块是否正在与查询控制台中使用的相同数据库重新运行?您还可以使用带有内存三重存储列表的'$ store'选项来设置查询正在执行的三元组。 – scotthenninger

回答

1

请记住,三元组是文档,并遵循与其他文档相同的安全性。

那么,你确定你有权利阅读包含三元组的文档吗?

示例:您是否在查询控制台中使用了管理员,而代码的其他用户是否以其他方式运行?

+0

谢谢大卫,这部分我也想出了这个问题是因为不同的用户。我只需要知道我需要分配给用户的哪个特权或角色才能使用它? –

+1

您的用户需要具有对三重文档具有读取权限的角色。我认为这是通过图表权限控制的,另请参阅http://docs.marklogic.com/sem:graph-set-permissions .. – grtjn

+0

您不会描述您的三元组是如何存储的。这也取决于你如何存储你的三元组。非托管(嵌入式)三元组意味着您至少需要读取三元组所嵌入文档的权限。 –