2013-01-24 10 views

Odpowiedz

8

Możesz analizować i manipulować językiem SPARQL w Javie za pomocą Apache Jena ARQ po prostu na poziomie składni lub algebry. QueryFactory.create(queryString) udostępnia reprezentację java kwerendy. Następnie rozglądamy:

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 

(patrz the Query java documentation)

Spróbuj uruchomić z samouczka 'Manipulating SPARQL using ARQ'. To da ci pojęcie, w jaki sposób reprezentowane są zapytania i jak je wyciągać (visitors są szczególnie przydatne). Chociaż początkowo poziom składni jest najbardziej znany, dla wielu zadań działa lepiej, ponieważ odpowiada to, co faktycznie robi zapytanie.

+0

zacznę mój główny z SPARQL String = „SELECT a b c WHERE {? A ? B.? A ? C.} "; Zapytanie kwerendy = QueryFactory.create (sparql); ale pojawia się komunikat Wyjątek w wątku "główny" java.lang.NoClassDefFoundError: com/hp/hpl/jena/shared/PrefixMapping $ IllegalPrefixException \t at com.hp.hpl.jena.query.QueryFactory.create (QueryFactory.java:68) \t na com.hp.hpl.jena.query.QueryFactory.create (QueryFactory.java:40) \t na com.hp.hpl.jena.query.QueryFactory.create (QueryFactory.java:28) \t at testsparql.main (testsparql.java:13) –

+0

Potrzebujesz biblioteki jena-arq i jena-core na swojej ścieżce klas. Podejrzewam, że tęsknisz za tym drugim. – user205512

+0

Aha, i jena-iri iirc. (Użyj menedżera zależności, jeśli to możliwe) – user205512

4

Oto w jaki sposób można analizować i manipulować zapytanie sparql użyciu Sesame:

do analizowania:

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

Wyjście to jest ParsedQuery, który jest algebraiczna reprezentacja przedmiotem zapytania. Jeśli chcesz konkretnie dostać drzewa Przetwarza się, że możliwe jest również:

ASTQueryContainer parseTree = SyntaxTreeBuilder.parseQuery(queryString); 

Następnie można bezpośrednio manipulować to drzewo składniowe poprzez wdrożenie niestandardowych SyntaxTreeBuilderVisitor (wskazówka: przedłużyć ASTVisitorBase więc trzeba tylko przesłonić metody gdzie faktycznie chcesz coś zrobić).

Jeśli wrócimy do algebraicznej modelu można wykonać ParsedQuery na Sesame Sail Repository:

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

manipulować ParsedQuery przed wykonaniem go użyć realizacji QueryModelVisitor, np własny manipulator niestandardowe zapytania:

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

Z takim niestandardowym modelu zapytania odwiedzającego masz pełną kontrolę nad zapytania, aby zoptymalizować go czy rzeczywiście przepisać do innej składni.

Niezależnie od tego, czy manipulacja na poziomie drzewa składni abstrakcyjnej (AST), czy na poziomie modelu zapytania, jest kwestią gustu: model zapytania zapewnia większą elastyczność w zakresie planowania/optymalizacji zapytań i częściowego przepisuje (do późniejszego wykonania w sklepie Sesame), a jeśli twoim celem jest całkowite przepisanie zapytania w innym celu (np. wykonanie go w magazynie innym niż Sesame), manipulowanie drzewem składni bezpośrednio może być łatwiejsze.

Na marginesie, powyższy sposób analizy i wykonania zapytania jest okrężnym sposobem robienia rzeczy. Jeśli nie trzeba manipulować analizowany zapytania przed wykonaniem go, można po prostu przygotować i wykonać kwerendę w repozytorium tak:??

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