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

标签 java parameters sparql jena

我正在尝试使用 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/

相关文章:

java - 将 Freebase Unicode 代码点转换为 Java 字符串

java - 如何检查一个字符是否等于一个空格?

java - 如何在 Java 中安装 httpclient 和其他库以便在 Eclipse 中使用它们?

java - 什么类用于关键字 'synchronized' ?

java - 为什么列表不能包含在 `Integer...` 参数中

web-services - 如何使用 Tomcat 7.0.27 提供 SPARQL 端点

java - 计算二维数组中某个元素在给定列中出现的次数?

c - "[*]"(星号修饰符)在 C 中是什么意思?

c++ - 标准 C++ 库中的 Null 类型

Python Sparql 查询本地文件