2016-05-30 16 views
0

Ich stehe vor einem seltsamen Problem mit SPARQL. Dieses Stück Code funktioniert gut auf QConsole -SPARQL in XQuery gibt kein Ergebnis zurück

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) 

Aber es ist nicht richtig funktioniert, wenn sie in den XQuery-Entwicklungscode und implementiert in Module hinzugefügt. sem:sparql gibt in diesem Fall nichts zurück.

Gibt es Einstellungen, die vorgenommen werden müssen? Oder fehlt mir etwas? Gedanken dazu bitte!

+0

Gibt die SPARQL-Abfrage selbst die erwarteten Ergebnisse zurück? – AKSW

+0

Ja, tut es. Auch dieser Code, der von QConsole ausgeführt wird, funktioniert einwandfrei. Es verhält sich nur in unerwarteter Weise, wenn es mit dem implementierten Code ausgeführt wird. –

+0

Wird das Modul erneut in derselben Datenbank ausgeführt, die Sie in der Abfragekonsole verwenden? Sie können auch festlegen, dass die Triples, für die die Abfrage ausgeführt wird, nicht mit der Option "$ store" verwendet werden, die eine Liste von In-Nemory-Triple-Stores erstellt. – scotthenninger

Antwort

1

Bitte beachten Sie, dass Tripel Dokumente sind und der gleichen Sicherheit wie andere Dokumente folgen.

Sind Sie also sicher, dass Sie das Recht haben, die Dokumente zu lesen, die die Tripel enthalten?

Beispiel: Verwenden Sie Admin in der Abfragekonsole und einen anderen Benutzer für den Code auf andere Weise ausgeführt?

+0

Dank David, Dieser Teil habe ich auch herausgefunden, dass das Problem wegen des unterschiedlichen Benutzers ist. Ich muss nur wissen, welche spezielle Berechtigung oder Rolle ich dem Benutzer zuweisen muss, um diese verwenden zu können? –

+1

Ihr Benutzer benötigt eine Rolle mit Leseberechtigung für die dreifachen Dokumente. Ich denke, das wird über grafische Berechtigungen gesteuert, siehe auch http://docs.marklogic.com/sem:graph-set-permissions. – grtjn

+0

Sie beschreiben nicht, wie Ihre Tripel gespeichert sind. Es hängt auch davon ab, wie Sie Ihre Tripel speichern. Nicht verwaltete (eingebettete) Tripel bedeuten, dass Sie mindestens Leserechte für das Dokument benötigen, für das die Tripel eingebettet sind. –