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®




Reply via email to