Simple answer: don't close it.

A TDB graph is a simple projection of part of the database. It does not carry any state itself except info about what it's projecting (graph name or default graph). It holds no triples. Cost - minimal. Closing the graph does not close the database.

datasetGraph.getDefaultGraph();

You "get" the same one each time.

TDBFactory.createDatasetGraph is a bit of a lie - it will return something that has behind it the same storage as all other instances.

(We can make the close operation a no-op)

        Andy


On 19/08/15 13:07, Евгений =) wrote:
Hello everyone.

I try open previously closed TDB in one java instance.

And got next error:
Exception in thread "main" com.hp.hpl.jena.shared.ClosedException:
already closed
at com.hp.hpl.jena.graph.impl.GraphBase.checkOpen(GraphBase.java:66)
at com.hp.hpl.jena.graph.impl.GraphBase.add(GraphBase.java:201)
at com.github.hronom.test.jena.TestReopenTdb.main(TestReopenTdb.java:55)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at 
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:606)
at com.intellij.rt.execution.application.AppMain.main(AppMain.java:140)

Here is full code:
package com.github.hronom.test.jena;

import com.hp.hpl.jena.graph.Graph;
import com.hp.hpl.jena.graph.NodeFactory;
import com.hp.hpl.jena.graph.Triple;
import com.hp.hpl.jena.sparql.core.DatasetGraph;
import com.hp.hpl.jena.tdb.TDBFactory;

import org.apache.jena.riot.RDFDataMgr;
import org.apache.jena.riot.RDFFormat;

import java.nio.file.Path;
import java.nio.file.Paths;

public class TestReopenTdb {
    public static final Path pathToTdb = Paths.get("test_tdb");

    public static void main(String[] args) {
        Graph graph = openTdb(pathToTdb);

        // Fill graph.
        graph.add(
            new Triple(
                NodeFactory.createURI("http://example/unit13";),
                NodeFactory.createURI("http://example/name";),
                NodeFactory.createLiteral("Unit 13", "en")
            )
        );

        graph.add(
            new Triple(
                NodeFactory.createURI("http://example/unit13";),
                NodeFactory.createURI("http://example/type";),
                NodeFactory.createURI("http://example/robot";)
            )
        );

        graph.add(
            new Triple(
                NodeFactory.createURI("http://example/unit13";),
                NodeFactory.createURI("http://example/creationYear";),
                NodeFactory.createURI("http://example/2015";)
            )
        );

        RDFDataMgr.write(System.out, graph, RDFFormat.NTRIPLES);

        graph.close();

        graph = openTdb(pathToTdb);

        graph.add(
            new Triple(
                NodeFactory.createURI("http://example/unit15";),
                NodeFactory.createURI("http://example/creationYear";),
                NodeFactory.createURI("http://example/2015";)
            )
        );

        graph.close();
    }

    /**
     * Open specified TDB as Graph. If TDB was already opened then return him.
     *
     * @param tdbPath Path to TDB directory.
     * @return Opened Graph.
     */
    private static Graph openTdb(Path tdbPath) {
        // Open TDB.
        DatasetGraph datasetGraph =
TDBFactory.createDatasetGraph(tdbPath.toString());
        return datasetGraph.getDefaultGraph();
    }
}

So how I can reopen TDB in one instance?

Jena version 2.13.0


Reply via email to