Ist eine einfache Möglichkeit, Sparql-Abfrage in Variablen für Java zu analysieren, wie Fyzz in Python? Wie können Jena oder Sesam-APIs verwendet werden?SPARQL-Parser für Java-Code
Antwort
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.
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();
}
- 1. Android: erstellen Checkbox über javacode in Klasse Fragment
- 2. JavaCode zum Verbinden von API-Mgr mit Client-ID/Client-Geheimschlüssel/Token
- 3. Wie benutze ich den Tabellenkopf für Einträge und eine Zeile für Eigenschaften in JavaFX
- 4. konnte nicht Hauptklasse finden oder laden, wenn Paketanweisung
- 5. Umgebung für Java + Scala + Aufzug Projekt in Eclipse ohne Maven
- 6. Java Zeile für Zeile ausführen
- 7. Wie man Bildhintergrund vom Code in Android einstellt?
- 8. Entfernen von SWIG-generierten Getter/Setter aus Struktur Java-Klasse
- 9. Wie formatiere ich eine Zahl in Standard-Währungsformat (Komma getrennte Ziffern)
- 10. Art der Ausnahme im Catch-Block
- 11. Scala für() vs für {}
- 12. Verbindungszeichenfolge für Informix für .NET
- 13. Mindestanforderungen für Unity für Android?
- 14. Gruppe für Monat für Anwesenheitsliste
- 15. Modul für OneSignal für Appcelerator
- 16. Vorschlag für Vorlagenbuch für C++?
- 17. Alternative für BtsMSITask für BizTalk
- 18. Elmah für WCF für Ausnahmebehandlung
- 19. ElementNotVisibleException | Testen von AngularJs Apps mit Selenium Webdriver
- 20. Beispiel für den Domain-Namen für mailgun be für nodejs?
- 21. Einstellung für Ländereinstellung für Java-Überschreibung für bestimmtes Gebietsschema
- 22. Implementieren von Bedingungsvariablen für CRITICAL_SECTIONs für WinThreads für XP
- 23. Wie benutze ich den LayoutInflateter Inflatter richtig?
- 24. Longitude Laltitude eines Punktes in meiner Weltkarte in Mollweide Projektion
- 25. Alternative für ‚in‘ Operator für verschachtelte Listen
- 26. Validierung für TextBox für ein Benutzerformular
- 27. Jeder Ersatz für Bugsense für ACRA
- 28. "für" Schleife in einem anderen "für" Schleife
- 29. Empfehlung für Bildschirm-Video-Capture für Demos
- 30. istream für die Kommandozeileneingabe für C++/Poco
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) –
Sie benötigen Jena-arq und jena-Core-Bibliotheken auf Ihrem Klassenpfad. Ich vermute, dass du Letzteres vermisst. – user205512
Oh, und jena-iri iirc. (Verwenden Sie einen Abhängigkeitsmanager, wenn möglich) – user205512