我正在尝试使用 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();
}
我想做的是参数化?名称。我是 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 样式接口,可用于一点一点地构建查询,并包含有用的功能,例如在查询前添加前缀。
这种新方法的优点在于,它提供了一种更通用的方法来执行参数化查询,该方法也可以与更新一起使用,并且可用于准备现有方法未涵盖的远程查询。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)