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)
您代码中的这一行
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接受两个必需参数和一个可选参数:
"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)
然后只需将替换?word为word,所有转义都将得到正确处理。