我需要对 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 的哪些部分来进行此运行?
我读这篇文章有点困惑:
因此,您可以将整个 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)
?