PythonのFyzzのように、Javaの変数でsparqlクエリを解析する簡単な方法はありますか? JenaまたはゴマのAPIはどのように使用できますか?JavaコードのSPARQLパーサ
答えて
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はクエリが実際に行うことに対応しています。
を解析するには:
は、ここでは、ゴマを使用して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();
}
- 1. JavaのMSXMLパーサ
- 2. javaのRubyパーサ?
- 3. javaのsparqlクエリ
- 4. Java txtパーサ
- 5. Javaのブール式パーサ
- 6. Java(Jena)のSPARQLクエリ
- 7. JavaのパーサXMLの例
- 8. 特定のJava HTMLパーサ
- 9. どのようにJavaのパーサ
- 10. Java HTMLパーサ/エディタの推奨事項
- 11. 解析XML使っSTAXパーサのJava
- 12. Android Java JSONパーサ/データベースの最適化
- 13. PythonでJavaコードの非常に単純なパーサを書く方法は?
- 14. JavaScriptで書かれたJavaパーサ
- 15. SPARQLが動作しないPythonコード
- 16. Java言語用のJavaパーサはありますか?
- 17. パーサ
- 18. SPARQL
- 19. xmlパーサのデザインアドバイス
- 20. DOMパーサのjava.lang.StackOverflowError
- 21. PHPのOWLパーサ?
- 22. Pythonのパーサが
- 23. DelphiのYAMLパーサ?
- 24. オープンソースのRSSパーサ
- 25. のFileMaker XMLパーサ
- 26. TCLのASNパーサ
- 27. どのHTMLパーサがこのコードを整理できますか?
- 28. OstrosLogViewerパーサ
- 29. Antlr4パーサ
- 30. java domパーサは最初のエンティティのみを取得します
を私は文字列の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) –
)クラスパスにjena-arqとjena-coreのライブラリが必要です。私はあなたが後者を欠いていると思う。 – user205512
ああ、jena-iri iirc。 (可能であれば、依存関係マネージャを使用してください) – user205512