【问题标题】:Load DBpedia locally using Jena TDB?使用 Jena TDB 在本地加载 DBpedia?
【发布时间】:2013-05-30 09:46:00
【问题描述】:

我需要对 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 查询。

  • 如果我们有三个 .nt DBpedia 文件,我如何将 DBpedia 加载到单个 TDB 位置(用耶拿术语来说)?我们如何将上述查询应用于这些 .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"(将默认图形作为Jena Model)。这个说法有效吗?我们是否需要创建一个数据集来执行查询,还是应该使用TDBFactory.createModel(tdbdirectory)

【问题讨论】:

  • 在 Java 中完成这一切对您来说很重要吗?您实际上可以使用 Jena 提供的命令行工具使用 TDB 和运行 SPARQL 查询,而无需编写任何 Java 代码。这对你来说是一个选择吗?
  • 如果,正如我在之前的评论中所问的,在不编写任何 Java 代码的情况下在本地使用 TDB 是一种选择,请查看 this answer 的第二部分,称为“在本地使用 TDB”。如果看起来合适,我们可以以此为起点,然后确定需要在本地下载哪些数据集。
  • @GeorgePaptheodorou 你最终在这方面取得了进展吗?
  • 您好,感谢您的回复。我测试了代码并至少适用于 dbpedia 并创建了 2 个单独的类。 1个用于加载转储(一次1个)和1个类用于查询tdb。我还将我的机器升级到8GB RAM,因为我制作的应用程序是ram的真空。我不知道我支付的 100 欧元是否值得,因为还有其他选择......(是的!我升级了我的电脑)
  • 既然你找到了解决方案,你应该把它写在一个答案中并标记为接受,这样其他找到这个问题的用户也能得到答案。

标签: java sparql semantic-web jena dbpedia


【解决方案1】:

让 Jena 在本地索引:

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

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多