diff --git a/src/fr/inrialpes/exmo/align/gen/BenchmarkGenerator.java b/src/fr/inrialpes/exmo/align/gen/BenchmarkGenerator.java index 33969e8e97ed5a115ee246dbec9b172fa79a8052..23357d1972096a2f36f8dc8bb388ad1e865a7ca3 100644 --- a/src/fr/inrialpes/exmo/align/gen/BenchmarkGenerator.java +++ b/src/fr/inrialpes/exmo/align/gen/BenchmarkGenerator.java @@ -23,78 +23,32 @@ * Generates the OAEI Benchmark dataset from an ontology * It can generate it in a continuous way (each test build on top of a previous one) * or generate tests independently. - * - * Variations can also be obtained. */ package fr.inrialpes.exmo.align.gen; import java.util.Properties; -public class BenchmarkGenerator { +public class BenchmarkGenerator extends TestSet { - private String initOntoFile; //the initial file - private Properties align; //the alignment parameter - private TestGenerator generator; // a TestGenerator - private boolean debug = false; - - static String FULL = "1.0f"; - - //constructor - public BenchmarkGenerator( String fileName ) { - initOntoFile = fileName; - generator = new TestGenerator(); - } - - //generates the Benchmark - public void generate( Properties params ) { + public void initTestCases( Properties params ) { // Process params - if ( params.getProperty( "urlprefix" ) != null ) generator.setURLPrefix( params.getProperty( "urlprefix" ) ); - if ( params.getProperty( "outdir" )!= null ) generator.setDirPrefix( params.getProperty( "outdir" ) ); - String ontoname = params.getProperty( "ontoname" ); - if ( ontoname != null ) { - generator.setOntoFilename( params.getProperty( "ontoname" ) ); - } else { - ontoname = "onto.rdf"; // could be better - } - if ( params.getProperty( "alignname" ) != null ) generator.setAlignFilename( params.getProperty( "alignname" ) ); - debug = ( params.getProperty( "debug" ) != null ); - generator.setDebug( debug ); - - //private String testnumber = ""; // will not work if no number... - //testnumber = params.getProperty( "testNumber" ); - //if ( testnumber == null ) - - //keep track of the alignment - Properties alignRenameResources; - Properties alignInitial; - - Properties p = new Properties(); //modify the ontology according to this parameters - - String prevDirName; + // Test configuration parameters String mod = params.getProperty( "modality" ); // "mult" String hard = params.getProperty( "increment" ); String max = params.getProperty( "maximum" ); if ( debug ) System.err.println( " Mod: "+mod+" / Incr: "+hard ); - String SUFFIX = null; - /* - * Test 101 - * Generate the initial situation - */ - align = generator.modifyOntology( initOntoFile, (Properties)null, "101", p ); - alignInitial = (Properties)align.clone(); - alignRenameResources = (Properties)align.clone(); - prevDirName = "101"+"/"; + /* Test 101 Generate the initial situation */ + root = initTests( "101" ); /* * Tests 201, 202, 248, 249, 253, 258, 259, 250, 254, * 262, 257, 260, 265, 261, 266, 251, 252 */ - // JE: look at the (Float).toString() below... boolean multModality = (mod != null && mod.startsWith( "mult" )); float i1 = 0.0f; int maximum = Integer.parseInt( "5" ); @@ -104,155 +58,157 @@ public class BenchmarkGenerator { } catch ( Exception ex ) { ex.printStackTrace(); // continue with the default } + String PREVTEST = "101"; for ( int i = 0; i1 < 1.00f ; i++ ) { // && i < maximum + if ( i > 0 ) PREVTEST = "201"+SUFFIX; // The previous suffix if ( !multModality ) i1 += incr; // traditional else i1 += (1. - i1) * incr; // hardened - if ( debug ) System.err.println( " ******************************************************** "+i+": i1 = "+i1 ); + //if ( debug ) System.err.println( " ******************************************************** "+i+": i1 = "+i1 ); if ( i1 < 1.0f ) { - SUFFIX = ((Float)i1).toString().substring(2, 3); + SUFFIX = "-"+((Float)i1).toString().substring(2, 3); // 2 4 6 8 } else { - SUFFIX = null; + SUFFIX = ""; } /* 201-x *** no names */ - // This bootstraps because the 101 has no SUFFIX - p = new Properties(); - p.setProperty( ParametersIds.RENAME_CLASSES, ((Float)i1).toString() ); - p.setProperty( ParametersIds.RENAME_PROPERTIES, ((Float)i1).toString() ); - // This dirprefix business could have been solved before... - String dirprefix = params.getProperty( "outdir" ); - if (dirprefix != null ) { dirprefix = dirprefix+"/"; } else { dirprefix = ""; } - align = generator.modifyOntology( dirprefix+prevDirName+ontoname, align, generator.directoryName( "201", SUFFIX ), p); - - /* 202-x *** no names + no comments */ - align = generator.incrementModifyOntology( ParametersIds.REMOVE_COMMENTS, FULL, SUFFIX, "201", align, "202" ); - - /* 248-x *** no names + no comments + no hierarchy */ - align = generator.incrementModifyOntology( ParametersIds.NO_HIERARCHY, ParametersIds.NO_HIERARCHY, SUFFIX, "202", align, "248" ); - - /* 253-x *** no names + no comments + no hierarchy + no instance */ - align = generator.incrementModifyOntology( ParametersIds.REMOVE_INDIVIDUALS, FULL, SUFFIX, "248", align, "253" ); - - /* 249-x *** no names + no comments + no instance */ - align = generator.incrementModifyOntology( ParametersIds.REMOVE_INDIVIDUALS, FULL, SUFFIX, "202", align, "249" ); - - ////get the parameters - alignRenameResources = (Properties)align.clone(); - - /* 250-x *** no names + no comments + no property */ - align = generator.incrementModifyOntology( ParametersIds.REMOVE_PROPERTIES, FULL, SUFFIX, "202", align, "250" ); - - /* 254-x *** no names + no comments + no property + no hierarchy */ - align = generator.incrementModifyOntology( ParametersIds.NO_HIERARCHY, ParametersIds.NO_HIERARCHY, SUFFIX, "250", align, "254" ); - - /* 262-x *** no names + no comments + no property + no hierarchy + no instance */ - align = generator.incrementModifyOntology( ParametersIds.REMOVE_INDIVIDUALS, FULL, SUFFIX, "254", align, "262" ); - - /* 257-x *** no names + no comments + no property + no instance */ - align = generator.incrementModifyOntology( ParametersIds.REMOVE_INDIVIDUALS, FULL, SUFFIX, "250", align, "257" ); - - /* 261-x *** no names + no comments + no property + expand */ - align = generator.incrementModifyOntology( ParametersIds.ADD_CLASSES, FULL, SUFFIX, "250", align, "261" ); - - /* 266-x *** no names + no comments + no property + expand + no instance */ - align = generator.incrementModifyOntology( ParametersIds.REMOVE_INDIVIDUALS, FULL, SUFFIX, "261", align, "266" ); - - /* 260-x *** no names + no comments + no property + flatten */ - align = generator.incrementModifyOntology( ParametersIds.LEVEL_FLATTENED, "2", SUFFIX, "250", align, "260" ); - - /* 265-x *** no names + no comments + no property + flatten + no instance */ - align = generator.incrementModifyOntology( ParametersIds.REMOVE_INDIVIDUALS, FULL, SUFFIX, "260", align, "265" ); - - //re-establish the parameters - align = (Properties)alignRenameResources.clone(); - - /* 251-x *** no names + no comments + flatten */ - align = generator.incrementModifyOntology( ParametersIds.LEVEL_FLATTENED, "2", SUFFIX, "202", align, "251" ); - - /* 258-x *** no names + no comments + flatten + no instance */ - align = generator.incrementModifyOntology( ParametersIds.REMOVE_INDIVIDUALS, FULL, SUFFIX, "251", align, "258" ); - - //re-establish the parameters - align = (Properties)alignRenameResources.clone(); - - /* 252-x *** no names + no comments + expand */ - align = generator.incrementModifyOntology( ParametersIds.ADD_CLASSES, FULL, SUFFIX, "202", align, "252" ); - - /* 259-x *** no names + no comments + expand + no instance */ - align = generator.incrementModifyOntology( ParametersIds.REMOVE_INDIVIDUALS, FULL, SUFFIX, "252", align, "259" ); - -// alignNoProperty = modifier.getProperties(); //get the modifed properties - - align = (Properties)alignRenameResources.clone(); - prevDirName = generator.directoryName( "201", SUFFIX ) + "/"; + addTestChild( PREVTEST, "201"+SUFFIX, + newProperties( ParametersIds.RENAME_CLASSES, ((Float)i1).toString(), + ParametersIds.RENAME_PROPERTIES, ((Float)i1).toString() ) ); + /* 202-x *** no names + no comments */ + addTestChild( "201"+SUFFIX, "202"+SUFFIX, + newProperties( ParametersIds.REMOVE_COMMENTS, FULL ) ); + /* 248-x *** no names + no comments + no hierarchy */ + addTestChild( "202"+SUFFIX, "248"+SUFFIX, + newProperties( ParametersIds.NO_HIERARCHY, ParametersIds.NO_HIERARCHY ) ); + /* 253-x *** no names + no comments + no hierarchy + no instance */ + addTestChild( "248"+SUFFIX, "253"+SUFFIX, + newProperties( ParametersIds.REMOVE_INDIVIDUALS, FULL ) ); + /* 249-x *** no names + no comments + no instance */ + addTestChild( "202"+SUFFIX, "249"+SUFFIX, + newProperties( ParametersIds.REMOVE_INDIVIDUALS, FULL ) ); + /* 250-x *** no names + no comments + no property */ + addTestChild( "202"+SUFFIX, "250"+SUFFIX, + newProperties( ParametersIds.REMOVE_PROPERTIES, FULL ) ); + /* 254-x *** no names + no comments + no property + no hierarchy */ + addTestChild( "250"+SUFFIX, "254"+SUFFIX, + newProperties( ParametersIds.NO_HIERARCHY, ParametersIds.NO_HIERARCHY ) ); + /* 262-x *** no names + no comments + no property + no hierarchy + no instance */ + addTestChild( "254"+SUFFIX, "262"+SUFFIX, + newProperties( ParametersIds.REMOVE_INDIVIDUALS, FULL ) ); + /* 257-x *** no names + no comments + no property + no instance */ + addTestChild( "250"+SUFFIX, "257"+SUFFIX, + newProperties( ParametersIds.REMOVE_INDIVIDUALS, FULL ) ); + /* 261-x *** no names + no comments + no property + expand */ + addTestChild( "250"+SUFFIX, "261"+SUFFIX, + newProperties( ParametersIds.ADD_CLASSES, FULL ) ); + /* 266-x *** no names + no comments + no property + expand + no instance */ + addTestChild( "261"+SUFFIX, "266"+SUFFIX, + newProperties( ParametersIds.REMOVE_INDIVIDUALS, FULL ) ); + /* 260-x *** no names + no comments + no property + flatten */ + addTestChild( "250"+SUFFIX, "260"+SUFFIX, + newProperties( ParametersIds.LEVEL_FLATTENED, "2" ) ); + /* 265-x *** no names + no comments + no property + flatten + no instance */ + addTestChild( "260"+SUFFIX, "265"+SUFFIX, + newProperties( ParametersIds.REMOVE_INDIVIDUALS, FULL ) ); + /* 251-x *** no names + no comments + flatten */ + addTestChild( "202"+SUFFIX, "251"+SUFFIX, + newProperties( ParametersIds.LEVEL_FLATTENED, "2" ) ); + /* 258-x *** no names + no comments + flatten + no instance */ + addTestChild( "251"+SUFFIX, "258"+SUFFIX, + newProperties( ParametersIds.REMOVE_INDIVIDUALS, FULL ) ); + /* 252-x *** no names + no comments + expand */ + addTestChild( "202"+SUFFIX, "252"+SUFFIX, + newProperties( ParametersIds.ADD_CLASSES, FULL ) ); + /* 259-x *** no names + no comments + expand + no instance */ + addTestChild( "252"+SUFFIX, "259"+SUFFIX, + newProperties( ParametersIds.REMOVE_INDIVIDUALS, FULL ) ); } - - //re-establish the parameters - SUFFIX = null; - align = (Properties)alignInitial.clone(); - - /* Tests 221, 232, 233, 241 */ - /* 221 *** no hierarchy */ - align = generator.incrementModifyOntology( ParametersIds.NO_HIERARCHY, ParametersIds.NO_HIERARCHY, SUFFIX, "101", align, "221" ); - - /* 232 *** no hierarchy + no instance */ - align = generator.incrementModifyOntology( ParametersIds.REMOVE_INDIVIDUALS, FULL, SUFFIX, "221", align, "232" ); - - /* 233 *** no hierarchy + no property */ - align = generator.incrementModifyOntology( ParametersIds.REMOVE_PROPERTIES, FULL, SUFFIX, "221", align, "233" ); - - /* 241 *** no hierarchy + no property + no instance */ - align = generator.incrementModifyOntology( ParametersIds.REMOVE_INDIVIDUALS, FULL, SUFFIX, "233", align, "241" ); - - //re-establish the align - align = (Properties)alignInitial.clone(); - - /* Tests 222, 237 */ - + addTestChild( "101", "221", + newProperties( ParametersIds.NO_HIERARCHY, ParametersIds.NO_HIERARCHY ) ); + /* 232 *** no hierarchy + no instance */ + addTestChild( "221", "232", + newProperties( ParametersIds.REMOVE_INDIVIDUALS, FULL ) ); + /* 233 *** no hierarchy + no property */ + addTestChild( "221", "233", + newProperties( ParametersIds.REMOVE_PROPERTIES, FULL ) ); + /* 241 *** no hierarchy + no property + no instance */ + addTestChild( "233", "241", + newProperties( ParametersIds.REMOVE_INDIVIDUALS, FULL ) ); /* 222 *** flatten */ - align = generator.incrementModifyOntology( ParametersIds.LEVEL_FLATTENED, "2", SUFFIX, "101", align, "222" ); - - /* 237 *** flatten + no instance */ - align = generator.incrementModifyOntology( ParametersIds.REMOVE_INDIVIDUALS, FULL, SUFFIX, "222", align, "237" ); - - - //re-establish the parameters - align = (Properties)alignInitial.clone(); - - /* Tests 223, 238 */ - + addTestChild( "101", "222", + newProperties( ParametersIds.LEVEL_FLATTENED, "2" ) ); + /* 237 *** flatten + no instance */ + addTestChild( "222", "237", + newProperties( ParametersIds.REMOVE_INDIVIDUALS, FULL ) ); /* 223 *** expand */ - align = generator.incrementModifyOntology( ParametersIds.ADD_CLASSES, FULL, SUFFIX, "101", align, "223" ); - - /* 238 *** expand + no instance */ - align = generator.incrementModifyOntology( ParametersIds.REMOVE_INDIVIDUALS, FULL, SUFFIX, "223", align, "238" ); - + addTestChild( "101", "223", + newProperties( ParametersIds.ADD_CLASSES, FULL ) ); + /* 238 *** expand + no instance */ + addTestChild( "223", "238", + newProperties( ParametersIds.REMOVE_INDIVIDUALS, FULL) ); /* 224 *** no instance */ - align = generator.incrementModifyOntology( ParametersIds.REMOVE_INDIVIDUALS, FULL, SUFFIX, "101", align, "224" ); - + addTestChild( "101", "224", + newProperties( ParametersIds.REMOVE_INDIVIDUALS, FULL ) ); /* 225 *** no restrictions */ - align = generator.incrementModifyOntology( ParametersIds.REMOVE_RESTRICTIONS, FULL, SUFFIX, "101", align, "225" ); - - /* Tests 228, 239, 246, 236, 240, 247 */ - + addTestChild( "101", "225", + newProperties( ParametersIds.REMOVE_RESTRICTIONS, FULL ) ); /* 228 *** no property */ - align = generator.incrementModifyOntology( ParametersIds.REMOVE_PROPERTIES, FULL, SUFFIX, "101", align, "228" ); - - /* 236 *** no property + no instance */ - align = generator.incrementModifyOntology( ParametersIds.REMOVE_INDIVIDUALS, FULL, SUFFIX, "228", align, "236" ); - - /* 240 *** no property + expand */ - align = generator.incrementModifyOntology( ParametersIds.ADD_CLASSES, FULL, SUFFIX, "228", align, "240" ); - - /* 247 *** no property + expand + no instance */ - align = generator.incrementModifyOntology( ParametersIds.REMOVE_INDIVIDUALS, FULL, SUFFIX, "240", align, "247" ); + addTestChild( "101", "228", + newProperties( ParametersIds.REMOVE_PROPERTIES, FULL ) ); + /* 236 *** no property + no instance */ + addTestChild( "228", "236", + newProperties( ParametersIds.REMOVE_INDIVIDUALS, FULL ) ); + /* 240 *** no property + expand */ + addTestChild( "228", "240", + newProperties( ParametersIds.ADD_CLASSES, FULL ) ); + /* 247 *** no property + expand + no instance */ + addTestChild( "240", "247", + newProperties( ParametersIds.REMOVE_INDIVIDUALS, FULL ) ); + /* 239 *** no property + flatten */ + addTestChild( "228", "239", + newProperties( ParametersIds.LEVEL_FLATTENED, FULL ) ); + /* 246 *** no property + flatten + no instance */ + addTestChild( "239", "246", + newProperties( ParametersIds.REMOVE_INDIVIDUALS, FULL ) ); + } - /* 239 *** no property + flatten */ - align = generator.incrementModifyOntology( ParametersIds.LEVEL_FLATTENED, FULL, SUFFIX, "228", align, "239" ); + /* +*101 --> 201 +* 201 --> 202 +* 202 --> 248 +* 248 --> 253 +* 202 --> 249 +* 202 --> 250 +* 250 --> 254 +* 254 --> 262 +* 250 --> 257 +* 250 --> 261 +* 261 --> 266 +* 250 --> 260 +* 260 --> 265 +* 202 --> 251 +* 251 --> 258 +* 202 --> 252 +* 252 --> 259 +//------- +*101 --> 221 +* 221 --> 232 +* 221 --> 233 +* 233 --> 241 +*101 --> 222 +* 222 --> 237 +*101 --> 223 +* 223 --> 238 +*101 --> 224 +*101 --> 225 +*101 --> 228 +* 228 --> 236 +* 228 --> 240 +* 240 --> 247 +* 228 --> 239 +* 239 --> 246 + */ - /* 246 *** no property + flatten + no instance */ - align = generator.incrementModifyOntology( ParametersIds.REMOVE_INDIVIDUALS, FULL, SUFFIX, "239", align, "246" ); - } } diff --git a/src/fr/inrialpes/exmo/align/gen/OntologyModifier.java b/src/fr/inrialpes/exmo/align/gen/OntologyModifier.java index 324223c92f47ed9dcd1f8c1d188c13147f5852f1..01c637350cd0701bf5b72b148aac72bd2ecc8dc9 100644 --- a/src/fr/inrialpes/exmo/align/gen/OntologyModifier.java +++ b/src/fr/inrialpes/exmo/align/gen/OntologyModifier.java @@ -103,15 +103,14 @@ public class OntologyModifier { //Ontology init, Ontology modified, Alignment align // JE: Here the alignment is useless... it is used only if nothing is computed! public OntologyModifier ( OntModel model, Alignment alignment ) { - this.model = model; - this.modifiedModel = model; + modifiedModel = model; + namespace = model.getNsPrefixURI(""); // JE: ??? this.alignment = alignment; - this.isBuild = false; - this.isAlign = false; - this.isChanged = false; - this.namespace = model.getNsPrefixURI(""); - this.namespaceNew = ""; - this.params = new Properties(); + isBuild = false; + isAlign = false; + isChanged = false; + namespaceNew = ""; + params = new Properties(); } //no-args constructor @@ -119,9 +118,9 @@ public class OntologyModifier { //if we add / remove a class we need to keep track of the class hierarchy public void buildClassHierarchy () { - this.classHierarchy = new ClassHierarchy(); - this.classHierarchy.buildClassHierarchy( this.modifiedModel ); - //this.classHierarchy.printClassHierarchy(); + classHierarchy = new ClassHierarchy(); + classHierarchy.buildClassHierarchy( modifiedModel ); + //classHierarchy.printClassHierarchy(); } //generates a random string with the length "length" @@ -133,7 +132,7 @@ public class OntologyModifier { for (int i = 0; i < length; i++) { text[i] = characters.charAt( generator.nextInt(length) ); } - return new String(text).toUpperCase(); + return new String(text); // JE suppressed toUpperCase() } //removes spaces from a string @@ -167,7 +166,7 @@ public class OntologyModifier { try { translatedText = Translate.execute(source, Language.ENGLISH, Language.FRENCH); } catch (Exception e) { - System.out.println( "Exception " + e.getMessage() ); + System.err.println( "Exception " + e.getMessage() ); } return removeSpaces ( translatedText ); } @@ -212,7 +211,7 @@ public class OntologyModifier { */ public String parseString (String str, boolean activeTranslateString, boolean activeSynonym) { - // System.out.println ( "str = [" + str + "]" ); + // System.err.println ( "str = [" + str + "]" ); char [] parsed = str.toCharArray(); String newString = ""; @@ -259,7 +258,7 @@ public class OntologyModifier { //replaces the label of the property public void replacePropertyLabel( String uri, String newLabel, boolean activeRandomString, boolean activeTranslateString, boolean activeSynonym, int activeStringOperation ) { - OntProperty prop = this.modifiedModel.getOntProperty( uri ); + OntProperty prop = modifiedModel.getOntProperty( uri ); if ( prop.getLabel( "en" ) != null ) { if ( activeTranslateString ) { prop.setLabel( newLabel, "fr" ); @@ -270,7 +269,7 @@ public class OntologyModifier { } //gets the URIs of the properties and their translation - public HashMap<String, String> getPropertiesIdentifiers ( float percentage, boolean activeRandomString, boolean activeTranslateString, boolean activeSynonym, int activeStringOperation) { + public HashMap<String, String> getPropertiesIdentifiers( float percentage, boolean activeRandomString, boolean activeTranslateString, boolean activeSynonym, int activeStringOperation) { HashMap<String, String> propertiesIdentifiers = new HashMap<String, String>(); //the HashMap of the properties identifiers List<String> propertiesName = new ArrayList<String>(); //the properties identifiers @@ -283,6 +282,7 @@ public class OntologyModifier { //builds the list of all unrenamed properties from the model for ( OntProperty p : properties ) { String uri = base + p.getLocalName(); + // JE: I am affraid that this.params is a terible thing here if ( this.params.containsKey( uri ) ) { String key = uri; String value = this.params.getProperty( key ); @@ -296,13 +296,15 @@ public class OntologyModifier { renamedProperties = nbProperties - notRenamedProperties.size(); toBeRenamed = (int)(percentage*nbProperties) - renamedProperties; // -renamedProperties -> for Benchmark - + // JE: same thing as for classes... but strange + // JE: should be the symptom of a bug + if ( toBeRenamed < 0 ) toBeRenamed = 0; //builds the list of properties to be renamed - int [] n = this.randNumbers(notRenamedProperties.size(), toBeRenamed); + int [] n = randNumbers(notRenamedProperties.size(), toBeRenamed); for ( int i=0; i<toBeRenamed; i++ ) { OntProperty p = notRenamedProperties.get(n[i]); propertiesTo.add(p); - if ( p.getNameSpace().equals( this.namespace ) ) + if ( p.getNameSpace().equals( namespace ) ) propertiesName.add( p.getLocalName() ); } @@ -310,23 +312,23 @@ public class OntologyModifier { String nameSpace = prop.getNameSpace(); String localName = prop.getLocalName(); //has the same Namespace as the Ontology Namespace - if ( nameSpace.equals( this.namespace ) ) { + if ( nameSpace.equals( namespace ) ) { if ( !propertiesIdentifiers.containsKey( localName ) ) { if ( activeTranslateString ) { //replace the URI with the translated one String translateStrg = parseString ( localName, true, false); propertiesIdentifiers.put( localName , translateStrg ); replacePropertyLabel( prop.getURI(), translateStrg, activeRandomString, activeTranslateString, activeSynonym, activeStringOperation ); - if ( params.containsKey( this.base + prop.getLocalName() ) ) { //this.params.remove( prop.getURI() ); - this.params.put( this.base + prop.getLocalName() , this.base + translateStrg );//the reference alignment + if ( params.containsKey( base + prop.getLocalName() ) ) { //this.params.remove( prop.getURI() ); + this.params.put( base + prop.getLocalName() , base + translateStrg );//the reference alignment } } else if ( activeRandomString ) { //replace the URI with a random string String newStrg = getRandomString(); propertiesIdentifiers.put( localName , newStrg ); replacePropertyLabel( prop.getURI(), newStrg, activeRandomString, activeTranslateString, activeSynonym, activeStringOperation ); - if ( params.containsKey( this.base + prop.getLocalName() ) ) { //this.params.remove( prop.getURI() ); - this.params.put( this.base + prop.getLocalName() , this.base + newStrg);//the reference alignment + if ( params.containsKey( base + prop.getLocalName() ) ) { //this.params.remove( prop.getURI() ); + this.params.put( base + prop.getLocalName() , base + newStrg);//the reference alignment } } else if ( activeSynonym ) { @@ -370,7 +372,7 @@ public class OntologyModifier { //replaces the label of the class public void replaceClassLabel( String uri, String newLabel, boolean activeRandomString, boolean activeTranslateString, boolean activeSynonym, int activeStringOperation ) { - OntClass c = this.modifiedModel.getOntClass( uri ); + OntClass c = modifiedModel.getOntClass( uri ); if ( c.getLabel( "en" ) != null ) { if ( activeTranslateString ) { @@ -387,9 +389,10 @@ public class OntologyModifier { int nbClasses, toBeRenamed, renamedClasses; List<OntClass> notRenamedClasses = new ArrayList<OntClass>(); //the list of not renamed classes - List<OntClass> classes = this.getOntologyClasses(); //the list of ontology classes + List<OntClass> classes = getOntologyClasses(); //the list of ontology classes List<OntClass> classesTo = new ArrayList<OntClass>(); //the list of classes to be renamed + // params contains those classes which have already been renamed //builds the list of all unrenamed classes from the model for ( OntClass c : classes ) { String uri = base + c.getLocalName(); @@ -403,13 +406,14 @@ public class OntologyModifier { } } - nbClasses = classes.size(); //the number of renamed classes - renamedClasses = nbClasses - notRenamedClasses.size(); + nbClasses = classes.size(); + renamedClasses = nbClasses - notRenamedClasses.size(); //the number of renamed classes toBeRenamed = (int)(percentage*nbClasses) - renamedClasses; // -renamedClasses -> for Benchmark - - + // JE: toBeRenamed is negative when classes have been added to the model! + // JE TOCHECK IF THIS IS STILL CORRECT + if ( toBeRenamed < 0 ) toBeRenamed = 0; //build the list of classes to be renamed - int [] n = this.randNumbers(notRenamedClasses.size(), toBeRenamed); + int[] n = randNumbers( notRenamedClasses.size(), toBeRenamed ); for ( int i=0; i<toBeRenamed; i++ ) { OntClass cls = notRenamedClasses.get(n[i]); classesTo.add(cls); @@ -422,7 +426,7 @@ public class OntologyModifier { String localName = cls.getLocalName(); //has the same Namespace as the Ontology Namespace - if ( nameSpace.equals( this.namespace ) ) { + if ( nameSpace.equals( namespace ) ) { if ( !classesIdentifiers.containsKey( localName ) ) { if ( activeTranslateString ) { //replace the URI with the translated one String translateStrg = parseString (localName, true, false); @@ -485,28 +489,26 @@ public class OntologyModifier { HashMap<String, String> propertiesIdentifiers = null; //the HashMap of the properties identifiers HashMap<String, String> classesIdentifiers = null; //the HashMap of the classes identifiers - String subjectLocalName, subjectNameSpace; - String predicateLocalName, predicateNameSpace; - String objectLocalName, objectNameSpace; - - boolean isPred, isSubj, isObj; - isPred = isSubj = isObj = false; - - OntModel newModel = ModelFactory.createOntologyModel(OntModelSpec.OWL_MEM);//create new Model + OntModel newModel = ModelFactory.createOntologyModel( OntModelSpec.OWL_MEM );//create new Model //get properties and classes identifiers if ( activeProperties ) propertiesIdentifiers = getPropertiesIdentifiers( percentage, activeRandomString, activeTranslateString, activeSynonym, activeStringOperation); if ( activeClasses ) - classesIdentifiers = getClassesIdentifiers ( percentage, activeRandomString, activeTranslateString, activeSynonym, activeStringOperation); - statements = this.modifiedModel.listStatements().toList(); //get all the statements of the model + classesIdentifiers = getClassesIdentifiers( percentage, activeRandomString, activeTranslateString, activeSynonym, activeStringOperation ); //iterate and modify the identifiers - for ( Statement stm : statements ) { + for ( Statement stm : modifiedModel.listStatements().toList() ) { Resource subject = stm.getSubject(); //the subject Property predicate = stm.getPredicate(); //the predicate RDFNode object = stm.getObject(); //the object + String subjectLocalName, subjectNameSpace; + String predicateLocalName, predicateNameSpace; + String objectLocalName, objectNameSpace; + + boolean isPred, isSubj, isObj; + Resource subj = null; Property pred = null; Resource obj = null; @@ -517,7 +519,7 @@ public class OntologyModifier { if ( activeProperties ) { if ( propertiesIdentifiers.containsKey( subject.getLocalName() ) ) { //if the namespace of the subject is the same as the namespace of the property identifier - if ( subject.getNameSpace().equals( this.namespace ) ) {//that we want to remove + if ( subject.getNameSpace().equals( namespace ) ) {//that we want to remove isSubj = true; subjectNameSpace = subject.getNameSpace(); subjectLocalName = subject.getLocalName(); @@ -530,7 +532,7 @@ public class OntologyModifier { if ( classesIdentifiers.containsKey( subject.getLocalName() ) ) { //if the namespace of the subject is the same as the namespace of the property identifier //that we want to remove - if (subject.getNameSpace().equals( this.namespace ) ) { + if (subject.getNameSpace().equals( namespace ) ) { isSubj = true; subjectNameSpace = subject.getNameSpace(); subjectLocalName = subject.getLocalName(); @@ -644,7 +646,7 @@ public class OntologyModifier { @SuppressWarnings("unchecked") public List<OntClass> getOntologyClasses () { List<OntClass> classes = new ArrayList<OntClass>(); - for ( Iterator it = this.modifiedModel.listNamedClasses(); it.hasNext(); ) { + for ( Iterator it = modifiedModel.listNamedClasses(); it.hasNext(); ) { OntClass aux = (OntClass)it.next(); if ( ( aux ).getNameSpace().equals( this.namespace ) ) { classes.add( aux ); @@ -657,7 +659,7 @@ public class OntologyModifier { @SuppressWarnings("unchecked") public List<OntProperty> getOntologyProperties () { List<OntProperty> properties = new ArrayList<OntProperty>(); - for ( Iterator it = this.modifiedModel.listAllOntProperties(); it.hasNext(); ) { + for ( Iterator it = modifiedModel.listAllOntProperties(); it.hasNext(); ) { OntProperty prop = (OntProperty)it.next(); if ( prop.getNameSpace().equals( this.namespace ) ) properties.add( prop ); @@ -666,12 +668,13 @@ public class OntologyModifier { } //adds a class with a random URI to the parent class parentURI - public OntClass addClass ( OntClass parentClass, String childURI ) { - OntClass childClass = this.modifiedModel.createClass( this.namespace + childURI );//create a new class to the model + public OntClass addClass ( OntClass parentClass, String name ) { + String childURI = namespace+name; + OntClass childClass = modifiedModel.createClass( childURI );//create a new class to the model - this.classHierarchy.addClass( this.namespace + childURI, parentClass.getURI() );//add the node in the hierarchy of classes + classHierarchy.addClass( childURI, parentClass.getURI() );//add the node in the hierarchy of classes parentClass.addSubClass( childClass ); //add the childClass as subclass of parentClass - this.modifiedModel.add( childClass, RDFS.subClassOf, parentClass ); //add the class to the model + modifiedModel.add( childClass, RDFS.subClassOf, parentClass ); //add the class to the model return childClass; } @@ -679,14 +682,13 @@ public class OntologyModifier { public void addSubClasses ( float percentage ) { List<OntClass> classes = getOntologyClasses(); //get the list of classes from the Ontology int nbClasses = classes.size(); //number of classes from the Ontology - int toAdd = (int) ( percentage * nbClasses ); + int toAdd = (int)(percentage*nbClasses); checkClassHierarchy(); //check if the classHierarchy is built //build the list of properties to be renamed - int [] n = this.randNumbers(nbClasses, toAdd); + int[] n = this.randNumbers( nbClasses, toAdd ); for ( int i=0; i<toAdd; i++ ) { - String childURI = this.getRandomString(); //give a random URI to the new class - addClass( classes.get(n[i]), childURI ); + addClass( classes.get(n[i]), getRandomString() ); //give a random URI to the new class } } @@ -703,12 +705,12 @@ public class OntologyModifier { checkClassHierarchy(); //check if the class hierarchy is built if ( level == 1 ) { //the parent of the class is Thing, we add the class and then the rest of the classes classURI = this.getRandomString(); - parentClass = this.modifiedModel.createClass( this.namespace + classURI );//create a new class to the model + parentClass = modifiedModel.createClass( this.namespace + classURI );//create a new class to the model this.classHierarchy.addClass( this.namespace + classURI, "Thing" ); //add the node in the hierarchy of classes childClasses.add(parentClass); } else { - parentClasses = this.classHierarchy.getClassesFromLevel(this.modifiedModel, level); + parentClasses = this.classHierarchy.getClassesFromLevel(modifiedModel, level); int nbParentClasses = parentClasses.size(); //number of classes from the Ontology int toAdd = (int) ( percentage * nbClasses ); // 1 can be replaced by percentage @@ -733,14 +735,13 @@ public class OntologyModifier { //changes the unionOf, intersectionOf public OntModel changeDomainRange ( HashMap<String, String> uris ) { OntModel newModel = ModelFactory.createOntologyModel(OntModelSpec.OWL_MEM);//create new Model - List<Statement> statements = this.modifiedModel.listStatements().toList(); //get all the statements of the model boolean isSubj, isObj, isPred; String subjectNameSpace, subjectLocalName; String objectNameSpace, objectLocalName; String predicateNameSpace, predicateLocalName; //iterate and modify the identifiers - for ( Statement stm : statements ) { + for ( Statement stm : modifiedModel.listStatements().toList() ) { Resource subject = stm.getSubject(); //the subject Property predicate = stm.getPredicate(); //the predicate RDFNode object = stm.getObject(); //the object @@ -800,7 +801,7 @@ public class OntologyModifier { @SuppressWarnings("unchecked") public void checkClassesRestrictions ( OntClass childClass, OntClass parentClass ) { Restriction restr = null; - for ( Iterator it = this.modifiedModel.listRestrictions(); it.hasNext(); ) { + for ( Iterator it = modifiedModel.listRestrictions(); it.hasNext(); ) { restr = (Restriction)it.next(); //get the restriction /* isAllValuesFromRestriction */ if ( restr.isAllValuesFromRestriction() ) { @@ -827,9 +828,9 @@ public class OntologyModifier { public String removeClass ( OntClass cls ) { OntClass parentClass; ArrayList<OntClass> subClasses = new ArrayList<OntClass>(); //the list of all the subclasses of the class - OntClass thing = this.modifiedModel.createClass( OWL.Thing.getURI() ); //Thing class + OntClass thing = modifiedModel.createClass( OWL.Thing.getURI() ); //Thing class checkClassHierarchy(); //check if the class hierarchy is built - parentClass = this.classHierarchy.removeClass( this.modifiedModel, cls );//get the parent of the class + parentClass = this.classHierarchy.removeClass( modifiedModel, cls );//get the parent of the class for (Iterator it1 = cls.listSubClasses(); it1.hasNext(); ) { //build the list of subclasses OntClass subCls = (OntClass)it1.next(); //because we can't change the @@ -870,7 +871,7 @@ public class OntologyModifier { } //checks if the class appears like unionOf.. and replaces its appearence with the superclass - this.modifiedModel = changeDomainRange( uris ); + modifiedModel = changeDomainRange( uris ); //remove the URI of the class from the reference alignment for ( String key : this.params.stringPropertyNames() ) { @@ -886,26 +887,25 @@ public class OntologyModifier { public void removeClassesFromLevel ( int level ) { HashMap<String, String> uris = new HashMap<String, String>(); String parentURI = ""; - //System.out.println( "Level " + level ); + //System.err.println( "Level " + level ); /* if ( level == 1 ) //except classes from level 1 return; */ List<OntClass> classes = new ArrayList<OntClass>(); checkClassHierarchy(); //check if the class hierarchy is built - classes = this.classHierarchy.getClassesFromLevel(this.modifiedModel, level); + classes = this.classHierarchy.getClassesFromLevel(modifiedModel, level); for ( int i=0; i<classes.size(); i++ ) { //remove the classes from the hierarchy parentURI = removeClass ( classes.get(i) ); uris.put(classes.get(i).getURI(), parentURI); } //checks if the class appears like unionOf .. and replaces its appearence with the superclass - this.modifiedModel = changeDomainRange( uris ); + modifiedModel = changeDomainRange( uris ); } //remove percentage individuals from Ontology public void removeIndividuals( float percentage ) { boolean isSubj, isObj; //the individual can appear as subject or object - List<Individual> individuals = this.modifiedModel.listIndividuals().toList(); + List<Individual> individuals = modifiedModel.listIndividuals().toList(); List<Individual> individualsTo = new ArrayList<Individual>(); //the list of individuals to be removed - List<Statement> statements = this.modifiedModel.listStatements().toList(); int nbIndividuals = individuals.size(); //the number of individuals int toBeRemoved = (int)( percentage*nbIndividuals ); //the number of individuals to be removed @@ -916,7 +916,7 @@ public class OntologyModifier { //this.params.remove( indiv.getURI() ); } - for ( Statement st : statements ) { + for ( Statement st : modifiedModel.listStatements().toList() ) { Resource subject = st.getSubject(); RDFNode object = st.getObject(); isSubj = isObj = false; @@ -927,9 +927,9 @@ public class OntologyModifier { if ( individualsTo.contains( object.asResource() ) ) isObj = true; if ( isSubj ) //the individual appears as subject in the statement - this.modifiedModel.remove( st ); + modifiedModel.remove( st ); if ( isObj ) //the individual appears as object in the statement - this.modifiedModel.remove( st ); + modifiedModel.remove( st ); } } @@ -943,7 +943,6 @@ public class OntologyModifier { List<String> pr = new ArrayList<String>(); boolean isObj, isSubj, isPred; - List<Statement> statements = this.modifiedModel.listStatements().toList();//get all of the statements int nbProperties = properties.size(); //the number of properties int toBeRemoved = (int)( percentage*nbProperties ); //the number of properties to be removed @@ -991,15 +990,15 @@ public class OntologyModifier { //since we don't respect any order the value can appear as a value, thus we must iterate among all params to delete it for ( String key : this.params.stringPropertyNames() ) { String value = this.params.getProperty(key); - if ( pr.contains( this.namespace + key.substring(key.indexOf(this.base) + this.base.length()) ) ) { //System.out.println( "Elimin " + key ); + if ( pr.contains( this.namespace + key.substring(key.indexOf(this.base) + this.base.length()) ) ) { //System.err.println( "Elimin " + key ); this.params.remove( key ); } - if ( pr.contains( this.namespace + value.substring(key.indexOf(this.base) + this.base.length()) ) ) { //System.out.println( "Elimin " + key ); + if ( pr.contains( this.namespace + value.substring(key.indexOf(this.base) + this.base.length()) ) ) { //System.err.println( "Elimin " + key ); this.params.remove( key ); } } - for ( Statement st : statements ) { //remove the declaration of properties from the model + for ( Statement st : modifiedModel.listStatements().toList() ) { //remove the declaration of properties from the model Resource subject = st.getSubject(); Property predicate = st.getPredicate(); RDFNode object = st.getObject(); @@ -1019,7 +1018,7 @@ public class OntologyModifier { isObj = true; if ( isSubj || isPred || isObj ) //remove the statement in which the prop - this.modifiedModel.remove( st ); //appears as subject, predicate or object + modifiedModel.remove( st ); //appears as subject, predicate or object } } @@ -1036,8 +1035,8 @@ public class OntologyModifier { int toBeAdd = (int)( percentage*nbProperties ); //the number of properties to be add for ( int i=0; i<toBeAdd/2; i++ ) { //add object properties - //p = this.modifiedModel.createObjectProperty( this.namespace + "OBJECT_PROPERTY_" + getRandomString() ); - p = this.modifiedModel.createObjectProperty( this.namespace + getRandomString() ); + //p = modifiedModel.createObjectProperty( this.namespace + "OBJECT_PROPERTY_" + getRandomString() ); + p = modifiedModel.createObjectProperty( this.namespace + getRandomString() ); index = classRand.nextInt( nbClasses ); //pick random domain p.addDomain( classes.get( index ) ); index = classRand.nextInt( nbClasses ); //pick random range @@ -1045,8 +1044,8 @@ public class OntologyModifier { } for ( int i=toBeAdd/2; i<toBeAdd; i++ ) { //add datatype properties - //d = this.modifiedModel.createDatatypeProperty( this.namespace + "DATATYPE_PROPERTY_" + getRandomString() ); - d = this.modifiedModel.createDatatypeProperty( this.namespace + getRandomString() ); + //d = modifiedModel.createDatatypeProperty( this.namespace + "DATATYPE_PROPERTY_" + getRandomString() ); + d = modifiedModel.createDatatypeProperty( this.namespace + getRandomString() ); index = classRand.nextInt( nbClasses ); //add domain d.addDomain( classes.get( index ) ); d.addRange( XSD.xstring ); //add range -> string @@ -1057,7 +1056,7 @@ public class OntologyModifier { @SuppressWarnings("unchecked") public void removeClassesComments ( float percentage ) { ArrayList<Literal> comments = new ArrayList<Literal>(); - List<OntClass> classes = this.modifiedModel.listNamedClasses().toList(); + List<OntClass> classes = modifiedModel.listNamedClasses().toList(); ArrayList<OntClass> classesTo = new ArrayList<OntClass>(); int nbClasses = classes.size(); int toBeRemoved = (int)( percentage * nbClasses ); //number of classes comments to be removed @@ -1081,7 +1080,7 @@ public class OntologyModifier { @SuppressWarnings("unchecked") public void removePropertiesComments ( float percentage ) { ArrayList<Literal> comments = new ArrayList<Literal>(); // an array list to hold all the comments - List<OntProperty> properties = this.modifiedModel.listAllOntProperties().toList(); + List<OntProperty> properties = modifiedModel.listAllOntProperties().toList(); ArrayList<OntProperty> propertiesTo = new ArrayList<OntProperty>(); int nbProperties = properties.size(); int toBeRemoved = (int)( percentage * nbProperties ); //the number of properties comments to be removed @@ -1105,7 +1104,7 @@ public class OntologyModifier { @SuppressWarnings("unchecked") public void removeIndividualsComments ( float percentage ) { ArrayList<Literal> comments = new ArrayList<Literal>(); // an array list to hold all the comments - List<Individual> individuals = this.modifiedModel.listIndividuals().toList(); + List<Individual> individuals = modifiedModel.listIndividuals().toList(); ArrayList<Individual> individualsTo = new ArrayList<Individual>(); int nbIndividuals = individuals.size(); int toBeRemoved = (int)( percentage * nbIndividuals ); //number of classes to be removed @@ -1128,7 +1127,7 @@ public class OntologyModifier { @SuppressWarnings("unchecked") public void removeOntologiesComments ( float percentage ) { ArrayList<Literal> comments = new ArrayList<Literal>(); // an array list to hold all the comments - List<Ontology> ontologies = this.modifiedModel.listOntologies().toList(); + List<Ontology> ontologies = modifiedModel.listOntologies().toList(); ArrayList<Ontology> ontologiesTo = new ArrayList<Ontology>(); int nbOntologies = ontologies.size(); int toBeRemoved = (int)( percentage * nbOntologies ); //the number of Ontologies comments to be removed @@ -1166,7 +1165,7 @@ public class OntologyModifier { if ( level == 1 ) //no change return; checkClassHierarchy(); //check if the class hierarchy is built - active = this.classHierarchy.flattenClassHierarchy( this.modifiedModel, level, levelClasses, parentLevelClasses, superLevelClasses); + active = this.classHierarchy.flattenClassHierarchy( modifiedModel, level, levelClasses, parentLevelClasses, superLevelClasses); size = levelClasses.size(); /* remove duplicates from list */ @@ -1196,10 +1195,10 @@ public class OntologyModifier { restr.add(r); if ( r.isSomeValuesFromRestriction() ) restr.add(r); - //System.out.println( cls.getURI() + cls.getLocalName() ); + //System.err.println( cls.getURI() + cls.getLocalName() ); } } - //System.out.println( restr.size() ); + //System.err.println( restr.size() ); if ( !restrictions.containsKey( parentClass.getURI() ) ) { restrictions.put( parentClass.getURI(), restr ); @@ -1210,11 +1209,11 @@ public class OntologyModifier { if ( active ) { //if ( !parentClass.getURI().equals( "Thing" ) ) { OntClass superClass = superLevelClasses.get( i ); //parent class of the child class parents - //System.out.println("SuperClass class [" + superClass.getURI() + "]"); - //System.out.println("Parent class [" + parentClass.getURI() + "]"); - //System.out.println("Child class [" + childClass.getURI() + "]"); + //System.err.println("SuperClass class [" + superClass.getURI() + "]"); + //System.err.println("Parent class [" + parentClass.getURI() + "]"); + //System.err.println("Child class [" + childClass.getURI() + "]"); - if ( this.modifiedModel.containsResource(parentClass) ) { + if ( modifiedModel.containsResource(parentClass) ) { //to check if the class appears as unionOf, someValuesFrom, allValuesFrom .. unionOf.put(parentClass.getURI(), superClass.getURI()); checkClassesRestrictions ( parentClass, superClass ); @@ -1223,9 +1222,9 @@ public class OntologyModifier { childClass.addSuperClass( superClass ); parentClass.removeSubClass( childClass ); } else { - OntClass superClass = this.modifiedModel.createClass( OWL.Thing.getURI() ); //Thing class + OntClass superClass = modifiedModel.createClass( OWL.Thing.getURI() ); //Thing class - if ( this.modifiedModel.containsResource(parentClass) ) { + if ( modifiedModel.containsResource(parentClass) ) { //to check if the class appears as unionOf.. unionOf.put(parentClass.getURI(), superClass.getURI()); checkClassesRestrictions ( parentClass, superClass ); @@ -1247,7 +1246,7 @@ public class OntologyModifier { } //checks if the class appears like unionOf, someValuesFrom, allValuesFrom .. and replaces its appearence with the superclass - this.modifiedModel = changeDomainRange(unionOf); + modifiedModel = changeDomainRange(unionOf); //remove the parentClass from the alignment for ( String key : this.params.stringPropertyNames() ) { @@ -1271,7 +1270,7 @@ public class OntologyModifier { ArrayList<OntClass> parentLevelClasses = new ArrayList<OntClass>(); //the list of parent of the child classes from that level ArrayList<OntClass> superLevelClasses = new ArrayList<OntClass>(); //the list of parent of the parent classes from that level checkClassHierarchy(); //check if the class hierarchy is built - active = this.classHierarchy.flattenClassHierarchy( this.modifiedModel, level, levelClasses, parentLevelClasses, superLevelClasses); + active = this.classHierarchy.flattenClassHierarchy( modifiedModel, level, levelClasses, parentLevelClasses, superLevelClasses); size = levelClasses.size(); for ( int i=0; i<size; i++ ) { @@ -1302,7 +1301,7 @@ public class OntologyModifier { public void removeRestrictions( float percentage ) { List<Restriction> restrictions = new ArrayList<Restriction>(); List<Restriction> restrictionsTo = new ArrayList<Restriction>(); //the array list of restrictions to be removed - restrictions = this.modifiedModel.listRestrictions().toList(); + restrictions = modifiedModel.listRestrictions().toList(); int nbRestrictions = restrictions.size(); //the number of restrictions int toBeRemoved = (int)( percentage*nbRestrictions ); //the number of restrictions to be removed @@ -1333,10 +1332,10 @@ public class OntologyModifier { } public void initializeAlignment() { - List<OntClass> classes = this.modifiedModel.listNamedClasses().toList();//all classes - List<OntProperty> properties = this.modifiedModel.listAllOntProperties().toList();//all properties - List<Individual> individuals = this.modifiedModel.listIndividuals().toList();//all individuals - List<Ontology> ontologies = this.modifiedModel.listOntologies().toList();//all Ontologies + List<OntClass> classes = modifiedModel.listNamedClasses().toList();//all classes + List<OntProperty> properties = modifiedModel.listAllOntProperties().toList();//all properties + List<Individual> individuals = modifiedModel.listIndividuals().toList();//all individuals + List<Ontology> ontologies = modifiedModel.listOntologies().toList();//all Ontologies this.params = new Properties(); @@ -1373,30 +1372,29 @@ public class OntologyModifier { String value = this.params.getProperty(key); URI uri1 = URI.create(key); URI uri2 = URI.create(this.namespaceNew + value.substring(value.indexOf(this.base) + this.base.length())); - //System.out.println( "[" + key + "][" + value + "]" ); + //System.err.println( "[" + key + "][" + value + "]" ); this.alignment.addAlignCell( uri1, uri2, "=", 1 ); } - } catch (AlignmentException aex) { System.out.println( "Exception " + aex.getMessage() ); + } catch (AlignmentException aex) { System.err.println( "Exception " + aex.getMessage() ); } catch (Exception ex) { System.err.println("Exception " + ex.getMessage()); } } public void setNewNamespace(String newNamespace) { this.namespaceNew = newNamespace; - //System.out.println("New namespace [" + this.namespaceNew + "]"); + //System.err.println("New namespace [" + this.namespaceNew + "]"); } //change the namespace of the modified ontology + // JE: ?? public OntModel changeNamespace () { - List<Statement> statements = this.modifiedModel.listStatements().toList(); //the statements of the model - this.isChanged = true; boolean isSubj, isPred, isObj;; OntModel newModel = ModelFactory.createOntologyModel( OntModelSpec.OWL_MEM );//create new Model //iterate through all the statements and change the namespace - for ( Statement stm : statements ) { + for ( Statement stm : modifiedModel.listStatements().toList() ) { Resource subject = stm.getSubject(); //the subject Property predicate = stm.getPredicate(); //the predicate RDFNode object = stm.getObject(); //the object @@ -1468,23 +1466,18 @@ public class OntologyModifier { //returns the modified ontology after changing the namespace public OntModel getModifiedOntology () { - //System.out.println( "->change namespace" ); - this.modifiedModel = changeNamespace(); //change the namespace of the modified ontology - //System.out.println( "->namespace changed" ); - return this.modifiedModel; - } - - //set the model - public void setModel( OntModel model ) { - this.model = model; + //System.err.println( "->change namespace" ); + modifiedModel = changeNamespace(); //change the namespace of the modified ontology + //System.err.println( "->namespace changed" ); + return modifiedModel; } public void setModifiedModel(OntModel model) { - this.modifiedModel = model; + modifiedModel = model; } public OntModel getModifiedModel() { - return this.modifiedModel; + return modifiedModel; } //get properties @@ -1505,80 +1498,78 @@ public class OntologyModifier { //OntModel model, OntModel modifiedModel, Alignment alignment public void modifyOntology( String name, String param ) { + if ( param == null ) return; + if ( name == null || name.equals("") ) { + System.err.println( "No parameter" ); //no parameter as input + return; + }; float value = 0.0f; String aux = ""; - if ( name == null || param == null || name.equals("") ) { - System.out.println( "No parameter" ); //no parameter as input - } else { - if ( param.equals( ParametersIds.NO_HIERARCHY ) ) - ; - else if( param != null) //the value of the parameter - value = Float.valueOf( param ).floatValue(); // ?? - else - aux = param; - - - if ( !this.isAlign ) { - initializeAlignment(); //determine the elements from the initial reference alignment - } + if ( param.equals( ParametersIds.NO_HIERARCHY ) ) + ; + else if( param != null) //the value of the parameter + value = Float.valueOf( param ).floatValue(); // ?? + else + aux = param; - - if ( name.equals( ParametersIds.ADD_CLASSES ) ) { //add percentage classes - System.out.println( "Add Class" + "[" + value + "]"); - addSubClasses( value ); - } else if ( name.equals( ParametersIds.REMOVE_CLASSES ) ) { //remove percentage classes - System.out.println( "Remove Class" + "[" + value + "]"); - removeSubClasses( value ); - } else if ( name.equals( ParametersIds.REMOVE_COMMENTS ) ) { //remove percentage comments - System.out.println( "Remove Comments" + "[" + value + "]"); - removeComments ( value ); - } else if ( name.equals( ParametersIds.REMOVE_PROPERTIES ) ) { //remove percentage properties - System.out.println( "Remove Property" + "[" + value + "]"); - removeProperties ( value ); - } else if ( name.equals( ParametersIds.ADD_PROPERTIES ) ) { //add percentage properties - System.out.println( "Add Property" + "[" + value + "]"); - addProperties ( value ); - } else if ( name.equals( ParametersIds.ADD_CLASSESLEVEL ) ) { //recursive add nbClasses starting from level level - aux = ((Float)value).toString(); - int index = aux.indexOf("."); - int level = Integer.valueOf( aux.substring(0, index) ); - int nbClasses = Integer.valueOf( aux.substring(index+1, aux.length()) ); - System.out.println( "level " + level ); - System.out.println( "nbClasses " + nbClasses ); - float percentage = 1.00f; - addClasses ( level, nbClasses, percentage ); - } else if ( name.equals( ParametersIds.REMOVE_CLASSESLEVEL ) ) { //remove all the classes from the level level - System.out.println("Remove all classes from level" + (int)value ); - removeClassesFromLevel ( (int)value ); - } else if ( name.equals( ParametersIds.LEVEL_FLATTENED ) ) { //flatten a level - //levelFlattened ( level ); - levelFlattened ( (int)value ); - System.out.println( "New class hierarchy level " + getMaxLevel() ) ; - } else if ( name.equals( ParametersIds.RENAME_CLASSES ) ) { //rename classes - System.out.println("Rename classes" + "[" + value + "]" ); - //System.out.println("\nValue = " + value + "\n"); //activeProperties, activeClasses, .. - this.modifiedModel = renameResource ( false, true, value, true, false, false, 0); - } else if ( name.equals( ParametersIds.RENAME_PROPERTIES ) ) { //rename properties - System.out.println("Rename properties " + "[" + value + "]" ); - //System.out.println("\nValue = " + value + "\n"); //activeProperties, activeClasses, .. - this.modifiedModel = renameResource ( true, false, value, true, false, false, 0); - } else if ( name.equals( ParametersIds.REMOVE_RESTRICTIONS ) ) { //remove percentage restrictions - System.out.println("Remove restrictions" + "[" + value + "]"); - removeRestrictions( value ); - } else if ( name.equals( ParametersIds.REMOVE_INDIVIDUALS ) ) { //remove percentage individuals - System.out.println("Remove individuals" + "[" + value + "]"); - removeIndividuals( value ); - } else if ( name.equals( ParametersIds.NO_HIERARCHY ) ) { //no hierarchy - System.out.println( "NoHierarchy" ); - noHierarchy(); - } + if ( !this.isAlign ) { + initializeAlignment(); //determine the elements from the initial reference alignment + } - //rebuild the class hierarchy every time - this.isBuild = false; - this.isChanged = false; + if ( name.equals( ParametersIds.ADD_CLASSES ) ) { //add percentage classes + System.err.println( "Add Class" + "[" + value + "]"); + addSubClasses( value ); + } else if ( name.equals( ParametersIds.REMOVE_CLASSES ) ) { //remove percentage classes + System.err.println( "Remove Class" + "[" + value + "]"); + removeSubClasses( value ); + } else if ( name.equals( ParametersIds.REMOVE_COMMENTS ) ) { //remove percentage comments + System.err.println( "Remove Comments" + "[" + value + "]"); + removeComments ( value ); + } else if ( name.equals( ParametersIds.REMOVE_PROPERTIES ) ) { //remove percentage properties + System.err.println( "Remove Property" + "[" + value + "]"); + removeProperties ( value ); + } else if ( name.equals( ParametersIds.ADD_PROPERTIES ) ) { //add percentage properties + System.err.println( "Add Property" + "[" + value + "]"); + addProperties ( value ); + } else if ( name.equals( ParametersIds.ADD_CLASSESLEVEL ) ) { //recursive add nbClasses starting from level level + aux = ((Float)value).toString(); + int index = aux.indexOf("."); + int level = Integer.valueOf( aux.substring(0, index) ); + int nbClasses = Integer.valueOf( aux.substring(index+1, aux.length()) ); + System.err.println( "level " + level ); + System.err.println( "nbClasses " + nbClasses ); + float percentage = 1.00f; + addClasses ( level, nbClasses, percentage ); + } else if ( name.equals( ParametersIds.REMOVE_CLASSESLEVEL ) ) { //remove all the classes from the level level + System.err.println("Remove all classes from level" + (int)value ); + removeClassesFromLevel ( (int)value ); + } else if ( name.equals( ParametersIds.LEVEL_FLATTENED ) ) { //flatten a level + //levelFlattened ( level ); + levelFlattened ( (int)value ); + System.err.println( "New class hierarchy level " + getMaxLevel() ) ; + } else if ( name.equals( ParametersIds.RENAME_CLASSES ) ) { //rename classes + System.err.println("Rename classes" + "[" + value + "]" ); + //System.err.println("\nValue = " + value + "\n"); //activeProperties, activeClasses, .. + modifiedModel = renameResource ( false, true, value, true, false, false, 0); + } else if ( name.equals( ParametersIds.RENAME_PROPERTIES ) ) { //rename properties + System.err.println("Rename properties " + "[" + value + "]" ); + //System.err.println("\nValue = " + value + "\n"); //activeProperties, activeClasses, .. + modifiedModel = renameResource ( true, false, value, true, false, false, 0); + } else if ( name.equals( ParametersIds.REMOVE_RESTRICTIONS ) ) { //remove percentage restrictions + System.err.println("Remove restrictions" + "[" + value + "]"); + removeRestrictions( value ); + } else if ( name.equals( ParametersIds.REMOVE_INDIVIDUALS ) ) { //remove percentage individuals + System.err.println("Remove individuals" + "[" + value + "]"); + removeIndividuals( value ); + } else if ( name.equals( ParametersIds.NO_HIERARCHY ) ) { //no hierarchy + System.err.println( "NoHierarchy" ); + noHierarchy(); + } - } + //rebuild the class hierarchy every time + this.isBuild = false; + this.isChanged = false; } diff --git a/src/fr/inrialpes/exmo/align/gen/TestGen.java b/src/fr/inrialpes/exmo/align/gen/TestGen.java index 18ad49cc84a701cb46045a99a4b8c9434dbc705a..e7ca9c7b6f85c613d0e54210e0f880739830dbe9 100644 --- a/src/fr/inrialpes/exmo/align/gen/TestGen.java +++ b/src/fr/inrialpes/exmo/align/gen/TestGen.java @@ -71,7 +71,7 @@ public class TestGen { params = new Properties(); longopts[0] = new LongOpt("method", LongOpt.REQUIRED_ARGUMENT, null, 'm'); - longopts[1] = new LongOpt("init", LongOpt.REQUIRED_ARGUMENT, null, 'i'); + longopts[1] = new LongOpt("initonto", LongOpt.REQUIRED_ARGUMENT, null, 'i'); longopts[2] = new LongOpt("help", LongOpt.NO_ARGUMENT, null, 'h'); longopts[3] = new LongOpt("testNumber", LongOpt.REQUIRED_ARGUMENT, null, 't'); longopts[4] = new LongOpt("debug", LongOpt.OPTIONAL_ARGUMENT, null, 'd'); @@ -140,12 +140,11 @@ public class TestGen { TestGenerator tg = new TestGenerator(); tg.modifyOntology( fileName, (Properties)null, testNumber, params ); } else if ( methodName.equals( GENERATE_BENCHMARK ) ) { //generate the benchmark - GenerateBenchmark gb = new GenerateBenchmark( fileName ); + BenchmarkGenerator gb = new BenchmarkGenerator(); gb.generate( params ); } } - public void printUsage() { System.out.println("TestGen [options]"); System.out.println("options are"); diff --git a/src/fr/inrialpes/exmo/align/gen/TestGenerator.java b/src/fr/inrialpes/exmo/align/gen/TestGenerator.java index fb6cfbb6a210597b2b8f2a76c78142510133deb3..c5bb6fb5ff44a665a401464367100eb75c10ec70 100644 --- a/src/fr/inrialpes/exmo/align/gen/TestGenerator.java +++ b/src/fr/inrialpes/exmo/align/gen/TestGenerator.java @@ -116,6 +116,8 @@ public class TestGenerator implements AlignedOntologyGenerator { //writes ontology public static void writeOntology( OntModel model, String destFile, String ns ) { + // JE: How to ensure that it generates the owl:Ontology close? + // Otherwise, some parsers cannot parse it correctly try { File f = new File( destFile ); FileOutputStream fout = new FileOutputStream( f ); @@ -169,14 +171,22 @@ public class TestGenerator implements AlignedOntologyGenerator { return modifyOntology( dirprefix+"/"+prevDirName+"/"+ontoname, al, crtDirName, p ); } + /** + * Generate a test by altering an existing test + */ + public Properties incrementModifyOntology( String prevTestDir, Properties al, String testDir, Properties params ) { + // JE: maybe ERROR crtDirName + return modifyOntology( dirprefix+"/"+prevTestDir+"/"+ontoname, al, testDir, params ); + } + //modifies an ontology /** * Generate a test from an ontology */ public Properties modifyOntology( String file, Properties al, String testNumber, Properties params) { - if ( debug ) System.err.println( "Source: "+file+" generate "+testNumber ); + if ( debug ) System.err.println( "Source: "+file+" Target "+testNumber ); //set the TestGenerator ontology - OntModel onto = loadOntology( file ); // who needs model? + OntModel onto = loadOntology( file ); //set the namespace setNamespace( getURI( testNumber ) ); Alignment align = null; @@ -189,13 +199,16 @@ public class TestGenerator implements AlignedOntologyGenerator { return modifier.getProperties(); } + // ******************************************************* GENERATOR //generate the alingnment - public Alignment generate( OntModel onto, Properties p, Properties initalign ) { - if ( debug ) System.err.println( urlprefix+" / "+dirprefix+" / "+ontoname+" / "+alignname ); - params = p; + public Alignment generate( OntModel onto, Properties params, Properties initalign ) { + if ( debug ) { + System.err.println( "[-------------------------------------------------]" ); + System.err.println( urlprefix+" / "+dirprefix+" / "+ontoname+" / "+alignname ); + } // Initialise the modifier class - modifier = new OntologyModifier( onto, new URIAlignment()); //build the ontology modifier for the first time + modifier = new OntologyModifier( onto, new URIAlignment() ); modifier.setNewNamespace( namespace ); // Initialize the reference alignment if ( initalign == null ) { @@ -205,10 +218,34 @@ public class TestGenerator implements AlignedOntologyGenerator { } // Apply all modifications - if ( debug ) System.out.println( "[-------------------------------------------------]" ); + /* + // JE: Here there is an obvious problems that the modifications are NOT applied in the specified order! + // Hence we should have a mega reordering of these parameter (for all of these, if they are here, do something) + // That would be better as a list in this case than parameters + // But parameters are more flexible... + applyModification( modifier, params, ParametersIds.REMOVE_CLASSES ); + applyModification( modifier, params, ParametersIds.REMOVE_PROPERTIES ); + applyModification( modifier, params, ParametersIds.REMOVE_COMMENTS ); + applyModification( modifier, params, ParametersIds.REMOVE_RESTRICTIONS ); + + applyModification( modifier, params, ParametersIds.ADD_CLASSES ); + applyModification( modifier, params, ParametersIds.ADD_PROPERTIES ); + + // SUPPRESSED FOR TESTING THAT THIS IS THE CULPRIT + //if ( params.getProperty( ParametersIds.ADD_CLASSES ) == null ) applyModification( modifier, params, ParametersIds.RENAME_CLASSES ); + applyModification( modifier, params, ParametersIds.RENAME_CLASSES ); + applyModification( modifier, params, ParametersIds.RENAME_PROPERTIES ); + // UNTIL HERE, WE USE THE DOCUMENTED ORDER + + applyModification( modifier, params, ParametersIds.REMOVE_CLASSESLEVEL ); + applyModification( modifier, params, ParametersIds.LEVEL_FLATTENED ); + applyModification( modifier, params, ParametersIds.NO_HIERARCHY ); + applyModification( modifier, params, ParametersIds.ADD_CLASSESLEVEL ); + applyModification( modifier, params, ParametersIds.REMOVE_INDIVIDUALS ); + */ for( String key : params.stringPropertyNames() ) { String value = params.getProperty(key); - if ( debug ) System.out.println( "[" +key + "] => [" + value + "]"); + //if ( debug ) System.out.println( "[" +key + "] => [" + value + "]"); modifier.modifyOntology( key, value ); //modify the ontology according to it } @@ -222,4 +259,9 @@ public class TestGenerator implements AlignedOntologyGenerator { public Alignment generate( OntModel onto, Properties p ) { return generate( onto, p, (Properties)null ); } + + public void applyModification( OntologyModifier modifier, Properties p, String m ) { + modifier.modifyOntology( m, p.getProperty( m ) ); + } } + diff --git a/src/fr/inrialpes/exmo/align/gen/TestSet.java b/src/fr/inrialpes/exmo/align/gen/TestSet.java new file mode 100644 index 0000000000000000000000000000000000000000..e6ab04610a5991231b56cd72fb0771d39a7c05f4 --- /dev/null +++ b/src/fr/inrialpes/exmo/align/gen/TestSet.java @@ -0,0 +1,184 @@ +/* + * $Id$ + * + * Copyright (C) 2011, INRIA + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public License + * as published by the Free Software Foundation; either version 2.1 of + * the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 + * USA. + */ + +/* + * This class describes a test set (such as the benchmark test set of OAEI) + * It is described as a hierarchy of test cases which can be generated from one another + * This class is an abstract + * Generates the OAEI Benchmark dataset from an ontology + * It can generate it in a continuous way (each test build on top of a previous one) + * or generate tests independently. + * + * Variations can also be obtained. + */ + +package fr.inrialpes.exmo.align.gen; + +import java.util.Properties; +import java.util.HashMap; +import java.util.Set; +import java.util.HashSet; + +public abstract class TestSet { + + private String initOntoFile; //the initial ontology file + protected boolean continuous = false; + protected boolean debug = false; + + private TestGenerator generator; // a TestGenerator + + protected TestCase root; + protected HashMap<String,TestCase> tests; + static String FULL = "1.0f"; + + public TestSet() { + generator = new TestGenerator(); + tests = new HashMap<String,TestCase>(); + } + + public void addTestChild( String from, String name, Properties params ) { + addTestChild( tests.get( from ), name, params ); + } + public void addTestChild( TestCase father, String name, Properties params ) { + //System.err.println( name + " ["+father+"]" ); + TestCase c = father.addSubTest( name, params ); + tests.put( name, c ); + } + public TestCase initTests( String name ) { + TestCase c = TestCase.initTestTree( name ); + tests.put( name, c ); + return c; + } + + public Properties newProperties( String k, String v, String k2, String v2 ) { + Properties p = newProperties( k2, v2 ); + p.setProperty( k, v ); + return p; + } + public Properties newProperties( String k, String v ) { + Properties p = new Properties(); + p.setProperty( k, v ); + return p; + } + + // ---------------------------------------------------------- + // Declare test generation tree + public abstract void initTestCases( Properties params ); + + // ---------------------------------------------------------- + // Generates the test set + public void generate( Properties params ) { + // Initialises test cases tree + initTestCases( params ); + // Print it + if ( debug ) printTestHierarchy( root, 0 ); + // Generator parameters... are these OK? + generator.setDebug( debug ); + initOntoFile = params.getProperty( "filename" ); // If no filename error + if ( params.getProperty( "urlprefix" ) != null ) generator.setURLPrefix( params.getProperty( "urlprefix" ) ); + if ( params.getProperty( "outdir" ) != null ) generator.setDirPrefix( params.getProperty( "outdir" ) ); + if ( params.getProperty( "continuous" ) != null ) continuous = true; + String ontoname = params.getProperty( "ontoname" ); + if ( ontoname != null ) { + generator.setOntoFilename( params.getProperty( "ontoname" ) ); + } else { + ontoname = "onto.rdf"; // could be better + } + if ( params.getProperty( "alignname" ) != null ) generator.setAlignFilename( params.getProperty( "alignname" ) ); + // Generate all tests + startTestGeneration(); + } + + // Recursively generate tests + public void startTestGeneration() { + Properties newalign; + newalign = generator.modifyOntology( initOntoFile, (Properties)null, root.name, new Properties() ); + for ( TestCase sub : root.subTests ) { + generateTest( sub, newalign ); + } + } + + public void generateTest( TestCase c, Properties align ) { + Properties newalign; + if ( continuous ) { + newalign = generator.incrementModifyOntology( c.father.name, (Properties)align.clone(), c.name, c.parameters ); + } else { + newalign = generator.modifyOntology( initOntoFile, (Properties)null, c.name, c.cumulated ); + } + for ( TestCase sub : c.subTests ) { + generateTest( sub, newalign ); + } + } + + public void printTestHierarchy( TestCase c, int level ) { + for ( int i = 0; i < level; i++ ) System.out.print( " " ); + System.out.print( c.name+" [" ); + for ( Object k : c.cumulated.keySet() ) { + System.out.print( " "+k+"="+c.cumulated.getProperty( (String)k )+";" ); + } + System.out.println( " ]" ); + for ( TestCase sub : c.subTests ) printTestHierarchy( sub, level+1 ); + } +} + +class TestCase { + public String name = null; // test name = directory + public TestCase father = null; // test this one is generated from + public Properties parameters = null; // new modifications to apply + public Properties cumulated = null; // cummulated modifications from root + public Set<TestCase> subTests = null; // tests derived from this one + + public TestCase(){ + subTests = new HashSet<TestCase>(); + } + + public TestCase( String n ){ + subTests = new HashSet<TestCase>(); + name = n; + } + + public TestCase( String n, Properties p ){ + subTests = new HashSet<TestCase>(); + name = n; + parameters = p; + } + + public TestCase addSubTest( String name, Properties params ) { + TestCase t = new TestCase( name, params ); + // Add the diferential parameters (eventually) + t.father = this; + subTests.add( t ); + t.cumulated = (Properties)cumulated.clone(); + for ( Object k : params.keySet() ) { + t.cumulated.setProperty( (String)k, params.getProperty( (String)k ) ); + } + return t; + } + + public static TestCase initTestTree( String n ) { + TestCase c = new TestCase( n ); + c.cumulated = new Properties(); + return c; + } + +} + +