首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从jena QuerySolution到Model tdb

从jena QuerySolution到Model tdb
EN

Stack Overflow用户
提问于 2013-03-29 22:07:51
回答 1查看 797关注 0票数 2

我使用dbpedia获取一些特定的结果,并希望将它们存储在本地tdb中。但是我找不到将结果添加到本地tdb的方法。

代码语言:javascript
复制
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空部分的。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-03-30 00:07:47

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

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15704905

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档