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