繁体   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