Diptendu Dutta
Diptendu Dutta

Reputation: 341

Initialising Apache Jena TDB Dataset

I am using Apache Jena from within Tomcat 8 under Windows 10 (Eclipse IDE) and am not able to initialise the TDB Dataset. The initialisation code is put in the static initialiser inside a try-catch block but no exception is being thrown and the finally clause is getting invoked. I tried with relative directory names, absolute path names, as well as empty path (in memory dataset). The dataset remains null and so triples cannot be written. What do I need to change in the code to initialise the dataset?

Here is the code:

package knowledgegraph;

import org.apache.jena.tdb.TDBFactory;

import org.apache.jena.rdf.model.*;
import org.apache.jena.shared.JenaException;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.IOException;
import java.io.OutputStreamWriter;

import org.apache.jena.query.Dataset;
import org.apache.jena.query.ReadWrite;

public class JenaProcessor {

    static Dataset dataset = null;
    static String ns = "http://www.lke.com/lke.owl#";


    static {
        try {
//          dataset = TDBFactory.createDataset("lke");
//          dataset = TDBFactory.createDataset("C:\\Users\\Diptendu\\Desktop\\lke");
            dataset = TDBFactory.createDataset();
        System.out.println("TDB initialised");
        } 
//      catch(Exception ex) {
        catch(JenaException ex) {
            ex.printStackTrace();
        }
        finally {
            System.out.println("Finally clause");
        }
    }


    static public void writeTriple(String corpus_file_id, String subject, String predicate, String object) {

        dataset.begin(ReadWrite.WRITE) ;
        Model model = null;

        try {

            model = dataset.getNamedModel(corpus_file_id);
//          model.enterCriticalSection(Lock.WRITE);

            // write triples to model


            Resource subjectResource = model.createResource(ns.concat(subject));

            Property property = model.createProperty(ns.concat(predicate));

            Resource objectResource = model.createResource(ns.concat(object)); 

//          model.add(subjectResource, property, objectResource);
            Statement statement = model.createStatement(subjectResource, property, objectResource);
            model.add(statement);

            dataset.commit();
//          TDB.sync(model);
        } finally {
//          model.leaveCriticalSection();
            model.close();
            dataset.end();
        }

    }
}

Upvotes: 0

Views: 341

Answers (1)

AndyS
AndyS

Reputation: 16630

sked and responded to on users@jena: https://lists.apache.org/thread.html/r9f788bf21ceb3991329ab0ba3c649d94f2983f92aa3c0a76af788e52%40%3Cusers.jena.apache.org%3E

It's because you are trying to close the model after you've committed the transaction so the error message is quite correct in that you are no longer in a transaction at that point

Put the dataset.commit() after the model.close() line and it will work

Rob

Upvotes: 1

Related Questions