2013-05-30 33 views
7

tôi cần phải thực hiện một truy vấn đối với dbpedia:Tải DBpedia cục bộ bằng 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")) 
} 

Tôi đoán thông tin này được nằm rải rác trong bãi khác nhau (.nt) tập tin và bằng cách nào đó thiết bị đầu cuối SPARQL phục vụ cho chúng ta một tập kết quả. Tôi cần tải xuống các tệp .nt khác nhau cục bộ (không phải tất cả DBpedia), chỉ thực hiện một lần truy vấn của tôi và lưu trữ kết quả cục bộ (tôi không muốn sử dụng điểm cuối SPARQL).

  • Tôi nên sử dụng phần nào của Jena cho lần chạy này?

Tôi m một chút nhầm lẫn đọc từ this post:

Vì vậy, bạn có thể tải toàn bộ dữ liệu dbpedia vào một vị trí TDB đơn trên đĩa (ví dụ: một thư mục duy nhất). Bằng cách này, bạn có thể chạy các truy vấn SPARQL trên nó.

  • Làm thế nào để nạp dbpedia thành một TDB địa điểm duy nhất, trong điều kiện Jena, nếu chúng ta có ba file dbpedia .nt? Làm cách nào để áp dụng truy vấn trên trên các tệp .nt đó? (Bất kỳ mã nào sẽ giúp ích.)

  • Ví dụ, điều này có sai không?

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(); 
  • Trong đoạn mã trên, chúng tôi sử dụng "dataset.getDefaultModel" (để có được đồ thị mặc định như một Jena Model). Tuyên bố này có hợp lệ không? Chúng ta có cần tạo tập dữ liệu để thực hiện truy vấn hay chúng ta nên đi với TDBFactory.createModel(tdbdirectory)?
+0

là điều quan trọng để bạn biết rằng bạn làm điều này tất cả từ bên trong Java? Bạn thực sự có thể sử dụng TDB và chạy các truy vấn SPARQL bằng cách sử dụng các công cụ dòng lệnh được cung cấp bởi Jena, tất cả mà không cần viết bất kỳ mã Java nào. Đó có phải là một lựa chọn cho bạn? –

+1

Nếu, như tôi đã hỏi trong bình luận trước, việc sử dụng TDB cục bộ mà không cần viết bất kỳ mã Java nào là một lựa chọn, hãy xem phần thứ hai của [câu trả lời này] (http://stackoverflow.com/a/16610663/1281433) , được gọi là "Sử dụng TDB cục bộ." Nếu có vẻ phù hợp, chúng ta có thể sử dụng nó như là một điểm khởi đầu và sau đó tìm ra các tập dữ liệu nào sẽ cần phải được tải xuống cục bộ. –

+0

@GeorgePaptheodorou Bạn đã kết thúc mọi tiến bộ với điều này chưa? –

Trả lời

5

Để cho Jena chỉ số địa phương:

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

Để truy vấn 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 để quay lại câu hỏi và cung cấp câu trả lời phù hợp với bạn. Cảm ơn! Bạn cũng nên cân nhắc [đánh dấu nó là được chấp nhận] (http://meta.stackexchange.com/questions/5234/how-does-accepting-an-answer-work). –

Các vấn đề liên quan