java-使用JENA的参数化SPARQL查询
作者:互联网
我正在尝试使用Jena框架,JSP和JAVA构建一个小的语义Web应用程序.我有一个远程SPARQL端点,并且我已经编写了一个简单的查询,该查询可以正常工作,但是现在我需要使用一些参数.到目前为止,这是我的代码:
final static String serviceEndpoint = "http://fishdelish.cs.man.ac.uk/sparql/";
String comNameQuery =
"PREFIX fd: <http://fishdelish.cs.man.ac.uk/rdf/vocab/resource/> " +
"SELECT ?name ?language ?type" +
"WHERE { ?nameID fd:comnames_ComName ?name ;" +
"fd:comnames_Language ?language ;" +
"fd:comnames_NameType ?type ." +
"}";
Query query = QueryFactory.create(comNameQuery);
QueryExecution qe = QueryExecutionFactory.sparqlService(serviceEndpoint,query);
try {
ResultSet rs = qe.execSelect();
if ( rs.hasNext() ) {
System.out.println(ResultSetFormatter.asText(rs));
}
}
catch(Exception e) {
System.out.println(e.getMessage());
}
finally {
qe.close();
}
我要做的是参数化?name.我是Jena的新手,我不确定如何在SPARQL查询中使用参数.如果有人可以帮助我,我将不胜感激.
解决方法:
如果只想将变量限制为本地查询具有特定值,则可以使用QueryFactory.create()方法的重载来实现,该方法需要QuerySolutionMap来设置值限制.请注意,这不会改变您的查询,只是限制了最终结果,因此这并不是真正的参数化.
如果您想真正拥有真正的参数化查询(即用变量替换常量),则有多种方法可以执行此操作,具体取决于您的ARQ版本.
使用任何当前版本(2.9.0以下)的唯一方法是字符串连接,即在查询中不使用?name而是插入所需的值,例如“鲍勃”
使用最新的中继线(2.9.1-SNAPSHOT起),有一个新的ParameterizedSparqlString类使它更加用户友好,例如
ParameterizedSparqlString queryStr = new ParameterizedSparqlString(comNameQuery);
queryStr.setLiteral("name", "Bob");
Query query = QueryFactory.create(queryStr.toString());
实际上,由于ParameterizedSparqlString具有StringBuffer样式的接口,可以进一步简化代码,可用于一点一点地构建查询,并包括有用的功能,例如在查询之前添加前缀.
这种新方法的优点在于,它提供了一种更通用的方式来执行参数化查询,该方法也可以与更新一起使用,并且可用于准备现有方法未涵盖的远程查询.
标签:jena,java,sparql,parameters 来源: https://codeday.me/bug/20191010/1888159.html