[Pellet-users] Slow reasoning & getting status info

Holger Knublauch holger at topquadrant.com
Thu Mar 29 18:10:33 UTC 2007


Thanks, Evren.  This explains it.  I am following up with Rinke on the 
TopBraid mailing list [1] to find the best way to avoid such complexity 
pitfalls.

Holger

[1] 
http://groups.google.com/group/topbraid-composer-users/browse_thread/thread/c78ac95685e41c3c

Evren Sirin wrote:
> Sorry, being late to the discussion. See by reply below...
> 
> On 3/29/07 11:26 AM, Rinke Hoekstra wrote:
>> Hi Holger, others,
>>
>> Holger Knublauch wrote:
>>> Rinke Hoekstra wrote:
>>
>>  * snip *
>>
>>>
>>> Here is a test case to illustrate this:
>>>
>>> public class RinkeTestCase extends TestCase {
>>>
>>>     public void testRinke() {
>>>         OntModel ontModel = 
>>> ModelFactory.createOntologyModel(OntModelSpec.OWL_MEM);
>>>         
>>> ontModel.read("http://www.estrellaproject.org/lkif-core/lkif-core.owl");
>>>         OntModelSpec spec = PelletReasonerFactory.THE_SPEC;
>>>         InfModel infModel = ModelFactory.createOntologyModel(spec, 
>>> ontModel);
>>>         long startTime = System.currentTimeMillis();
>>>         int count = 0;
>>>         StmtIterator it = infModel.listStatements();
>>>         while(it.hasNext()) {
>>>             it.nextStatement();
>>>             count++;
>>>         }
>>>         long endTime = System.currentTimeMillis();
>>>         System.out.println("Elapsed: " + (endTime - startTime));
>>>     }
>>> }
>>
>> I had a look at your code and compared it to Pellet.java in the Pellet 
>> 1.4 distribution. Differences are that TB creates an OntModel, loads 
>> the file, then creates an InfModel with a PeleltReasoner, and iterates 
>> over all statements. Pellet on the other hand, loads the file into a 
>> regular Model and then creates an OntModel with the reasoner and the 
>> Model, but does not iterate over the statements in that model. 
> Yes, that's correct. model.listStatements will reuten *all* possible 
> inferences that Pellet can find. This includes subclasses, equivalent 
> classes, disjoints, complements, types for individuals, property 
> relations, etc. It is normal that this function call is slow and I don't 
> recommend using it unless you really need all the information, e.g. you 
> might do it if you want to materialize all the inferences in a plain RDF 
> model.
>> They rather 'extract' the reasoner from the created OntModel, call 
>> classify() and realize(), again extract a model from the reasoner and 
>> *then* iterate over the statements.
> Yes, the command line version only classifies and realizes (finds the 
> types for individuals) and nothing more.
>>
>> See testRinke2 and testRinke3 below. The first just adjusts the TB way 
>> of handling the model to the Pellet way, but still iterates over the 
>> original model (slow). The second only iterates over the model which 
>> is given back by the reasoner (really fast).
>>
>> The first gives back thousands of statements (I added a counter), and 
>> the second returns only 11 (?).
> The first number makes sense but the second one is not right simply 
> because you are missing a oModel.prepare(); after creating the ontology 
> model. Accessing the KnowledgeBase inside PelletInfGraph can be tricky. 
> If you don't explicitly call the prepare function the underlying KB will 
> not see anything that has been read into the Jena model.
> 
> It might be easier to stick to Jena model rather than going into the 
> details of Pellet classes. You only need to ask a more concentrated 
> query as in model.listStatements( null, RDF.subClassOf, null) which will 
> only trigger a classification and return all the inferred subclass 
> relations.
> 
> Also since LKIF contains imported ontologies retrieving each ontology, 
> parsing and processing RDF statements takes considerable time (network 
> latency, XML parsing, etc.). When I tried right now, loading seemed to 
> take more than the classification itself.
> 
> Cheers,
> Evren
>>
>> Hmmm
>>
>>
>> -Rinke
>>
>>
>>
>>     public void testRinke2() {
>>         Model pModel = null;
>>         ModelReader modelReader = new ModelReader();
>>         pModel = 
>> modelReader.read("http://www.estrellaproject.org/lkif-core/lkif-core.owl"); 
>>
>>         System.out.println("Read ontology");
>>
>>         long startTime1 = System.currentTimeMillis();               
>> OntModel oModel;
>>
>>         oModel = 
>> ModelFactory.createOntologyModel(PelletReasonerFactory.THE_SPEC, pModel);
>>         System.out.println("Created Ontology Model");
>>         OWLReasoner reasoner = ((PelletInfGraph) 
>> oModel.getGraph()).getOWLReasoner();
>>         System.out.println("Got back my reasoner");
>>         long endTime1 = System.currentTimeMillis();
>>         System.out.println("Elapsed: " + (endTime1 - startTime1));
>>                long startTime = System.currentTimeMillis();
>>         int count = 0;
>>         StmtIterator it = oModel.listStatements();
>>                while(it.hasNext()) {
>>             it.nextStatement();
>>             count++;
>>             System.out.println(count);
>>         }
>>         long endTime = System.currentTimeMillis();
>>         System.out.println("Elapsed: " + (endTime - startTime));
>>                   }
>>
>>
>>     public void testRinke3() {
>>         Model pModel = null;
>>         ModelReader modelReader = new ModelReader();
>>         pModel = 
>> modelReader.read("http://www.estrellaproject.org/lkif-core/lkif-core.owl"); 
>>
>>         System.out.println("Read ontology");
>>
>>         long startTime1 = System.currentTimeMillis();               
>> OntModel oModel;
>>
>>         oModel = 
>> ModelFactory.createOntologyModel(PelletReasonerFactory.THE_SPEC, pModel);
>>         System.out.println("Created Ontology Model");
>>         OWLReasoner reasoner = ((PelletInfGraph) 
>> oModel.getGraph()).getOWLReasoner();
>>         System.out.println("Got back my reasoner");
>>         long endTime1 = System.currentTimeMillis();
>>         System.out.println("Elapsed: " + (endTime1 - startTime1));
>>                long startTime = System.currentTimeMillis();
>>         int count = 0;
>>                reasoner.classify();
>>         reasoner.realize();
>>                Model eModel = reasoner.extractModel(false); // not 
>> verbose
>>                StmtIterator it = eModel.listStatements();
>>                while(it.hasNext()) {
>>             it.nextStatement();
>>             count++;
>>             System.out.println(count);
>>         }
>>         long endTime = System.currentTimeMillis();
>>         System.out.println("Elapsed: " + (endTime - startTime));
>>                   }
>>
>>
>>
>>>
>>> This is similar to what we are doing in TopBraid, and it really takes 
>>> minutes to list all triples.  The messages
>>>
>>> Sub Count: 13786
>>> Sat Count: 83
>>>
>>> are printed out after 30 seconds, similar to what Rinke states, but 
>>> then it becomes very slow.
>>>
>>> Assuming Rinke's command line test does a comparable job, then either 
>>> the Pellet-Jena bridge is very inefficient or I am creating the model 
>>> in a wrong way.  Please advise.
>>>
>>> Thanks,
>>> Holger
>>> _______________________________________________
>>> Pellet-users mailing list
>>> Pellet-users at lists.owldl.com
>>> http://lists.owldl.com/mailman/listinfo/pellet-users
>>> _______________________________________________
>>>
>>> Sponsored by Clark & Parsia, LLC http://clarkparsia.com/
>>
>> ------------------------------------------------------------------------
>>
>> _______________________________________________
>> Pellet-users mailing list
>> Pellet-users at lists.owldl.com
>> http://lists.owldl.com/mailman/listinfo/pellet-users
>> _______________________________________________
>>
>> Sponsored by Clark & Parsia, LLC http://clarkparsia.com/
> 


More information about the Pellet-users mailing list