2013-01-24 9 views

答えて

8

Apache JenaのARQを構文または代数レベルで使用すると、javaでSPARQLを解析して操作することができます。 QueryFactory.create(queryString)はクエリのJava表現を提供します。そして、周り突く:

Query query = QueryFactory.create(queryString); 
query.isSelectType() && query.isQueryResultStar(); // of the form SELECT *? 
query.getDatasetDescription(); // FROM/FROM NAMED bits 
query.getQueryPattern(); // The meat of the query, the WHERE bit 
...etc etc.. 
Op op = Algebra.compile(query); // Get the algebra for the query 

を(the Query java documentationを参照)

はチュートリアル'Manipulating SPARQL using ARQ'で起動してみてください。クエリをどのように表現するのか、どのように物事を引き出すのかを感じ取ることができます(visitorsが特に便利です)。最初は構文レベルが最もよく知られていますが、多くのタスクではalgebraはクエリが実際に行うことに対応しています。

を解析するには:

+0

を私は文字列のSPARQL =「SELECT B、Cとの私のメインを開始WHERE {?a ?b?a ?c。} ";クエリクエリ= QueryFactory.create(sparql);しかし、スレッド "main" java.lang.NoClassDefFoundError:com/hp/hpl/jena/shared/PrefixMapping $ IllegalPrefixExceptionのメッセージExceptionが表示される \t com.hp.hpl.jena.query。(QueryFactory.java:40) \t QueryFactory.java:28) \t(testsparql.main(testsparql.java:13) –

+0

)クラスパスにjena-arqとjena-coreのライブラリが必要です。私はあなたが後者を欠いていると思う。 – user205512

+0

ああ、jena-iri iirc。 (可能であれば、依存関係マネージャを使用してください) – user205512

4

は、ここでは、ゴマを使用してSPARQLクエリを解析し、操作することができる方法だ

ParsedQuery pq = QueryParserUtil.parseQuery(QueryLanguage.SPARQL, queryString); 

これの出力は、クエリの代数的オブジェクト表現である、ParsedQueryです。あなたは、具体的構文解析ツリー自体を取得したい場合は、それも可能です:

ASTQueryContainer parseTree = SyntaxTreeBuilder.parseQuery(queryString); 

あなたは、直接カスタムSyntaxTreeBuilderVisitor(先端実装することによって、この抽象構文木を操作することができますので、あなただけのメソッドをオーバーライドする必要がASTVisitorBaseを拡張しますあなたが実際に何かしたい場所)。例えば、QueryModelVisitor実装を使用し、それを実行する前にParsedQueryを操作するため

if (pq instanceof ParsedTupleQuery) { 
     SailTupleQuery query = new SailTupleQuery(pq, repositoryConnection); 
     TupleQueryResult result = query.evaluate(); 
} else if (pq instanceof ParsedGraphQuery) { 
     // etc for other query types 
} 

我々は戻っ代数モデルに行けば、あなたはセサミセイルリポジトリにParsedQueryを実行することができます独自のカスタムクエリマニピュレータ:などのカスタムクエリモデルビジターで

QueryModelVisitor myVisitor = new MyCustomQueryModelVisitor(); 
pq.getTupleExpr().visit(myVisitor); 

は、あなたはそれを最適化するために、または実際に異なる構文に書き換えるために、クエリを完全に制御できます。

この操作を抽象構文木(AST)のレベルで実行するか、またはクエリモデルのレベルで実行するかは、問題視されます。クエリモデルは、クエリの計画/最適化と部分的別の目的(例えば、セサーム以外のストアで実行)でクエリを完全に書き直すことを目標とする場合は、構文ツリーを直接操作する方が簡単かもしれません。

上記のようにクエリを解析して実行する方法は、ラウンドアラウンドな方法です。あなたはそれを実行する前に解析されたクエリを操作する必要がない場合は、単にそのようなリポジトリにクエリ準備して実行することができます???

String queryString = "SELECT ..."; 
RepositoryConnection conn = repo.getConnection(); 
try { 
    TupleQuery tq = conn.prepareTupleQuery(QueryLanguage.SPARQL, queryString); 
    TupleQueryResult result = tq.evaluate(); 
} 
finally { 
    conn.close(); 
}