簡體   English   中英

從jena QuerySolution到Model tdb rdf

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM