Hi Stephan,

The concept of open/close for models goes back to before were around.

In TDB a model is conceptually a view of the dataset. By changing the dataset, it is possible to change the model. The concept of open and close is rooted in models as independent units and that does not sit so well with models as parts of an RDF datasets. Nowadays TDB ignores closing graphs when the graphs are part of datasets; only strangely created graphs which don't reside in proper datasets, does close do anything and that capability is not exported to the TDB API. And is likely to go away -- it's just legacy these days.

In fact, all this is likely to go further - a TDB graph will be implemented as a view of the database. The existing hard-wired understanding of the TDB internals would go away. When TDB started, it was at first a single graph and so the TDB graph code does go straight to the internal data structures. Now TDB has datasets properly, this can be undone and a general graph-as-view mechanism provided that is not TDB specific.

The other thing to note is that transactions are per-dataset. The model operations for transactions do not apply (we may be able to activate them later but we need to solve the interactions of two models on the same dataset in a way that does not create weird affects for the application writer).

        Andy

On 21/05/12 21:25, Stephan Zednik wrote:
Hi,


I am looking into refactoring some code to use TDB-backed Jena
Modelsrather than in-memory Jena Models.

I wrote some tests to try and understand what resource management I
will need to perform, specifically the opening and closing of TBD-backed
models.

In the following test the Model m does not report itself as closed
after I have called m's close( ) method. It also does not report itself
as closed if I close the Dataset, then m, then test if m is closed.

Am I missing something?
Thanks,
--Stephan

public class TDBFactoryTest {
        
        @Test
        public void test() {
                String tdb_directory = "/opt/var/tdb/mdsa";
                File location = new File(tdb_directory);
                Dataset ds = TDBFactory.createDataset(tdb_directory);
                Model m = ds.getDefaultModel();
                OntModel o = 
ModelFactory.createOntologyModel(OntModelSpec.OWL_DL_MEM);
                o.addSubModel(m);
                
                assertFalse("expected OntModel to not be closed", 
o.isClosed()); // PASSES
                assertFalse("expected OntModel to not be empty", o.isEmpty()); 
// PASSES
                
                // ... print out some statements ...
                
                o.removeSubModel(m);
                o.close();
                
                assertTrue("expected OntModel to be closed",o.isClosed()); // 
PASSES
                assertFalse("expected Model to not be closed", m.isClosed()); 
// PASSES
                
                TDB.sync(m);
                m.close();
                assertTrue("expected Model to be closed",m.isClosed()); // 
FAILS!
                
                ds.close();
                //assertTrue("expected Dataset to be closed", null); // test 
for closure?
        }
}

Reply via email to