使用耶拿将字符串内插到SPARQL查询中

joj*_*ojo 1 java rdf sparql 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();
Run Code Online (Sandbox Code Playgroud)

Jos*_*lor 5

您代码中的这一行

Filter (regex(?a = ".concat(word)+ "))"+// word is the String variable
Run Code Online (Sandbox Code Playgroud)

会生成SPARQL文本,例如(假设word是香蕉):

Filter (regex(?a = banana))
Run Code Online (Sandbox Code Playgroud)

这是如何regex在SPARQL使用。当您尝试对查询进行参数化时,最好先确定要使用的工作表单,然后再开始对其中的一部分进行参数化。果然,如果您采用查询的精简版本:

select * where { filter(regex(?a = "banana")) }
Run Code Online (Sandbox Code Playgroud)

并将其粘贴到sparql.org的验证器中,您将看到这是一个语法错误。但是,文档中regex有一些示例。 regex接受两个必需参数和一个可选参数:

  1. 字符串(文本)
  2. 另一个字符串(模式)
  3. (可选)包含标志的字符串(例如"i",用于不区分大小写的匹配)

要使用regex,您需要执行以下操作:

"filter(regex(?a, \"" + word + "\"))"
Run Code Online (Sandbox Code Playgroud)

这样你就可以

filter(regex(?a,"banana"))
Run Code Online (Sandbox Code Playgroud)

在查询中。当然,这会给您带来经典的进样问题,因为如果word包含,您将遇到问题"。这就是为什么您应该使用ParameterizedSparqlString ; 你可以有

filter(regex(?a,?word))
Run Code Online (Sandbox Code Playgroud)

然后只需将替换?wordword,所有转义都将得到正确处理。