On 16/01/14 17:07, Ed Swing wrote:
OK - this makes some sense. But what if you have no intention of writing the 
model back into TDB? For instance, you want to do the following steps:
        1. read an ontology T-Box definition from one TDB dataset
        2. create a new TDB directory to contain an extended form of the 
ontology
        3. create a new OntModel from the original ontology and add more 
class/property definitions to it
        4. write the new ontology into the new store.

Right now, in order to read the ontology, you need to be inside a WRITE 
transaction. But once you try to create the OntModel from the base model in 
step 3, you run into this transaction problem.

It's WRITE transaction because of ontModel.add(s, p, "xyz") -- that's updating the data in the dataset.

If you want it separately in-memory, you need to take a copy by some means e.g.

   Model model = ModelFactory.createDefaultModel() ;
   dataset.begin(ReadWrite.READ);
   model.add(dataset.getNamedModel("metadata")) ;
   dataset.end();

   // "model" is now in-memory and isolated form the dataset.

   OntModel ontModel = ...




Can you read the model within a WRITE transaction, close the dataset without 
actually committing, and then still use the model?

No - end of transaction is end of use of a model from within a transaction.

        Andy


-----Original Message-----
From: Andy Seaborne [mailto:[email protected]]
Sent: Thursday, January 16, 2014 11:26 AM
To: [email protected]
Subject: Re: Allocation attempt on NodeTableReadOnly

On 16/01/14 15:58, Ed Swing wrote:
First, a new ontology is created, populated and stored in TDB:
         OntModel newModel = ModelFactory.createOntologyModel();
         // various things to populate the ontology model omitted

         System.out.println("Starting write:");
         Dataset dataset =TDBFactory.createDataset(directory);
                  Dataset.addNamedModel("metadata", newModel);
                  dataset.begin(ReadWrite.WRITE);
                  try {
                        dataset.commit();
                  } finally {
                       dataset.end();
                  }

Then later, in another method, I want to read this ontology (and edit it):

          Dataset dataset =TDBFactory.createDataset(directory);
         System.out.println("Starting read:");
          Model model = null;
          dataset.begin(ReadWrite.READ);
          // Get model inside the transaction
          model = dataset.getNamedModel("metadata");
          dataset.end();

          OntModel ontModel =
              ModelFactory.createOntologyModel(OntModelSpec.OWL_DL_MEM_RULE_INF,
                  model);

When you do dataset.getNamedModel("metadata") what you get is a Java object 
that provides the Model interface as a view of the dataset.  The real data is still in 
the dataset.

If you want to update ontMode, you'll need to be inside a write transaction, 
which you commit.

      dataset.begin(ReadWrite.WRITE);
      model = dataset.getNamedModel("metadata");

     OntModel ontModel =
      ModelFactory.createOntologyModel(OntModelSpec.OWL_DL_MEM_RULE_INF,
                         model);
     String NS = "http://example/"; ;
     Resource s = ontModel.createResource(NS+"s") ;
     Property p = ontModel.createProperty(NS+"p") ;

     ontModel.add(s, p, "xyz") ;

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

You don't need the Dataset.addNamedModel - you can always get a named model 
from a TDB dataset.  .addNamedModel is a copy-in operation for TDB.

        Andy




Reply via email to