Hi Andy, Yeh, that was on my debugging list! I've seemingly tracked it down to a maven problem. I'm working in eclipse: when I created a new project and copied all the files across and ran it in eclipse, it worked; as soon as I built and packed via maven, I got the error. I'll do some more digging...
Chris On 28 February 2018 at 18:31, Andy Seaborne <[email protected]> wrote: > Chris, > > It looks like details matter - could you send a complete, minimal example > (i.e. standalone and runnable)? > > Thanks > > Andy > > On 28/02/18 17:26, Chris Wood wrote: > >> 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.transactio >>> n.JournalControl.recoverSegmen >>> > >> t(JournalControl.java:185) >>> > >> at >>> > >> org.apache.jena.tdb.transactio >>> n.JournalControl.recoverFromJo >>> > >> urnal(JournalControl.java:137) >>> > >> at >>> > >> org.apache.jena.tdb.StoreConne >>> ction.forceRecoverFromJournal( >>> > >> StoreConnection.java:150) >>> > >> at >>> > >> org.apache.jena.tdb.StoreConne >>> ction._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.TDBMak >>> er.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 >>> > >> >>> > >> >>> > >>> > >>> > >>> > >>> > >>> > >>> >>> >>> >>> >>> >>> >>> >>
