While I see the difference in the code, the distinction is not at all apparent 
between 

model2 = ModelFactory.createOntologyModel(model1.getSpecification(), model1);

and

model2 = ModelFactory.createOntologyModel( model1.getSpecification() ) :
model2.add( model1.getBaseModel() );

According to the Javadoc, the method createOntologyModel(OntModelSpec spec, 
Model base) does the following: "Answer a new ontology model, constructed 
according to the given ontology model specification, and starting with the 
ontology data in the given model."

So it creates a new ontology model, using the given ontology specification 
(which is the same as the old ontology model, e.g., 
OntModelSpec.OWL_DL_MEM_RULE_INF). It would start with the data from the given 
model, so it should have the triples from the old model. In the second case 
above, only the base triples from model1 are added initially, but since they 
have the same inferencer, it should derive the same triples.

In any case, I don't understand why model1 would be valid and model2 invalid if 
they have the same triples and same specification.

________________________________________
From: Joshua TAYLOR [[email protected]]
Sent: Thursday, May 16, 2013 11:10 AM
To: [email protected]
Subject: Re: Creating duplicate model

On Thu, May 16, 2013 at 10:41 AM, Ed Swing <[email protected]> wrote:
> I am trying to create a duplicate of an ontology model to test whether 
> inserting particular triples results in a valid ontology. However, I am 
> seeing invalid results appear in the duplicate ontology model when its valid 
> in the original ontology model. Here's the snippet of Java code:
>
>         OntModel model = (various code to load it)
>
>         OntModel tmpModel =
>             ModelFactory.createOntologyModel(model.getSpecification(), model);
>         ValidityReport rept = model.validate();
>         System.out
>             .println("Model Good: " + (rept.isClean() && rept.isValid()));
>         rept = tmpModel.validate();
>         System.out.println("Duplicate Good: "
>             + (rept.isClean() && rept.isValid()));
>
> From what I understand, the createOntologyModel should be creating a 
> duplicate of the existing ontology model. However, I am getting the following 
> result:
> Model Good: true
> Duplicate Good: false
>
> What could be causing this behavior? Is this the proper way to create a 
> duplicate ontology model?

What exactly do you mean by duplicate?  Do you want a distinct
ontology model that has the *same* base model?  Or an ontology model
with a distinct base model that contains the same triples?  I haven't
used validity reports, and you don't mention what OntModelSpec you're
using, nor what kinds of data are in your models, so I don't know what
might be causing the issue in your case.  However, here's an example
that shows a distinction between the model and tmpModel.  While both
model1 and model2 in this example are valid and clean, they don't have
the same base models.  I don't know whether that should end up causing
a problem or not, but it's something to consider.

import com.hp.hpl.jena.ontology.OntModel;
import com.hp.hpl.jena.ontology.OntModelSpec;
import com.hp.hpl.jena.rdf.model.ModelFactory;
import com.hp.hpl.jena.reasoner.ValidityReport;


public class Duplicates {
        public static void main(String[] args) {
                OntModel model1 = ModelFactory.createOntologyModel(
OntModelSpec.OWL_DL_MEM_RULE_INF );
                OntModel model2 = ModelFactory.createOntologyModel(
model1.getSpecification(), model1 );

                System.out.println( "Base1: "+model1.getBaseModel() );
                System.out.println( "Base2: "+model2.getBaseModel() );

                ValidityReport report1 = model1.validate();
                ValidityReport report2 = model2.validate();

                for ( ValidityReport report : new ValidityReport[] { report1, 
report2 } ) {
                        System.out.println( "Valid: "+report.isValid() );
                        System.out.println( "Clean: "+report.isClean() );
                }
        }
}

I think that for just creating a model that is like another
(especially if they're inference models), you might do something like
this:

// create another model with the same OntModelSpec.
model2 = ModelFactory.createOntologyModel( model1.getSpecification() ) :
// Add all the triples from model1's base model (so you're not adding
the inferred triples)
// to model2.
model2.add( model1.getBaseModel() );

If model1 has submodels, then you might have to do more adding than
just the base model, of course.

//JT
--
Joshua Taylor, http://www.cs.rpi.edu/~tayloj/


Reply via email to