[英]Interpolate a string into a SPARQL query with Jena
我想從Java(特別是Jena和ARQ)創建SPARQL查詢。 我想讓可能對SPARQL一無所知的用戶僅通過寫(例如,在Eclipse的控制台中)他要搜索的詞來進行查詢。 以下代碼提供了我要尋找的示例。 如何將字符串word
插入查詢中?
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();
您代碼中的這一行
Filter (regex(?a = ".concat(word)+ "))"+// word is the String variable
會生成SPARQL文本,例如(假設word
是香蕉):
Filter (regex(?a = banana))
這不是在SPARQL中使用regex
方式。 當您嘗試對查詢進行參數化時,最好先確定要有一個可用的表單,然后再開始對其中的一部分進行參數化。 果然,如果您采用查詢的精簡版本:
select * where { filter(regex(?a = "banana")) }
並將其粘貼到sparql.org的驗證器中 ,您將看到這是一個語法錯誤。 但是, regex
的文檔中有一些示例。 regex
接受兩個必需參數和一個可選參數:
"i"
,用於不區分大小寫的匹配) 要使用regex
,您需要執行以下操作:
"filter(regex(?a, \"" + word + "\"))"
這樣你就可以
filter(regex(?a,"banana"))
在查詢中。 當然,這為您帶來了經典的注入問題,因為如果word
包含"
,則會遇到問題。這就是為什么應該使用ParameterizedSparqlString ;您可以
filter(regex(?a,?word))
然后只需將?word
替換為word
,所有轉義都將得到正確處理。
有兩個選項可在查詢字符串中包含參數。 除非要使用更高級的功能(例如模式),否則不需要使用過濾器。 選擇三元組時,您可以僅將用戶提供的值用作三元組的對象:
... WHERE {
?subject pred:somePred "value"
}
要將值包含在查詢中,最好使用QuerySolutionMap將SPARQL參數綁定到某個值,如http://jena.apache.org/documentation/query/parameterized-sparql-strings.html所述 。用戶中的所有特殊字符都提供了字符串(“最重要”),並使用Java字符串串聯來包含值。以上示例將變為
... WHERE {
?subject pred:somePred ?value
}
稍后,您將名稱“值”綁定到用戶提供的值。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.