gpt4 book ai didi

java - 使用 JENA 的参数化 SPARQL 查询

转载 作者:塔克拉玛干 更新时间:2023-11-03 04:21:05 26 4
gpt4 key购买 nike

我正在尝试使用 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 样式的接口(interface),可用于一点一点地构建您的查询,并包括有用的功能,例如为您的查询添加前缀。

这种新方法的优点是它提供了一种更通用的参数化查询方式,这种方式也可以与更新一起使用,并且可用于准备现有方法未涵盖的远程查询。

关于java - 使用 JENA 的参数化 SPARQL 查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9729659/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com