2013-03-29 69 views
2

我使用dbpedia来获得一些特定结果,并且我想将它们存储在本地tdb中。但我找不到方法将结果添加到我的本地tdb从jena QuerySolution到Model tdb rdf

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添加到模型。

任何人都可以帮助我吗?

编辑:增加了全班。问题是关于商店的无效部分。

回答

0

除了使用SELECT查询你应该使用CONSTRUCT查询时,CONSTRUCT查询将返回一个RDF图,从而在耶拿Model

一个实例,然后以本地存储它,你可以简单地调用dataset.setDefaultModel()dataset.addNamedModel()根据需要将返回的模型添加到您的本地TDB数据集。