我使用dbpedia
获取一些特定结果,我想将它们存储在本地tdb
中。但我找不到将结果添加到本地tdb
的方法。
package festifolk.tdb;
import com.hp.hpl.jena.query.*;
import com.hp.hpl.jena.rdf.model.Model;
import com.hp.hpl.jena.tdb.TDBFactory;
import com.hp.hpl.jena.update.*;
import org.apache.jena.atlas.lib.StrUtils;
public class Remote {
public static ResultSet[] Query() {
/* Remote location of the Data set used in building our tdb */
String service = "http://dbpedia.org/sparql";
/* Declaration of the SPARQL prefixes used */
String owl = "PREFIX owl: <http://www.w3.org/2002/07/owl#>";
String xsd = "PREFIX xsd: <http://www.w3.org/2001/XMLSchema#>";
String rdfs = "PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>";
String rdf = "PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>";
String foaf = "PREFIX foaf: <http://xmlns.com/foaf/0.1/>";
String dc = "PREFIX dc: <http://purl.org/dc/elements/1.1/>";
String res = "PREFIX res: <http://dbpedia.org/resource/>";
String ont = "PREFIX ont: <http://dbpedia.org/ontology/>";
String dbpedia2 = "PREFIX dbpedia2: <http://dbpedia.org/property/>";
String dbpedia = "PREFIX dbpedia: <http://dbpedia.org/>";
String skos = "PREFIX skos: <http://www.w3.org/2004/02/skos/core#>";
String prefixes = owl + xsd + rdfs + rdf + foaf + dc + res + ont + dbpedia2
+ dbpedia + skos;
String[] URI = {
"<http://dbpedia.org/class/yago/MusicFestivalsInTheNetherlands>",
"<http://dbpedia.org/class/yago/MusicFestivalsInBelgium>",
"<http://dbpedia.org/class/yago/MusicFestivalsInFrance>",
"<http://dbpedia.org/class/yago/MusicFestivalsInGermany>",
"<http://dbpedia.org/class/yago/MusicFestivalsInEngland>"
};
String query;
QueryExecution queryExec;
ResultSet[] results = new ResultSet[URI.length];
for (int i = 0; i < URI.length; i++) {
query = prefixes
+ "SELECT * WHERE { "
+ "?festival rdf:type " + URI[i] + ". "
+ "?festival rdfs:label ?label. "
+ "?festival ont:abstract ?abstract. "
+ "OPTIONAL{?festival foaf:homepage ?homepage}. "
+ "} ";
/* execute the query and save the result */
queryExec = QueryExecutionFactory.sparqlService(service, query);
try {
results[i] = queryExec.execSelect();
} catch (Exception e) {
System.out.println(e);
} finally {
queryExec.close();
}
}
return results;
}
public static void storeLocally(ResultSet[] results, Dataset dataset) {
/* Open the provided dataset and begin the writing procedure */
dataset.begin(ReadWrite.WRITE);
try {
/* API Calls to a model in the dataset */
Model model = dataset.getDefaultModel();
/* ADD all the results to the database */
for (ResultSet resultSet: results) {
while (resultSet.hasNext()) {
model.add(resultSet.nextSolution())
}
}
/* ... perform a SPARQL Update */
GraphStore graphStore = GraphStoreFactory.create(dataset);
String sparqlUpdateString = StrUtils.strjoinNL(
"PREFIX . <http://example/>",
"INSERT { :s :p ?now } WHERE { BIND(now() AS ?now) }");
UpdateRequest request = UpdateFactory.create(sparqlUpdateString);
UpdateProcessor proc = UpdateExecutionFactory.create(request, graphStore);
proc.execute();
/* Finally, commit the transaction */
dataset.commit();
} catch (Exception ex) {
System.out.println(ex);
} finally {
dataset.end();
}
}
public static void main(String[] args)
{
/* Direct way: Make a TDB-backed dataset */
String directory = "tdb";
Dataset dataset = TDBFactory.createDataset(directory);
storeLocally(Query(), dataset);
}
}
上面的代码显示了我想要做的事情,但显然它不起作用,因为无法向模型添加QuerySolution
。
任何可以帮助我的人?
编辑:添加完整的课程。问题是关于storeLocally void部分。
答案 0 :(得分:0)
您应该使用SELECT
查询而不是CONSTRUCT
查询,Model
查询返回RDF图,因此在Jena中dataset.setDefaultModel()
然后,要将其存储在本地,您只需根据需要调用dataset.addNamedModel()
或{{1}}即可将返回的模型添加到本地TDB数据集中。