Search code examples
javasparqljenatriplestorearq

Inserting an OntModel instance into a Triple Store (like TDB) using ARQ (SPARQL processor for Jena)


How can I insert an OntModel instance into a Triple Store (like TDB) using ARQ (SPARQL processor for Jena? I have the following code which simply creates books, and add these into an OntModel. Now I want to insert this into a Triple Store:

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");

    }

Any ideas? Much appreciated.


Solution

  • After some searching and playing around with the API. I came across this very useful tutorial - although it had a specific focus, it did give me some good idea about what I needed to do. So this is how I eventually managed to insert/add my OntModel into my existing dataset on Fuseki Server using HTTP Dataset Accessor 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);
      }
    }
    

    It was that easy! So when I checked by running SPARQL query select * {?s ?p ?o} - the data was there! I hope this will also be useful to those who are working on Semantic Web applications using Jena.