2013-11-26 29 views
0

我想從Java(特別是Jena和ARQ)創建SPARQL查詢。我想讓一個對SPARQL可能一無所知的用戶通過編寫(例如,在Eclipse的控制檯中)他想搜索的單詞來進行查詢。以下代碼給出了我正在尋找的示例。如何將字符串word插入到查詢中?將字符串插入與Jena的SPARQL查詢

String word="someThingToFind"; // a variable entered by the user who want to request my data 
String queryString = 
"Select ?a ?b"+ 
    " Where { ...."+ 
    " Filter (regex(?a = ".concat(word)+ "))"+// word is the String variable 
" }"; 

Query query = QueryFactory.create(queryString, Syntax.syntaxARQ); 
QueryExecution qe = QueryExecutionFactory.create(query, model); 
ResultSet results = qe.execSelect(); 
ResultSetFormatter.out(System.out, results, query); 
qe.close(); 
+0

[參數化SPARQL查詢與JENA]可能的重複(http://stackoverflow.com/questions/9729659/parameterized-sparql-query-with-jena) – RobV

+0

不,我不這麼認爲,因爲我試過這個解決方案,但它沒有工作,即使我試圖連接查詢與我的字符串變量,但它沒有工作。 – jojo

+2

@jojo關閉問題的原因包括:「詢問代碼的問題必須對所解決的問題有最小的理解。**包括嘗試的解決方案,爲什麼他們不工作,以及預期的結果。**」如果您已經嘗試過這是一個已知的解決方案(也就是對另一個問題的答案),你能證明這種嘗試和對此沒有任何作用嗎? –

回答

0

在查詢字符串中有兩個選項可以包含參數。除非要使用更高級的功能,例如模式,否則不需要使用過濾器。當選擇三元,你可以只使用用戶提供的值作爲三聯的對象:

... WHERE { 
    ?subject pred:somePred "value" 
} 

要包括在查詢中,最好使用QuerySolutionMap綁定一個SPARQL參數爲某個值的值,如在案http://jena.apache.org/documentation/query/parameterized-sparql-strings.html否則,越獄用戶提供的字符串的所有特殊字符(」最重要的),並使用Java字符串連接到包括值。上面的例子將成爲

... WHERE { 
    ?subject pred:somePred ?value 
} 

後來你會綁定名稱‘值’的用戶提供的值。

+0

謝謝,但我害怕我不明白,請你解釋更多,知道過濾器對我的查詢很重要,上面的例子只是爲了解釋,我試圖連接查詢與字,但它沒有奏效,可能是我沒有用正確的方式寫下來。 – jojo

4

這行代碼中的

會產生SPARQL文字像(假設word是香蕉):

Filter (regex(?a = banana)) 

如何regex在SPARQL使用。當你嘗試參數化查詢時,最好確保你已經有了一個工作表單,然後你可以開始製作參數化的一部分。果然,如果你把你的查詢的一個精簡版:

select * where { filter(regex(?a = "banana")) } 

,並貼到sparql.org's validator,你會看到,這是一個語法錯誤。但是,documentation for regex有一些例子。 regex需要兩個參數,以及一個可選的參數:

  1. 的字符串(文本)
  2. 另一個字符串(圖案)
  3. (可選)的字符串包含標誌(例如,"i",爲不區分大小寫的匹配)

要使用regex,你需要做這樣的事情:

"filter(regex(?a, \"" + word + "\"))" 

,這樣你可以得到

filter(regex(?a,"banana")) 
查詢

。當然,這會讓你面臨經典的注射問題,因爲如果word包含",那麼你會遇到問題。這就是爲什麼你應該使用ParameterizedSparqlString;你可以有

filter(regex(?a,?word)) 

,然後只需用的word值替換?word,和所有的逃逸將被正確處理。