Инициализация Apache Jena TDB Dataset - PullRequest
0 голосов
/ 02 марта 2020

Я использую Apache Jena из Tomcat 8 в Windows 10 (Eclipse IDE) и не могу инициализировать набор данных TDB. Код инициализации помещается в инициализатор stati c внутри блока try-catch, но исключение не выдается, и вызывается предложение finally . Я попытался с относительными именами каталогов, абсолютными путями, а также пустым путем (в наборе данных памяти). Набор данных остается нулевым , поэтому тройки не могут быть записаны. Что мне нужно изменить в коде для инициализации набора данных?

Вот код:

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();
        }

    }
}

1 Ответ

1 голос
/ 02 марта 2020

ответил и ответил на users@jena: https://lists.apache.org/thread.html/r9f788bf21ceb3991329ab0ba3c649d94f2983f92aa3c0a76af788e52%40%3Cusers.jena.apache.org%3E

Это потому, что вы пытаетесь закрыть модель после совершения транзакции, поэтому появляется сообщение об ошибке совершенно правильно, потому что в этот момент вы больше не участвуете в транзакции

Поставьте dataset.commit () после строки model.close (), и она будет работать

Роб

...