簡體   English   中英

使用耶拿將字符串內插到SPARQL查詢中

[英]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接受兩個必需參數和一個可選參數:

  1. 字符串(文本)
  2. 另一個字符串(模式)
  3. (可選)包含標志的字符串(例如, "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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM