编程语言
首页 > 编程语言> > java-使用JENA的参数化SPARQL查询

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