2017-01-13 5 views
1

Ich versuche, einen Marklogic-Server (Version 8) über ihre Sparql-Endpunkt und die Sparqlrepository von Rdf4j (2.1.4) abzufragen, aber der Marklogic Endpunkt scheint diese Sparql-Abfragen nicht zu akzeptieren.Frage Marklogic mit RDF4J SPARQLRepository

Code-Beispiel:

String sparqlEndpoint = "http://url/v1/graphs/sparql"; 
SPARQLRepository repo = new SPARQLRepository(sparqlEndpoint); 
repo.initialize(); 
repo.getConnection().hasStatement(null, null, null, false); 

Dies zu folgendem Fehler führt:

"Error": { "status": 400, "Status": "Bad Request", "messageCode":“ REST-UNSUPPORTEDPARAM "," Nachricht ":" REST-UNSUPPORTEDPARAM: (err: FOER0000) Endpunkt unterstützt Abfrageparameter nicht: ungültige Parameter: queryLn, ableiten für Anfrage "}}

Irgendwelche Vorschläge?

Antwort

1

Wie in der Antwort von David Ennis Das Problem besteht darin, dass der SPARQL-Endpunktclient von RDF4J mehrere Parameter in seinen Anforderungen sendet, die nicht Teil des W3C sind. SPARQL 1.1 Protocol; Sie sind stattdessen Teil der RDF4J REST API (eine Erweiterung des SPARQL-Protokolls).

Während die meisten SPARQL-Endpunktimplementierungen einfach Parameter ignorieren, die nicht zum Standard gehören (oder eine Warnung protokollieren), implementiert MarkLogic eine strengere Richtlinie und lehnt es einfach ab, solche Anfragen zu beantworten.

Eine Lösung in Ihrem Fall ist ein Upgrade auf RDF4J 2.2. Die Verbesserung #721, bei der sichergestellt wird, dass nur standardkonforme Parameter an SPARQL-Endpunkte ohne RDF4J gesendet werden, wurde in dieser neuen Version implementiert und sollte (vorausgesetzt, MarkLogic ist ansonsten normenkonform) das Problem bei der Kommunikation mit MarkLogic beheben Endpunkt.

+1

Ja, mit 2.2 funktioniert es jetzt. Vielen Dank! – ChristophE

4

MarkLogic akzeptiert den Parameter queryLn (Abfragesprache) nicht.

Die Sprachen sind SARQL und StructuredQueries und verwenden verschiedene Parameter, um die zwei Sprachen zu übergeben.

Bitte beachten Sie die Dokumentation hier: https://docs.marklogic.com/REST/GET/v1/graphs/sparql

Ich schlage vor, Sie einen Weg finden, die queryLn Parameter in Ihrem Code macht den Anruf zu unterdrücken ..

+0

Problem als Fehler in RDF4J protokolliert: https://github.com/eclipse/rdf4j/issues/721. Wohl könnte MarkLogic etwas nachsichtiger sein und einfach den Parameter ignorieren :) –

+1

Ist die Basisantwort für den Umfang der Frage akzeptabel und vollständig? Wenn ja, markieren Sie es bitte so, dass Stack Overflow sauber bleibt. Es ist gefährlich für ein beliebiges System, unbekannte Parameter zu ignorieren, die der Anrufer für notwendig hält. Es macht mehr Sinn für mich, dass ein Verbindungssystem wie dokumentiert die API einhält. Anstatt Parameter zu ignorieren, könnte MarkLogic queryLn als einen "optionalen" Parameter betrachten, bei dem es nur einen gültigen Wert (SPARQL) gibt. Das ist ganz anders, als einem Client die Verbindung zu einer API zu ermöglichen und zu denken, dass er nützliche Parameter sendet, die einfach ignoriert werden. –

+0

'queryLn' ist ein Parameter, der spezifisch für die REST API von RDF4J ist. Es kommt nicht darauf an, dass der Client fälschlicherweise denkt, dass dies die MarkLogic-API verstehen wird, es handelt sich lediglich um redundante Informationen, die für RDF4J-basierte Server enthalten sind, aber keine Bedeutung im Standard-SPARQL-Protokoll haben. Das Protokollieren einer Warnung ist sinnvoll, aber es gibt keinen Grund, die Anforderung vollständig zu erfüllen: Der Server erhält genügend Informationen, um die Anforderung zu erfüllen (und soweit ich weiß, gibt es im SPARQL-Protokoll keine Anforderung, dass _ nur die dokumentierten Parameter gesendet werden). –