从jena QuerySolution到Model tdb rdf

时间:2013-03-29 14:07:51

标签: java rdf jena dbpedia

我使用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部分。

1 个答案:

答案 0 :(得分:0)

您应该使用SELECT查询而不是CONSTRUCT查询,Model查询返回RDF图,因此在Jena中dataset.setDefaultModel()

的实例

然后,要将其存储在本地,您只需根据需要调用dataset.addNamedModel()或{{1}}即可将返回的模型添加到本地TDB数据集中。