2012-03-15 49 views
7

我正在嘗試使用Jena框架,JSP和JAVA構建一個小型語義Web應用程序。我有一個遠程SPARQL端點,我已經寫了一個簡單的查詢,它工作正常,但現在我需要使用一些參數。這裏是我的代碼到目前爲止:JENA的參數化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(); 
} 

我想要做的是參數化?名稱。我是Jena的新手,我不確定如何在SPARQL查詢中使用參數。如果有人能幫助我,我將不勝感激。

+0

重複http://answers.semanticweb.com/questions/15237/parameterized-sparql-query-with-jena – RobV 2012-03-16 00:26:44

+0

@sandra這些答案中的任何結果爲您工作?如果有的話,你應該接受它,讓別人知道它是有用的。 – 2013-08-22 16:46:11

回答

6

如果您只是想限制一個變量對於本地查詢具有一定的值,那麼可以使用QueryFactory.create()方法的一個超載來執行此操作,該方法需要QuerySolutionMap來設置值限制。請注意,這並不會改變您的查詢,只會限制最終結果,因此這不是真正的參數化。

如果要真正地擁有真正的參數化查詢(常量即替代變量),那麼有幾個方面,這取決於你的ARQ的版本做。

使用任何當前版本(最高可達2.9.0)做到這一點的唯一方法是字符串連接,即,而不是在你的查詢?名字你只需插入你想例如值「鮑勃」

採用最新幹線(2.9.1-SNAPSHOT起)有一個新的ParameterizedSparqlString類,這使得這麼多的用戶更友好例如

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

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

而事實上,你可以進一步簡化您的代碼,因爲ParameterizedSparqlString有一個StringBuffer風格界面,可以使用位構建查詢一下,包括像前面加上前綴查詢有用的功能。

這種新方法的優點是,它提供這樣做也可以更新使用,並準備將現有的方法不包括遠程查詢使用參數化查詢的更通用的方法。

+0

感謝羅布我會嘗試你的建議。我打算做的是從用戶那裏獲得例如一個名稱並將此值傳遞給我的查詢中的名稱。 有沒有其他的框架提供這個功能,或者一般來說比Jena框架更好用? – sandra 2012-03-16 19:31:03

+1

你也許可以用芝麻做同樣的事情,但我不知道細節,哪個框架最適合你,取決於你需要做什麼樣的事情。如果您還有其他問題與本答案沒有直接關係,請在網站上提出這些問題作爲新問題,以使其更加廣泛可見 – RobV 2012-03-16 20:33:00

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豆類:

<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> 

有調用這些查詢,在參數傳遞等,這很像MyBatis的API,但對於SPARQL,而不是SQL。