-1

如何使用 ARQ(Jena 的 SPARQL 处理器)将 OntModel 实例插入三重存储(如 TDB)?我有以下代码,它只是创建书籍,并将它们添加到 OntModel 中。现在我想将其插入三重存储:

public static void createDummyBooks(){
        // Create an empty ontology model
        OntModel ontModel = ModelFactory.createOntologyModel();
        String ns = new String("http://www.iexample.com/book#");
        String baseURI = new String("http://www.iexample.com/book");
        Ontology onto = ontModel.createOntology(baseURI);

        //creating a book 
        OntClass book = ontModel.createClass(ns + "Book");
        OntClass nonFinctionBook = ontModel.createClass(ns + "NonFictionBook");
        OntClass fictionBook = ontModel.createClass(ns + "FictionBook");

        // Create datatype property 'hasAge'
        DatatypeProperty hasTtitle = ontModel.createDatatypeProperty(ns + "hasTitle");
        // 'hasAge' takes integer values, so its range is 'integer'
        // Basic datatypes are defined in the ‘vocabulary’ package
        hasTtitle.setDomain(book);
        hasTtitle.setRange(XSD.xstring); // com.hp.hpl.jena.vocabulary.XSD

        // Create individuals
        Individual theProgrammingBook = nonFinctionBook.createIndividual(ns + "ProgrammingBook");
        Individual theFantasyBook = fictionBook.createIndividual(ns + "FantasyBook");


        Literal bookTitle = ontModel.createTypedLiteral("Programming with Ishmael", XSDDatatype.XSDstring);
        Literal fantasyBookTitle = ontModel.createTypedLiteral("The adventures of Ishmael", XSDDatatype.XSDstring);
        // Create statement 'ProgrammingBook hasTitle "Programming with Ishmael" '
        Statement theProgrammingBookHasTitle = ontModel.createStatement(nonFinctionBook, hasTtitle, bookTitle);
        // Create statement 'FantasyBook hasTitle "The adventures of Ishmael" '
        Statement theFantasyBookHasTitle = ontModel.createStatement(theFantasyBook, hasTtitle, fantasyBookTitle);
        List<Statement> statements = new ArrayList<Statement>();    
        statements.add(theProgrammingBookHasTitle);
        statements.add(theFantasyBookHasTitle);

        ontModel.add(statements);
        //just displaying here - but how do I now write/insert this into my Triple Store/TDB using AQR API?
        ontModel.write(System.out, "RDF/XML-ABBREV");

    }

有任何想法吗?非常感激。

4

2 回答 2

1

经过一些搜索和使用 API。我遇到了这个非常有用的教程——虽然它有一个特定的重点,但它确实让我对我需要做什么有了一些很好的了解。所以这就是我最终设法使用HTTP Dataset AccessorOntModel将我的插入/添加到我现有dataset的 Fuseki 服务器上的方式。 DatasetAccessor

//The Graph Store protocol for sem_tutorials (my dummy dataset) is http://localhost:3030/sem_tutorials/data
private static final String FUSEKI_SERVICE_DATASETS_URI = "http://localhost:3030/sem_tutorials/data";
private void testSavingModel(OntModel model){
  DatasetAccessor accessor = DatasetAccessorFactory.createHTTP(FUSEKI_SERVICE_DATASETS_URI);
 if(accessor != null){
    //because I already had a number of Triples there already - I am only adding this model
    accessor.add(model);
  }
}

就这么容易!因此,当我通过运行 SPARQL 查询进行检查时select * {?s ?p ?o}- 数据就在那里!我希望这对那些使用 Jena 开发语义 Web 应用程序的人也有用。

于 2016-05-04T10:02:54.593 回答
0

这里介绍的教程很棒,最后展示了如何通过 http 将 OntModel 传输到 Fuseki。这是一个如何在嵌入式 Fuseki 3.4.0 中执行相同操作以确保完整性的示例:

    // this will represent content of the db
    Dataset ds = DatasetFactory.createTxnMem();
    DatasetGraph dsg = ds.asDatasetGraph();

    // here some Jena Objects to be inserted
    String NS  = "http://myexample.com/#"
    OntModel m = ModelFactory.createOntologyModel();
    OntClass r = m.createClass( NS + Request.class.getName() );
    Individual i = r.createIndividual( NS + request.hashCode() );

    FusekiServer server = FusekiServer.create()
                .setPort(4321)
                .add("/ds", ds)
                .build();
    server.start();

    DatasetAccessor accessor = DatasetAccessorFactory.create(ds);

    //upload Jena Model into Fuseki
    Txn.executeWrite(dsg, () -> {
        accessor.add(m);
        TDB.sync(dsg);
        dsg.commit();
    });

    //query content of Fuseki
    Txn.executeWrite(dsg, () -> {
        Quad q = SSE.parseQuad("(_ :s :p _:b)");
        dsg.add(q);
    });

与 http DatasetAccessor 一样,这里的关键是。如果您知道如何优化我提出的这个示例,请发表评论!

如果您知道更多有关 Jena API <-> 嵌入式 Fuseki 示例的来源,请在此处添加!

于 2017-09-22T17:01:52.780 回答