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®








Reply via email to