【问题标题】:Parameterized SPARQL query with JENA使用 JENA 的参数化 SPARQL 查询
【发布时间】:2012-03-15 23:21:01
【问题描述】:

我正在尝试使用 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 查询中使用参数。如果有人可以帮助我,我将不胜感激。

【问题讨论】:

标签: java parameters sparql jena


【解决方案1】:

如果您只想将变量限制为对本地查询具有特定值,您可以通过重载 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 样式接口,可用于逐位构建您的查询,并包括有用的功能,例如为您的查询添加前缀。

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

【讨论】:

  • 谢谢 Rob 我会尝试你的建议。我打算做的是从用户那里获得输入,例如一个名称并将此值传递给 ?name 在我的查询中。是否有任何其他框架提供此功能,或者总体上比 Jena 框架更好用?
  • 你可以用 Sesame 做同样的事情,但我不知道细节,哪个框架最适合你将取决于你需要做什么样的事情。如果您还有其他与此答案没有直接关系的问题,请在网站上将它们作为新问题提出,以便更广泛地看到它们
【解决方案2】:

您可以尝试查看Twinkql。它是一个 SPARQL 到 Java 的映射框架。它在后端使用 Jena,但试图简化 SPARQL 查询和结果的 Java 绑定。

它允许您在 xml 中定义 SPARQL 查询:

<select id="getNovel" resultMap="novelResultMap">
<![CDATA[
    SELECT ?novel ?author
    WHERE {
        ?novel a <http://dbpedia.org/class/yago/EnglishNovels> ;
            <http://dbpedia.org/property/name> "#{novelName}"@en ;
            <http://dbpedia.org/property/author> ?author .
    }
]]>
</select>

注意#{novelName} 占位符——这是在查询时可以传入参数的地方。

此外,结果可以绑定到 Java Bean:

<resultMap id="novelResultMap" resultClass="org.twinkql.example.Novel">
    <uniqueResult>novel</uniqueResult>
    <rowMap  var="novel" varType="localName" beanProperty="name" />
    <rowMap var="author" varType="localName" beanProperty="author"/>
</resultMap>

有一个 API 可以调用这些查询、传递参数等。它很像 MyBatis,但用于 SPARQL 而不是 SQL。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-06-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多