簡體   English   中英

使用JENA進行參數化SPARQL查詢

[英]Parameterized SPARQL query with 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,只需插入所需的值,例如“Bob”

使用最新的主干(從2.9.1-SNAPSHOT開始)有一個新的ParameterizedSparqlString類,這使得用戶更友好,例如

ParameterizedSparqlString queryStr = new ParameterizedSparqlString(comNameQuery);
queryStr.setLiteral("name", "Bob");

Query query = QueryFactory.create(queryStr.toString());

事實上,您可以進一步簡化代碼,因為ParameterizedSparqlString具有StringBuffer樣式接口,可用於逐位構建查詢,並包含有用的功能,例如在查詢中添加前綴。

這種新方法的優點在於它提供了一種更通用的方式來進行參數化查詢,這些查詢也可以與更新一起使用,並且可用於准備現有方法未涵蓋的遠程查詢。

您可以嘗試查看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。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM