2013-05-30 78 views
7

我需要對DBpedia中進行查詢:使用Jena TDB在本地加載DBpedia?

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")) 
} 

我猜這些信息分散在不同的轉儲(.NT)文件中,不知怎麼的SPARQL端點提供我們一個結果集。我需要在本地下載這些不同的.nt文件(不是所有的DBpedia),只執行一次查詢並在本地存儲結果(我不想使用SPARQL端點)。

  • Jena的哪些部分應該用於這一次運行?

我米有點混亂從this post讀取:

所以,可以在整個DBpedia中的數據加載到磁盤上的一個單一位置TDB(即,單一的目錄)。這樣,您可以通過它運行SPARQL查詢。

  • 如何將DBpedia中加載到一個單一的TDB的位置,在耶拿而言,如果我們有三個.NT DBpedia的文件?我們如何在這些.nt文件上應用上述查詢? (任何代碼都會有幫助。)

  • 例如,這是錯誤的嗎?

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(); 
  • 在我們使用"dataset.getDefaultModel"上面的代碼(獲取默認的圖形作爲耶拿Model)。這個陳述是否有效?我們是否需要創建一個數據集來執行查詢,或者我們是否應該使用TDBFactory.createModel(tdbdirectory)
+0

是不是對你很重要,你做這一切從Java內部?實際上,您可以使用TDB並使用Jena提供的命令行工具運行SPARQL查詢,而無需編寫任何Java代碼。這對你來說是一種選擇嗎? –

+1

如前所述,如果在本地使用TDB而不編寫任何Java代碼是一種選擇,請參閱[本答案]的第二部分(http://stackoverflow.com/a/16610663/1281433) ,稱爲「在本地使用TDB」。如果看起來合適,我們可以用它作爲起點,然後確定哪些數據集需要在本地下載。 –

+0

@GeorgePaptheodorou你最終在這方面取得了哪些進展? –

回答

5

爲了讓耶拿指數在本地:

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

要查詢耶拿:

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用於回答問題並提供適合您的答案。謝謝!你還應該考慮[標記爲已接受](http://meta.stackexchange.com/questions/5234/how-does-accepting-an-answer-work)。 –