2013-05-30 7 views
7

Ich brauche eine Abfrage DBpedia auszuführen:DBpedia lokal laden mit 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")) 
} 

Ich vermute, diese Informationen auf verschiedene Deponien gestreut wird (.nt) Dateien und irgendwie die SPARQL-Endpunkt dient uns mit einer Ergebnismenge. Ich muss diese verschiedenen .nt-Dateien lokal herunterladen (nicht alle DBpedia), nur einmal meine Abfrage durchführen und die Ergebnisse lokal speichern (ich möchte den SPARQL-Endpunkt nicht verwenden).

  • Welche Teile von Jena sollte ich für diesen einen Lauf verwenden?

Ich bin ein wenig verwirrt Lesen von this post:

So, können Sie die gesamte DBPedia Daten in einer einzigen TDB Stelle auf der Festplatte geladen werden kann (das heißt ein einzelnes Verzeichnis). Auf diese Weise können Sie SPARQL-Abfragen ausführen.

  • Wie lade ich die DBpedia in einem einzigen TDB Standort in Jena Begriffe, wenn wir drei .nt DBpedia Dateien erhalten? Wie wenden wir die obige Abfrage auf diese .nt-Dateien an? (Jeder Code würde helfen.)

  • Beispiel, ist das falsch?

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(); 
  • In dem obigen Code, den wir "dataset.getDefaultModel" verwendet (Standard Graph als Jena Model zu bekommen). Ist diese Aussage gültig? Müssen wir ein Dataset erstellen, um die Abfrage auszuführen, oder sollten wir mit TDBFactory.createModel(tdbdirectory) gehen?
+0

Ist es Ihnen wichtig, dass Sie dies tun, alle aus Java? Sie können TDB verwenden und SPARQL-Abfragen mit den von Jena bereitgestellten Befehlszeilentools ausführen, ohne Java-Code zu schreiben. Ist das eine Option für dich? –

+1

Wenn, wie ich im vorherigen Kommentar gefragt habe, die Verwendung von TDB lokal ohne das Schreiben von Java-Code eine Option ist, werfen Sie einen Blick auf den zweiten Abschnitt von [diese Antwort] (http://stackoverflow.com/a/16610663/1281433) "TDB lokal verwendet". Wenn dies geeignet erscheint, können wir dies als Ausgangspunkt verwenden und dann herausfinden, welche Datasets lokal heruntergeladen werden müssen. –

+0

@GeorgePaptheodorou Hast du damit irgendwelche Fortschritte gemacht? –

Antwort

5

nach Jena Index lokal zu lassen:

/** 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(); 

Jena Zur Abfrage:

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 für die Rückkehr zu einer Frage und die Bereitstellung einer Antwort, die für Sie arbeitet. Vielen Dank! Sie sollten auch darüber nachdenken [es als akzeptiert markieren] (http://meta.stackexchange.com/questions/5234/how-does-accepting-an-answer-work). –