2013-01-24 6 views

Antwort

8

Sie können SPARQL in Java mit Apache Jena ARQ ziemlich einfach analysieren oder manipulieren, entweder auf der Syntax oder Algebra Ebene. QueryFactory.create(queryString) wird eine Java-Repräsentation der Abfrage bereitstellen. Dann stochern:

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 

(siehe the Query java documentation)

Versuchen Sie, mit dem Tutorial beginnen 'Manipulating SPARQL using ARQ'. Das gibt Ihnen ein Gefühl dafür, wie Abfragen dargestellt werden, und wie man Dinge aus ihnen herauszieht (visitors sind besonders nützlich). Obwohl zunächst die Syntaxebene am vertrautesten ist, funktioniert die algebra für viele Aufgaben besser, da sie dem entspricht, was eine Abfrage tatsächlich tut.

+0

i mein Haupt beginnen mit String sparql = „SELECT a b c WO {? A ? B.? A ? C.} "; Abfrageabfrage = QueryFactory.create (sparql); aber ich erhalte die Nachricht Ausnahme im Thread "Haupt" java.lang.NoClassDefFoundError: com/hp/hpl/jena/geteilt/PrefixMapping $ IllegalPrefixException \t at com.hp.hpl.jena.query.QueryFactory.create (QueryFactory.java:68) \t bei com.hp.hpl.jena.query.QueryFactory.create (QueryFactory.java:40) \t bei com.hp.hpl.jena.query.QueryFactory.create (QueryFactory.java:28) \t at testsparql.main (testsparql.java:13) –

+0

Sie benötigen Jena-arq und jena-Core-Bibliotheken auf Ihrem Klassenpfad. Ich vermute, dass du Letzteres vermisst. – user205512

+0

Oh, und jena-iri iirc. (Verwenden Sie einen Abhängigkeitsmanager, wenn möglich) – user205512

4

Hier ist, wie Sie eine SPARQL Query analysieren und manipulieren kann Sesame mit:

zu analysieren:

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

Der Ausgang dieses ist ein ParsedQuery, die eine algebraische Objektdarstellung der Abfrage ist. Wenn Sie speziell wünschen sich den Parse-Baum zu bekommen, ist, dass auch möglich:

ASTQueryContainer parseTree = SyntaxTreeBuilder.parseQuery(queryString); 

können Sie dann direkt diesen abstrakten Syntaxbaum manipulieren, indem Sie eine benutzerdefinierte SyntaxTreeBuilderVisitor (Spitze Umsetzung: verlängern ASTVisitorBase so nur Sie müssen die Methoden außer Kraft setzen wo du eigentlich etwas machen willst).

Wenn wir zurück in die algebraische Modell gehen, können Sie die ParsedQuery auf einem Sesame Sail Repository ausführen:

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

Um die ParsedQuery zu manipulieren, bevor es ausgeführt wird, verwenden Sie eine QueryModelVisitor Implementierung, z.B. Ihre eigenen Abfrage Manipulator:

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

Mit einer solchen kundenspezifischen Abfragemodell Besucher haben Sie die vollständige Kontrolle über die Abfrage, es zu optimieren oder auch in eine andere Syntax neu zu schreiben.

Ob diese Manipulation auf der Ebene des abstrakten Syntaxbaums (AST) oder auf der Ebene des Abfragemodells durchgeführt wird, ist Geschmackssache: Das Abfragemodell gibt Ihnen mehr Flexibilität bei der Abfrageplanung/-optimierung und teilweise schreibt neu (für die spätere Ausführung in einem Sesame-Store), während, wenn es Ihr Ziel ist, die Abfrage für einen anderen Zweck komplett neu zu schreiben (z. B. Ausführen in einem Nicht-Sesame-Store), könnte die Syntax des Syntaxbaums einfacher sein.

Nebenbei ist der obige Weg, eine Abfrage zu parsen und auszuführen, ein umständlicher Weg, Dinge zu tun. Wenn Sie die analysierte Abfrage manipulieren müssen es nicht vor der Ausführung, können Sie einfach erstellen und eine Abfrage auf einem Repository wie so ausführen:?

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