2012-03-15 10 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

+0

@sandraこれらの回答のいずれかがあなたのために働いたのですか?もしそうであれば、それを受け入れて他の人にそれが有用であることを伝えるべきです。 –

答えて

6

ローカルクエリの特定の値を持つように変数を制限したい場合は、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のスタイルのインターフェイスを持っており、ビットにより、クエリのビットを構築するために使用することができ、あなたのクエリにプレフィックスを付加などの便利な機能を備えているので、あなたがさらにあなたのコードを簡素化することができ、実際に

この新しい方法の利点は、更新で使用できるパラメータ化されたクエリをより一般的な方法で提供し、既存の方法ではカバーしないリモートクエリを準備するために使用できることです。

+0

ありがとう、Rob私はあなたの提案を試してみます。私がしようとしているのは、ユーザーからの入力を得ることです。名前を入力し、この値をクエリの?nameに渡します。 この機能を提供する他のフレームワークはありますか、一般的にはJenaフレームワークよりも使用する方が良いですか? – sandra

+1

セサミでも同じことをやることができますが、詳細はわかりません。どのフレームワークが自分にとって必要なのかによって決まります。この回答に直接関係していない質問がある場合は、サイト上で新しい質問として質問して、より広く見えるようにしてください – RobV

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のためであるなど、があります。

関連する問題