【问题标题】:From jena QuerySolution to Model tdb rdf从耶拿 QuerySolution 到模型 tdb rdf
【发布时间】:2013-03-30 00:07:46
【问题描述】:

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

【问题讨论】:

    标签: java rdf jena dbpedia


    【解决方案1】:

    您应该使用CONSTRUCT 查询而不是使用SELECT 查询,CONSTRUCT 查询返回一个 RDF 图,因此在耶拿中是 Model 的一个实例

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-12-02
      • 1970-01-01
      • 1970-01-01
      • 2016-08-14
      • 1970-01-01
      • 2023-04-03
      • 1970-01-01
      相关资源
      最近更新 更多