Thanks -
Recorded as
https://issues.apache.org/jira/browse/JENA-450
Andy
On 09/05/13 17:33, David Jordan wrote:
Andy
Here is the contents of my assembler file. This has been working fine for me
for quite a while.
My long running program is still running. This program is just opening the base
model, creating an OntModel with inferencing, and then iterating over all the
classes and instances. It is taking a very long time to run...
Once it finishes, I'll try your suggestions.
@prefix tdb: <http://jena.hpl.hp.com/2008/tdb#> .
@prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .
@prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> .
@prefix ja: <http://jena.hpl.hp.com/2005/11/Assembler#> .
[] ja:loadClass "com.hp.hpl.jena.tdb.TDB" .
tdb:DatasetTDB rdfs:subClassOf ja:RDFDataset .
tdb:GraphTDB rdfs:subClassOf ja:Model .
<#dataset> rdf:type tdb:DatasetTDB ;
tdb:location "TDB" ;
.
-----Original Message-----
From: Andy Seaborne [mailto:[email protected]]
Sent: Thursday, May 09, 2013 12:25 PM
To: [email protected]
Subject: Re: TDBException: Allocation attempt on NodeTableReadonly
On 09/05/13 17:00, David Jordan wrote:
The class Database is my little utility class that hide whether I am using TDB
or SDB.
For the TDB case, the only code that executes is return
TDBFactory.assembleDataset(TDB_ASSEMBLER_FILE);
And the assembler file?
(All these details may matter or may not - but it's easier for me to start from
something that illustrates the problem - anything else is guessing and risks
not guessing the right details)
Or does it illustrate the same situation with TDFFactory.createDataset?
Andy
Right now I have a long running program that needs to finish, but I am fairly
confident that when I ran this the database had the two named models stored in
the database. So the model name was already being used in the database. I'll
verify this and get back to you.
-----Original Message-----
From: Andy Seaborne [mailto:[email protected]]
Sent: Thursday, May 09, 2013 11:54 AM
To: [email protected]
Subject: Re: TDBException: Allocation attempt on NodeTableReadonly
String modelName = args[0];
Dataset dataset = Database.getDataset();
(Database.getDataset()??)
David -
Is the database empyy to start with?
Is the model name previously unused?
Andy
On 09/05/13 15:16, David Jordan wrote:
Andy,
I have included the complete program below. My code seems to be read only. It
works with a model stored in non-inferenced form. But I have another model that
I have pre-inferenced and stored, pre-inferenced using OWL_MEM_MICRO_RULE_INF
(if that is relevant). In this second case, I get this exception when I call
createOntologyModel.
So there are only two lines in the transaction before I get the
exception TDBException: Allocation attempt on NodeTableReadonly Model
model = dataset.getNamedModel(modelName); OntModel omodel =
ModelFactory.createOntologyModel(OntModelSpec.OWL_DL_MEM, model); The variable
omodel is a transient model. Does passing the stored model referenced by the
variable model try to perform an update, in particular in the case where that
model has been pre-inferenced?
import com.hp.hpl.jena.ontology.OntClass;
import com.hp.hpl.jena.ontology.OntModel;
import com.hp.hpl.jena.ontology.OntModelSpec;
import com.hp.hpl.jena.ontology.OntResource;
import com.hp.hpl.jena.query.Dataset; import
com.hp.hpl.jena.query.ReadWrite; import
com.hp.hpl.jena.rdf.model.Model; import
com.hp.hpl.jena.rdf.model.ModelFactory;
import com.hp.hpl.jena.util.iterator.ExtendedIterator;
public class ListClassesAndNumInstances {
public static void main(String[] args) {
String modelName = args[0];
Dataset dataset = Database.getDataset();
try {
dataset.begin(ReadWrite.READ);
Model model = dataset.getNamedModel(modelName);
OntModel omodel =
ModelFactory.createOntologyModel(OntModelSpec.OWL_DL_MEM, model);
ExtendedIterator<OntClass> classes =
omodel.listClasses();
int totalClasses = 0;
int totalInstances = 0;
while( classes.hasNext() ){
OntClass oclass = classes.next();
totalClasses++;
String cname = oclass.getURI();
int cnt = 0;
ExtendedIterator<OntResource> instances =
(ExtendedIterator<OntResource>) oclass.listInstances();
while( instances.hasNext() ){
OntResource resource = instances.next();
cnt++;
}
totalInstances += cnt;
System.out.print(cname);
System.out.print(",");
System.out.println(cnt);
}
System.out.print("Total classes: ");
System.out.println(totalClasses);
System.out.print("Total instances: ");
System.out.println(totalInstances);
} finally {
dataset.end();
}
}
}
-----Original Message-----
From: Andy Seaborne [mailto:[email protected]]
Sent: Thursday, May 09, 2013 5:14 AM
To: [email protected]
Subject: Re: TDBException: Allocation attempt on NodeTableReadonly
On 08/05/13 21:02, David Jordan wrote:
What is the typical cause for the following exception?
Some kind of write action inside a read transaction. Read transactions really are
"read only" and it's enforced.
Here, it looks like it's the setNsPrefix of a prefix. That's fine if the profix
already exists so it does not in this case.
Do you have a complete, minimal example? TDBFactory has a method to make an in-memory
dataset that behaves exactly liek a disk-backed one (it uses a crude "RAM
disk"). Good for testing and portable examples.
Andy
[java] Exception in thread "main" com.hp.hpl.jena.tdb.TDBException:
Allocation attempt on NodeTableReadonly
[java] at
com.hp.hpl.jena.tdb.nodetable.NodeTableReadonly.getAllocateNodeId(NodeTableReadonly.java:37)
[java] at
com.hp.hpl.jena.tdb.nodetable.NodeTupleTableConcrete.addRow(NodeTupleTableConcrete.java:84)
[java] at
com.hp.hpl.jena.tdb.store.DatasetPrefixesTDB.insertPrefix(DatasetPrefixesTDB.java:122)
[java] at
com.hp.hpl.jena.sparql.graph.GraphPrefixesProjection.set(GraphPrefixesProjection.java:84)
[java] at
com.hp.hpl.jena.shared.impl.PrefixMappingImpl.setNsPrefix(PrefixMappingImpl.java:70)
[java] at
com.hp.hpl.jena.graph.compose.PolyadicPrefixMappingImpl.setNsPrefix(PolyadicPrefixMappingImpl.java:52)
[java] at
com.hp.hpl.jena.rdf.model.impl.ModelCom.setNsPrefix(ModelCom.java:975)
[java] at
com.hp.hpl.jena.ontology.impl.OntModelImpl.<init>(OntModelImpl.java:159)
[java] at
com.hp.hpl.jena.ontology.impl.OntModelImpl.<init>(OntModelImpl.java:123)
[java] at
com.hp.hpl.jena.rdf.model.ModelFactory.createOntologyModel(ModelFactory.java:370)
[java] at
com.sas.ta.om.ListClassesAndNumInstances.main(ListClassesAndNumInstances.java:26)
David Jordan
Senior Software Developer
SAS Institute Inc.
Health & Life Sciences, Research & Development Bldg R ▪ Office 4467
600 Research Drive ▪ Cary, NC 27513
Tel: 919 531 1233 ▪
[email protected]<mailto:[email protected]>
www.sas.com<http://www.sas.com/>
SAS® … THE POWER TO KNOW®