2013-05-30 10 views
7

Ho bisogno di eseguire una query su DBpedia:Carica DBpedia localmente usando Jena TDB?

SELECT DISTINCT ?poi ?lat ?long ?photos ?template ?type ?label WHERE { 
    ?poi <http://www.w3.org/2000/01/rdf-schema#label> ?label . 
    ?poi <http://www.w3.org/2003/01/geo/wgs84_pos#lat> ?lat . 
    ?poi <http://www.w3.org/2003/01/geo/wgs84_pos#long> ?long . 
    ?poi <http://dbpedia.org/property/hasPhotoCollection> ?photos .      
    OPTIONAL {?poi <http://dbpedia.org/property/wikiPageUsesTemplate> ?template } . 
    OPTIONAL {?poi <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> ?type } . 
    FILTER (?lat > x && ?lat < y && 
      ?long > z && ?long < ω && 
      langMatches(lang(?label), "EN")) 
} 

Sto indovinando queste informazioni sono sparsi tra diverse discariche file (.NT) e in qualche modo l'endpoint SPARQL ci serve con un set di risultati. Ho bisogno di scaricare questi diversi file .nt localmente (non tutti i DBpedia), eseguire solo una volta la mia query e memorizzare i risultati localmente (non voglio usare l'endpoint SPARQL).

  • Quali parti di Jena dovrei usare per questa corsa?

I m un po 'confuso lettura da this post:

Quindi, è possibile caricare tutti i dati DBpedia in un unico luogo TDB su disco (vale a dire una singola directory). In questo modo, puoi eseguire query SPARQL su di esso.

  • Come faccio a caricare il DBpedia in un unico luogo TDB, in termini Jena, se abbiamo ottenuto tre file DBpedia .NT? Come applichiamo la query precedente su quei file .nt? (Qualsiasi codice sarebbe d'aiuto.)

  • Esempio, è sbagliato?

String tdbDirectory = "C:\\TDB"; 
String dbdump1 = "C:\\Users\\dump1_en.nt"; 
String dbdump2 = "C:\\Users\\dump2_en.nt"; 
String dbdump3 = "C:\\Users\\dump3_en.nt"; 
Dataset dataset = TDBFactory.createDataset(tdbDirectory); 
Model tdb = dataset.getDefaultModel(); //<-- What is the default model?Should I care? 
//Model tdb = TDBFactory.createModel(tdbdirectory) ;//<--is this prefered? 
FileManager.get().readModel(tdb, dbdump1, "N-TRIPLES"); 
FileManager.get().readModel(tdb, dbdump2, "N-TRIPLES"); 
FileManager.get().readModel(tdb, dbdump3, "N-TRIPLES"); 
String q = "my big fat query"; 
Query query = QueryFactory.create(q); 
     QueryExecution qexec = QueryExecutionFactory.create(query, tdb); 
     ResultSet results = qexec.execSelect(); 
     while (results.hasNext()) { 
     //do something significant with it 
} 
qexec.close() 
tdb.close() ; 
dataset.close(); 
  • Nel codice sopra è stato usato "dataset.getDefaultModel" (per ottenere il grafico predefinito come Jena Model). Questa affermazione è valida? Abbiamo bisogno di creare un set di dati per eseguire la query o dobbiamo andare con TDBFactory.createModel(tdbdirectory)?
+0

E 'importante per voi che fate questo tutto all'interno di Java? È possibile utilizzare TDB ed eseguire query SPARQL utilizzando gli strumenti della riga di comando forniti da Jena, il tutto senza scrivere alcun codice Java. È un'opzione per te? –

+1

Se, come ho chiesto nel commento precedente, l'utilizzo di TDB localmente senza scrivere alcun codice Java è un'opzione, dai un'occhiata alla seconda sezione di [questa risposta] (http://stackoverflow.com/a/16610663/1281433) , chiamato "Uso di TDB localmente". Se ciò sembra appropriato, possiamo usarlo come punto di partenza e quindi capire quali set di dati dovrebbero essere scaricati localmente. –

+0

@GeorgePaptheodorou Hai finito per fare qualche progresso con questo? –

risposta

5

Per lasciare indice di Jena a livello locale:

/** The Constant tdbDirectory. */ 
public static final String tdbDirectory = "C:\\TDBLoadGeoCoordinatesAndLabels"; 

/** The Constant dbdump0. */ 
public static final String dbdump0 = "C:\\Users\\Public\\Documents\\TDB\\dbpedia_3.8\\dbpedia_3.8.owl"; 

/** The Constant dbdump1. */ 
public static final String dbdump1 = "C:\\Users\\Public\\Documents\\TDB\\geo_coordinates_en\\geo_coordinates_en.nt"; 

... 

Model tdbModel = TDBFactory.createModel(tdbDirectory);<\n> 

/*Incrementally read data to the Model, once per run , RAM > 6 GB*/ 
FileManager.get().readModel(tdbModel, dbdump0); 
FileManager.get().readModel(tdbModel, dbdump1, "N-TRIPLES"); 
FileManager.get().readModel(tdbModel, dbdump2, "N-TRIPLES"); 
FileManager.get().readModel(tdbModel, dbdump3, "N-TRIPLES"); 
FileManager.get().readModel(tdbModel, dbdump4, "N-TRIPLES"); 
FileManager.get().readModel(tdbModel, dbdump5, "N-TRIPLES"); 
FileManager.get().readModel(tdbModel, dbdump6, "N-TRIPLES"); 
tdbModel.close(); 

per interrogare Jena:

String queryStr = "dbpedia query "; 

Dataset dataset = TDBFactory.createDataset(tdbDirectory); 
Model tdb = dataset.getDefaultModel(); 

Query query = QueryFactory.create(queryStr); 
QueryExecution qexec = QueryExecutionFactory.create(query, tdb); 

/*Execute the Query*/ 
ResultSet results = qexec.execSelect(); 

while (results.hasNext()) { 
    // Do something important 
} 

qexec.close(); 
tdb.close() ; 
+0

+1 per tornare a una domanda e fornire una risposta che funzioni per te. Grazie! Dovresti anche considerare [contrassegnandolo come accettato] (http://meta.stackexchange.com/questions/5234/how-does-accepting-an-answer-work). –

Problemi correlati