首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用Jena在本地加载DBpedia?

使用Jena在本地加载DBpedia?
EN

Stack Overflow用户
提问于 2013-05-30 09:46:00
回答 1查看 2.7K关注 0票数 9

我需要对DBpedia执行一个查询:

代码语言:javascript
复制
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端点)。

  • 我应该在这次跑步中使用耶拿的哪些部分?

我有点困惑从this post上读到

因此,您可以将整个DBPedia数据加载到磁盘上的单个TDB位置(即单个目录)。这样,您可以在上面运行SPARQL查询。

  • 如果我们有三个DBpedia .nt DBpedia文件,那么如何用Jena术语将这个DBpedia加载到一个TDB位置呢?如何将上述查询应用于这些.nt文件?(任何代码都有帮助。)
  • 例如,这是错的吗?

代码语言:javascript
复制
 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)
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-10-01 13:10:02

要让Jena在本地索引,请执行以下操作:

代码语言:javascript
复制
/** 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();

若要查询耶拿:

代码语言:javascript
复制
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() ;
票数 8
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16832862

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档