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