Big thanks for the detailed response!

В Четверг, 6 Авг. 2015 в 6:27 , Rob Vesse <[email protected]> написал:
Because if you access a graph prior to starting a transaction you get a non-transactional graph and the database is accessed in non-transactional
mode

When you then start a transaction the database switches to transactional mode access and uncommitted non-transactional changes are lost as a result

Either always use transactions or never use transactions, we strongly
recommend always using transactions as otherwise your data is subject to corruption and loss should your program exit unexpectedly or not clean up
the resources properly

If you really want to mix and match (which you really really shouldn't do) then you need to make sure that you call TDB.sync(graph) prior to starting
your transaction to ensure the non-transactional changes are persisted

Rob

On 06/08/2015 15:32, "Евгений =)" <[email protected]> wrote:

Thanks! So I change code:
public class TestTdbTransactions {
    public static void main(String[] args) {
        Dataset dataset = TDBFactory.createDataset();
        dataset.begin(ReadWrite.WRITE);
        DatasetGraph datasetGraph = dataset.asDatasetGraph();
        Graph graph = datasetGraph.getDefaultGraph();

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

        // Test.
        UpdateRequest request = UpdateFactory.create(
            "INSERT { ?s <http://example/value> '1' } WHERE { ?s <
http://example/creationYear> <http://example/2015> . }"
        );
        UpdateAction.execute(request, dataset);

        dataset.commit();
        dataset.end();

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

And it works!

But if I move "dataset.begin(ReadWrite.WRITE);" after "Graph graph =
datasetGraph.getDefaultGraph();" this code doesn't work... why this
happens?

2015-08-06 17:12 GMT+03:00 Rob Vesse <[email protected]>:

You are mixing non-transactional use with transactional use and this breaks things, your initial insert is in non-transactional mode but then
 you start a transaction so some of the changes get lost

 You should always stick to one usage model, we strongly recommend
 transactional use

Simply moving your dataset.begin(ReadWrite.WRITE); call to before you
 start making changes to the graph should resolve your issue

 Rob

On 06/08/2015 14:31, "Eugene Tenkaev (Hronom)" <[email protected]> wrote:

 >Hello everyone!
 >I use Apache Jena version 2.13.0.
>I try to add in existing Graph new triple by using SPARQL, and triple
 >didn’t added, here is the code:
 >public class TestTransactions {
 >    public static void main(String[] args) {
 >        Dataset dataset = TDBFactory.createDataset();
 >        DatasetGraph datasetGraph = dataset.asDatasetGraph();
 >        Graph graph = datasetGraph.getDefaultGraph();
 >
 >        // 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";)
 >            )
 >        );
 >
 >        // Test.
 >        dataset.begin(ReadWrite.WRITE);
 >
 >        UpdateRequest request =
 >            UpdateFactory.create(
 >            "INSERT { ?s <http://example/value> '1' } WHERE { ?s
 ><http://example/creationYear> <http://example/2015> . }"
 >        );
 >        UpdateAction.execute(request, dataset);
 >
 >        dataset.commit();
 >        dataset.end();
 >
 >        RDFDataMgr.write(System.out, graph, RDFFormat.NTRIPLES);
 >    }
 >}
 >
>If I remove “dataset.begin(ReadWrite.WRITE);”, “dataset.commit();” and
 >“dataset.end();” triple will be inserted…
 >
 >Test project on GitHub https://github.com/Hronom/test-jena









Reply via email to