2017-01-13 55 views
1

我試圖通過他們的sparql端點和rdf4j(2.1.4)的sparqlrepository查詢marklogic服務器(版本8),但marklogic端點似乎不接受這些sparql查詢。使用RDF4J查詢Marklogic SPARQLRepository

代碼示例:

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

這將導致以下錯誤:

「錯誤響應」:{ 「的StatusCode」:400, 「狀態」: 「錯誤的請求」, 「messageCode」:」 REST-UNSUPPORTEDPARAM「,」message「:」REST-UNSUPPORTEDPARAM:(err:FOER0000)端點不支持查詢參數:無效參數:queryLn,推斷請求「}}

有什麼建議嗎?

回答

1

正如大衛·恩尼斯的答案解釋,問題在於RDF4J的SPARQL端點客戶端在其請求中發送了幾個不屬於W3C SPARQL 1.1 Protocol的參數;它們是RDF4J REST API(SPARQL協議的擴展)的一部分。

儘管大多數SPARQL端點實現只是忽略不屬於標準(或記錄警告)的參數,但MarkLogic實現了更嚴格的策略,並且拒絕回答這些請求。

你的情況的解決方案是升級到RDF4J 2.2。改進#721,這是關於確保只有符合標準的參數發送到非RDF4J SPARQL端點,已在此新版本中實現,並且(假設MarkLogic在其他方面符合標準),這應該解決與MarkLogic進行通信時的問題端點。

+1

是的,2.2現在有效。謝謝! – ChristophE

4

MarkLogic不接受名爲queryLn(查詢語言)的參數。

語言是SARQL和StructuredQueries,並使用不同的參數來傳遞兩種語言。

請參考文檔在這裏: https://docs.marklogic.com/REST/GET/v1/graphs/sparql

我建議你找到一個方法來抑制你的代碼進行調用的queryLn參數..

+0

將問題記錄爲RDF4J中的錯誤:https://github.com/eclipse/rdf4j/issues/721。可以說MarkLogic可能會稍微寬鬆一點,並且簡單地忽略這個參數,儘管:) –

+1

對於問題的範圍,基本答案是否可接受和完整?如果是這樣,請將其標記爲使我們保持堆棧溢出清潔。它對於任何系統來說都是非常危險的,因爲它忽略了調用者認爲必要的未知參數。對於我來說,更有意義的是,一個連接系統將如所記錄的那樣遵循API。 MarkLogic可以將queryLn視爲一個只有一個有效值(SPARQL)的「可選」參數,而不是忽略參數。這與允許客戶端連接到API並認爲它正在發送被忽略的有用參數完全不同。 –

+0

'queryLn'是一個特定於RDF4J自己的REST API的參數。這不是客戶錯誤地認爲MarkLogic的API可以理解的問題,它只是一些冗餘的信息,包含在基於RDF4J的服務器中,但在標準SPARQL協議中沒有意義。記錄警告是明智的,但沒有理由完全失敗請求:服務器收到足夠的信息來兌現請求(並且據我所知,SPARQL協議中沒有要求只發送記錄的參數)。 –