Yeh, I thought I was doing that! I've taken that line of code out anyway
but it seems to make no difference...

On 28 February 2018 at 16:55, Rob Vesse <[email protected]> wrote:

> Notice that Andy specifically said in his response:
>
>   call this very early (before any TDB related activity)
>
> Rob
>
> On 28/02/2018, 16:21, "Chris Wood" <[email protected]> wrote:
>
>     Hi Rob - sorry, that was an over-simplification of the psedocode; I do
> call
>
>         dataset.begin(ReadWrite.WRITE);
>
>     after initialising it.
>
>     I had also wondered if setFileMode makes any difference - I was using
> it
>     because of this Andy's comment here:
>     http://users.jena.apache.narkive.com/zUPFzLcm/tdb-
> shutdown-does-not-release-the-files
>
>     Chris
>
>     On 28 February 2018 at 14:54, Rob Vesse <[email protected]> wrote:
>
>     > Two things look odd:
>     >
>     > - You never call dataset.begin() to start the transaction yet you
> later
>     > try to commit() it
>     > - Calling SystemTDB.setFileMode() after opening a dataset probably
> doesn't
>     > have any effect on already open datasets though I could be wrong on
> this
>     > point
>     >
>     > Rob
>     >
>     > On 28/02/2018, 13:08, "Chris Wood" <[email protected]> wrote:
>     >
>     >     Hi Andy,
>     >
>     >     It's probably a bit more complicated than I originally suggested.
>     > Inside my
>     >     try statement I do a bit of processing in a separate class (I
> create a
>     > new
>     >     in-memory Dataset, and return the model from it, so I can add it
> to my
>     > my
>     >     main dataset); but I also use this class to initialise the
> default
>     > model. I
>     >     wonder if this is confusing the transaction...
>     >
>     >     With a bit of pseudocode:
>     >
>     >         Dataset dataset = TDBFactory.createDataset("path/to/tdb");
>     >         Model model = new Processing(dataset).;
>     >         SystemTDB.setFileMode(FileMode.direct);
>     >
>     >         try {
>     >            Model m = model.dataStructure();
>     >            model.add(m);
>     >            dataset.commit();
>     >         } finally {
>     >            dataset.close();
>     >         }
>     >
>     >       Processing.java:
>     >
>     >         main:
>     >           public Processing(Dataset dataset) {
>     >     super(dataset.getDefaultModel().getGraph());
>     >           }
>     >
>     >         dataStructure():
>     >           Dataset d1 = TDBFactory.createDataset();
>     >           Model m1 = d1.getDefaultModel();
>     >
>     >           // add stuff to m1 from an independent datasource
>     >
>     >           return m1;
>     >
>     >
>     >     On 28 February 2018 at 11:30, Andy Seaborne <[email protected]>
> wrote:
>     >
>     >     > Chris,
>     >     >
>     >     > Is the dataset TDB (from TDBFactory) or a dataset holding a
> model,
>     > maybe
>     >     > with added inference, where the base graph is backed by TDB?
>     >     >
>     >     > It is better to put changes to the dataset inside a
> transaction.
>     > Failing
>     >     > that, it should be sync'ed  -- TDB.sync().
>     >     >
>     >     >     Andy
>     >     >
>     >     > http://jena.staging.apache.org/documentation/txn/
>     >     >
>     >     > On 27/02/18 18:33, Chris Wood wrote:
>     >     >
>     >     >> I've got a small application that follows the standard
> recommended
>     >     >> pattern:
>     >     >>
>     >     >>      // initialise dataset / model
>     >     >>      ...
>     >     >>      try {
>     >     >>          // ... add statements
>     >     >>          StmtIterator r = this.my_model.listStatements();
>     >     >> System.out.println(r.toList().size());
>     >     >> this.dataset.commit();
>     >     >>      } catch (SQLException e) {
>     >     >>          e.printStackTrace();
>     >     >>      } finally {
>     >     >> this.dataset.close();
>     >     >>      }
>     >     >>
>     >     >> I was running this with Jena 3.0.1, and all was fine. I've
> just
>     > upgraded
>     >     >> to
>     >     >> 3.6.0. When I run the code and then check the tdb that is
> generated
>     > with
>     >     >> (on Windows):
>     >     >>
>     >     >>       tdbquery --loc="database" "SELECT (count(*) as ?t)
> where {?a
>     > ?b ?c
>     >     >> . }"
>     >     >>
>     >     >> I get a NullPointerException:
>     >     >>
>     >     >> Exception
>     >     >> java.lang.NullPointerException
>     >     >>          at
>     >     >> org.apache.jena.tdb.transaction.JournalControl.replay(
>     >     >> JournalControl.java:280)
>     >     >>          at
>     >     >> org.apache.jena.tdb.transaction.JournalControl.recoverSegmen
>     >     >> t(JournalControl.java:185)
>     >     >>          at
>     >     >> org.apache.jena.tdb.transaction.JournalControl.recoverFromJo
>     >     >> urnal(JournalControl.java:137)
>     >     >>          at
>     >     >> org.apache.jena.tdb.StoreConnection.forceRecoverFromJournal(
>     >     >> StoreConnection.java:150)
>     >     >>          at
>     >     >> org.apache.jena.tdb.StoreConnection._makeAndCache(StoreConne
>     >     >> ction.java:255)
>     >     >>          at
>     >     >> org.apache.jena.tdb.StoreConnection.make(
> StoreConnection.java:214)
>     >     >>          at
>     >     >> org.apache.jena.tdb.StoreConnection.make(
> StoreConnection.java:220)
>     >     >>          at
>     >     >> org.apache.jena.tdb.transaction.DatasetGraphTransaction.<
>     >     >> init>(DatasetGraphTransaction.java:70)
>     >     >>          at org.apache.jena.tdb.sys.
> TDBMaker._create(TDBMaker.
>     > java:55)
>     >     >>          at
>     >     >> org.apache.jena.tdb.sys.TDBMaker.createDatasetGraphTransacti
>     >     >> on(TDBMaker.java:42)
>     >     >>          at
>     >     >> org.apache.jena.tdb.TDBFactory._
> createDatasetGraph(TDBFactory.
>     > java:89)
>     >     >>          at
>     >     >> org.apache.jena.tdb.TDBFactory.createDatasetGraph(
>     > TDBFactory.java:71)
>     >     >>          at org.apache.jena.tdb.TDBFactory.createDataset(
>     > TDBFactory.
>     >     >> java:55)
>     >     >>          at tdb.cmdline.ModTDBDataset.
> createDataset(ModTDBDataset.
>     > java:
>     >     >> 103)
>     >     >>          at arq.cmdline.ModDataset.
> getDataset(ModDataset.java:36)
>     >     >>          at arq.query.getDataset(query.java:176)
>     >     >>          at arq.query.queryExec(query.java:213)
>     >     >>          at arq.query.exec(query.java:153)
>     >     >>          at jena.cmd.CmdMain.mainMethod(CmdMain.java:93)
>     >     >>          at jena.cmd.CmdMain.mainRun(CmdMain.java:58)
>     >     >>          at jena.cmd.CmdMain.mainRun(CmdMain.java:45)
>     >     >>          at tdb.tdbquery.main(tdbquery.java:33)
>     >     >>
>     >     >> What seems really weird is that if I run the code *again*
> (without
>     >     >> deleting
>     >     >> the dataset directory) the triplestore is populated.
>     >     >>
>     >     >>   - If I run the code ensuring I use v3.0.1, this doesn't
> happen,
>     > and the
>     >     >> tdbquery command works on the first attempt.
>     >     >>   - The print statement showing the number of statements in
> the
>     > dataset
>     >     >> shows the correct number in all cases.
>     >     >>
>     >     >> What has changed between 3.0.1 and 3.6.0 to cause this (and
> any
>     > hints on
>     >     >> what I need to do to resolve it would be greatly appreciated!)
>     >     >>
>     >     >> Thanks
>     >     >> Chris
>     >     >>
>     >     >>
>     >
>     >
>     >
>     >
>     >
>     >
>
>
>
>
>
>

Reply via email to