[英]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.