![](/img/trans.png)
[英]Jena - Access elements in model from a QuerySolution and update them
[英]From jena QuerySolution to Model tdb rdf
我使用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無效部分。
而不是使用SELECT
查詢,您應該使用CONSTRUCT查詢,而是使用CONSTRUCT
查詢返回RDF圖,因此在Jena中是Model
的實例
然后將其存儲在本地,您可以根據需要簡單地調用dataset.setDefaultModel()
或dataset.addNamedModel()
,以將返回的模型添加到本地TDB數據集中。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.