diff --git a/src/fr/inrialpes/exmo/align/gen/ArbitraryTest.java b/src/fr/inrialpes/exmo/align/gen/ArbitraryTest.java deleted file mode 100644 index bcb870d0d23fd64a4cf0af666f3179b2dfa11ddd..0000000000000000000000000000000000000000 --- a/src/fr/inrialpes/exmo/align/gen/ArbitraryTest.java +++ /dev/null @@ -1,161 +0,0 @@ -/* - * $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. - */ - -/* - * Generates an arbitrary test. - * The days of this class are counted: it is highly redundant with the first part of - * GenerateBenchmark and should be merged with TestGenerator. - */ - -package fr.inrialpes.exmo.align.gen; - -//Java classes -import java.io.FileOutputStream; -import java.io.InputStream; -import java.io.File; -import java.io.OutputStreamWriter; -import java.io.BufferedWriter; -import java.io.IOException; -import java.io.OutputStream; -import java.io.PrintWriter; -import java.nio.charset.Charset; -import java.util.Properties; - -//Jena API classes -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.rdf.model.RDFWriter; -import com.hp.hpl.jena.util.FileManager; - -// Alignment API implementation classes -import fr.inrialpes.exmo.align.impl.renderer.RDFRendererVisitor; -import fr.inrialpes.exmo.ontowrap.jena25.JENAOntology; - -import org.semanticweb.owl.align.Alignment; -import org.semanticweb.owl.align.AlignmentVisitor; - -public class ArbitraryTest { - //private String fileName; //the initial file - //private String testNumber; //the test number - //private Properties parameters; //the parameters - public final String namespace = "http://oaei.ontologymatching.org/2011/gen/"; - - //constructor - public ArbitraryTest() { - //this.fileName = fileName; - //this.testNumber = testNumber; - //parameters = params; - } - - //get the prefix to build the namespace - public String getPrefix( String fileName ) { - return fileName.substring(0, fileName.lastIndexOf(".")); - } - - //get the uri - public String getURI( String fileName, String testNumber ) { - return this.namespace + getPrefix(fileName) + "/" + testNumber + "/" + fileName + "#"; - } - - //load ontology - public OntModel loadOntology ( String fileName ) { - InputStream in = FileManager.get().open( fileName ); - OntModel model = ModelFactory.createOntologyModel( OntModelSpec.OWL_MEM ); - model.read( in, null ); - return model; - } - - //write ontology - public static void writeOntology( OntModel model, String destFile, String ns ) { - try { - File f = new File(destFile); - FileOutputStream fout = new FileOutputStream(f); - Charset defaultCharset = Charset.forName("UTF8"); - RDFWriter writer = model.getWriter("RDF/XML-ABBREV"); - writer.setProperty("showXmlDeclaration","true"); - model.setNsPrefix("", ns); - - model.createOntology(ns); - - writer.setProperty( "xmlbase", ns ); - writer.write(model.getBaseModel(), new OutputStreamWriter(fout, defaultCharset), ""); - fout.close(); - } catch (Exception ex) { - System.err.println("Exception " + ex.getMessage()); - } - } - - // JE: >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> THE REAL STUFF - - // JE: >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> WE SHOULD HAVE INCREMENTAL HERE IN THE SAME WAY! - - //modify ontology - public void modifyOntology( String fileName, String testNumber, Properties params ) { - //modify the model - try { - OntModel model = loadOntology(fileName); //load the initial ontology - JENAOntology onto = new JENAOntology(); //cast the model into Ontology - onto.setOntology( (OntModel)model ); - //set the TestGenerator ontology - TestGenerator t = new TestGenerator(); //build an instance of TestGenerator - t.setOntology(onto); - //set the namespace - t.setNamespace( getURI( fileName, testNumber) ); - //t.setNamespace( "http://oaei.ontologymatching.org/2011/gen/onto/101/onto.rdf#" ); - - Alignment align = t.generate( onto, params ); //generate the alignment - - JENAOntology modified = (JENAOntology)t.getModifiedOntology(); //get the modified ontology - - - //build the directory to save the file - boolean create; - create = new File(testNumber).mkdir(); - if ( create ) System.err.println(" Succesufully created the directory "); - else System.err.println(" Error creating the directory "); - - //new File(testNumber).mkdir(); - //write the ontology into the directory - if ( modified.getOntology() instanceof OntModel ) - writeOntology(modified.getOntology(), testNumber + "/" + fileName, getURI( fileName, testNumber )); //write the ontology - //write the alignment into the directory - OutputStream stream = new FileOutputStream( testNumber + "/" + "refalign.rdf" ); - // Outputing - PrintWriter writer = new PrintWriter ( - new BufferedWriter( - new OutputStreamWriter( stream, "UTF-8" )), true); - AlignmentVisitor renderer = new RDFRendererVisitor( writer ); - align.render(renderer); - writer.flush(); - writer.close(); - } - catch ( Exception ex ) { - System.err.println( "Error " + ex.getMessage() ); - } - - System.err.println( "***" ); - System.err.println( "END" ); - System.err.println( "***" ); - } - - -} diff --git a/src/fr/inrialpes/exmo/align/gen/GenerateBenchmark.java b/src/fr/inrialpes/exmo/align/gen/GenerateBenchmark.java index e6d9f0f780d0bd7cfed520f1a4e44226cc62a0ff..8fc037108030f668d0f15ab8818301912bdad791 100644 --- a/src/fr/inrialpes/exmo/align/gen/GenerateBenchmark.java +++ b/src/fr/inrialpes/exmo/align/gen/GenerateBenchmark.java @@ -29,182 +29,50 @@ package fr.inrialpes.exmo.align.gen; -//Java classes -import java.io.FileOutputStream; -import java.io.InputStream; -import java.io.File; -import java.io.BufferedWriter; -import java.io.IOException; -import java.io.OutputStream; -import java.io.PrintWriter; -import java.io.OutputStreamWriter; -import java.nio.charset.Charset; import java.util.Properties; -//Jena API classes -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.rdf.model.RDFWriter; -import com.hp.hpl.jena.util.FileManager; - -// Alignment API implementation classes -import fr.inrialpes.exmo.align.impl.renderer.RDFRendererVisitor; -import fr.inrialpes.exmo.ontowrap.jena25.JENAOntology; - -import org.semanticweb.owl.align.Alignment; -import org.semanticweb.owl.align.AlignmentVisitor; - public class GenerateBenchmark { - private String urlprefix = "http://example.com/"; // Prefix (before testnumber) of test URL - private String dirprefix = ""; // Prefix (idem) of directory - private String filename = "onto.rdf"; // name of ontology to generate - private String alignname = "refalign.rdf"; // name of alignment to generate - - private String fileName; //the initial file - //private String testNumber; //the test number - private Properties parameters; //the parameters - public final String namespace = "http://oaei.ontologymatching.org/2011/gen/"; - private TestGenerator generator; //build an instance of TestGenerator + + 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 GenerateBenchmark( String fileName ) { - this.fileName = fileName; + initOntoFile = fileName; generator = new TestGenerator(); } - //gets the URI - public String getURI( String testNumber ) { - return urlprefix + "/" + testNumber + "/" + filename + "#"; // Do not like this #... - //return urlprefix + getPrefix(fileName) + "/" + testNumber + "/" + fileName + "#"; - } - - private String directoryName( String dir, String suffix ) { - if ( suffix == null ) return dir; - else return dir+"-"+suffix; - } - - //loads ontology - public OntModel loadOntology ( String file ) { - InputStream in = FileManager.get().open( file ); - OntModel model = ModelFactory.createOntologyModel( OntModelSpec.OWL_MEM ); - model.read( in, null ); - return model; - } - - //writes ontology - public static void writeOntology( OntModel model, String destFile, String ns ) { - try { - File f = new File( destFile ); - FileOutputStream fout = new FileOutputStream( f ); - Charset defaultCharset = Charset.forName("UTF8"); - RDFWriter writer = model.getWriter("RDF/XML-ABBREV"); - writer.setProperty( "showXmlDeclaration","true" ); - model.setNsPrefix( "", ns ); - model.createOntology(ns); - - writer.setProperty( "xmlbase", ns ); - writer.write(model.getBaseModel(), new OutputStreamWriter(fout, defaultCharset), ""); - fout.close(); - } catch (Exception ex) { - ex.printStackTrace(); - } - } - - private void outputTestDirectory( JENAOntology onto, Alignment align, String testnumber, Properties params ) { - // build the directory to save the file - boolean create = new File( dirprefix+"/"+testnumber ).mkdir(); - /* if ( create ) System.err.println(" Succesufully created the directory "); - else System.err.println(" Error creating the directory "); */ - - // write the ontology into the directory - if ( onto.getOntology() instanceof OntModel ) - writeOntology( onto.getOntology(), dirprefix+"/"+testnumber+"/"+filename, getURI( testnumber )); - - try { - //write the alignment into the directory - OutputStream stream = new FileOutputStream( dirprefix+"/"+testnumber+"/"+alignname ); - // Outputing - PrintWriter writer = new PrintWriter ( - new BufferedWriter( - new OutputStreamWriter( stream, "UTF-8" )), true); - AlignmentVisitor renderer = new RDFRendererVisitor( writer ); - align.render( renderer ); - writer.flush(); - writer.close(); - } catch ( Exception ex ) { - ex.printStackTrace(); - } - } - - //modifies an ontology - public Properties modifyOntology( String file, String testNumber, Properties params) { - System.err.println( "Source: "+file+" generate "+testNumber ); - //modify the model - if ( debug ) System.err.println( "From test " + file ); - if ( debug ) System.err.println( "Test " + testNumber ); - OntModel model = loadOntology( file ); //load the initial ontology - JENAOntology onto = new JENAOntology(); //cast the model into Ontology - onto.setOntology( (OntModel)model ); - //set the TestGenerator ontology - generator.setOntology( onto ); - //set the namespace - generator.setNamespace( getURI( testNumber ) ); - Alignment align = null; - if ( file.equals(this.fileName) ) // JE: In my opinion this test is tricky... (and all should be in params) - align = generator.generate( onto, params ); //generate the alignment - else - align = generator.generate( onto, params, parameters ); //generate the alignment - - JENAOntology modified = (JENAOntology)generator.getModifiedOntology(); //get the modified ontology - - outputTestDirectory( modified, align, testNumber, params ); - //retrieve the parameters - //parameters = generator.getParameters(); - return generator.getParameters(); - } - - //modifies an ontology from an existing test - public Properties incrementModifyOntology( String pKey, String pVal, String suffix, String prevTest, String testNb ) { - Properties p = new Properties(); - p.setProperty( pKey, pVal ); - String prevDirName = directoryName( prevTest, suffix ); - String crtDirName = directoryName( testNb, suffix ); - return modifyOntology( dirprefix+"/"+prevDirName+"/"+this.fileName, crtDirName, p ); - } - - //generates the Benchmark public void generate( Properties params ) { // Process params - if ( params.getProperty( "urlprefix" ) != null ) urlprefix = params.getProperty( "urlprefix" ); - if ( params.getProperty( "outdir" )!= null ) dirprefix = params.getProperty( "outdir" ); - if ( params.getProperty( "filename" ) != null ) filename = params.getProperty( "filename" ); - if ( params.getProperty( "alignname" ) != null ) alignname = params.getProperty( "alignname" ); + 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" ) ); - System.err.println( urlprefix+" / "+dirprefix+" / "+filename+" / "+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 ) - // JE: All this should have been solved before - - //keep track of the alignment - Properties paramsRenameResources; Properties paramsNoComments; - Properties paramsNoInstance; Properties paramsNoProperty; - Properties paramsFlatten; Properties paramsExpand; - Properties paramsInitial; + Properties alignRenameResources; + Properties alignInitial; Properties p = new Properties(); //modify the ontology according to this parameters - this.parameters = new Properties(); String prevDirName; - String crtDirName; String mod = params.getProperty( "modality" ); // "mult" String hard = params.getProperty( "increment" ); @@ -213,28 +81,21 @@ public class GenerateBenchmark { String SUFFIX = null; - // JE : >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> SO FAR SO GOOD /* * Test 101 - * Here it would be good to change the : + * Generate the initial situation */ - parameters = modifyOntology( fileName, "101", p ); // JE ~~> The strange thing: it will generate the init - // Because it calls with the "p", this is the second case, - // Where the initial alignment is generated - paramsInitial = (Properties)parameters.clone(); - paramsRenameResources = (Properties)parameters.clone(); + align = generator.modifyOntology( initOntoFile, (Properties)null, "101", p ); + alignInitial = (Properties)align.clone(); + alignRenameResources = (Properties)align.clone(); prevDirName = "101"+"/"; /* * Tests 201, 202, 248, 249, 253, 258, 259, 250, 254, * 262, 257, 260, 265, 261, 266, 251, 252 */ - // Increment from 20 to 20 - //for ( float i1=0.20f; i1<=1.00f; i1+=0.20f ) { - // Increment from x to remaining // JE: look at the (Float).toString() below... boolean multModality = (mod != null && mod.startsWith( "mult" )); - //float i1 = 0.20f; float i1 = 0.0f; int maximum = Integer.parseInt( "5" ); float incr = Float.parseFloat( "0.2" ); @@ -244,9 +105,9 @@ public class GenerateBenchmark { ex.printStackTrace(); // continue with the default } for ( int i = 0; i1 < 1.00f ; i++ ) { // && i < maximum - //System.err.println( " **************************** "+i+": i1 = "+i1 ); if ( !multModality ) i1 += incr; // traditional else i1 += (1. - i1) * incr; // hardened + if ( debug ) System.err.println( " ******************************************************** "+i+": i1 = "+i1 ); if ( i1 < 1.0f ) { SUFFIX = ((Float)i1).toString().substring(2, 3); @@ -259,136 +120,139 @@ public class GenerateBenchmark { p = new Properties(); p.setProperty( ParametersIds.RENAME_CLASSES, ((Float)i1).toString() ); p.setProperty( ParametersIds.RENAME_PROPERTIES, ((Float)i1).toString() ); - parameters = modifyOntology( dirprefix+"/"+prevDirName+this.fileName, directoryName( "201", SUFFIX ), p); + // 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 */ - parameters = incrementModifyOntology( ParametersIds.REMOVE_COMMENTS, FULL, SUFFIX, "201", "202" ); + align = generator.incrementModifyOntology( ParametersIds.REMOVE_COMMENTS, FULL, SUFFIX, "201", align, "202" ); /* 248-x *** no names + no comments + no hierarchy */ - parameters = incrementModifyOntology( ParametersIds.NO_HIERARCHY, ParametersIds.NO_HIERARCHY, SUFFIX, "202", "248" ); + align = generator.incrementModifyOntology( ParametersIds.NO_HIERARCHY, ParametersIds.NO_HIERARCHY, SUFFIX, "202", align, "248" ); /* 253-x *** no names + no comments + no hierarchy + no instance */ - parameters = incrementModifyOntology( ParametersIds.REMOVE_INDIVIDUALS, FULL, SUFFIX, "248", "253" ); + align = generator.incrementModifyOntology( ParametersIds.REMOVE_INDIVIDUALS, FULL, SUFFIX, "248", align, "253" ); /* 249-x *** no names + no comments + no instance */ - parameters = incrementModifyOntology( ParametersIds.REMOVE_INDIVIDUALS, FULL, SUFFIX, "202", "249" ); + align = generator.incrementModifyOntology( ParametersIds.REMOVE_INDIVIDUALS, FULL, SUFFIX, "202", align, "249" ); ////get the parameters - paramsRenameResources = (Properties)this.parameters.clone(); + alignRenameResources = (Properties)align.clone(); /* 250-x *** no names + no comments + no property */ - parameters = incrementModifyOntology( ParametersIds.REMOVE_PROPERTIES, FULL, SUFFIX, "202", "250" ); + align = generator.incrementModifyOntology( ParametersIds.REMOVE_PROPERTIES, FULL, SUFFIX, "202", align, "250" ); /* 254-x *** no names + no comments + no property + no hierarchy */ - parameters = incrementModifyOntology( ParametersIds.NO_HIERARCHY, ParametersIds.NO_HIERARCHY, SUFFIX, "250", "254" ); + 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 */ - parameters = incrementModifyOntology( ParametersIds.REMOVE_INDIVIDUALS, FULL, SUFFIX, "254", "262" ); + align = generator.incrementModifyOntology( ParametersIds.REMOVE_INDIVIDUALS, FULL, SUFFIX, "254", align, "262" ); /* 257-x *** no names + no comments + no property + no instance */ - parameters = incrementModifyOntology( ParametersIds.REMOVE_INDIVIDUALS, FULL, SUFFIX, "250", "257" ); + align = generator.incrementModifyOntology( ParametersIds.REMOVE_INDIVIDUALS, FULL, SUFFIX, "250", align, "257" ); /* 261-x *** no names + no comments + no property + expand */ - parameters = incrementModifyOntology( ParametersIds.ADD_CLASSES, FULL, SUFFIX, "250", "261" ); + align = generator.incrementModifyOntology( ParametersIds.ADD_CLASSES, FULL, SUFFIX, "250", align, "261" ); /* 266-x *** no names + no comments + no property + expand + no instance */ - parameters = incrementModifyOntology( ParametersIds.REMOVE_INDIVIDUALS, FULL, SUFFIX, "261", "266" ); + align = generator.incrementModifyOntology( ParametersIds.REMOVE_INDIVIDUALS, FULL, SUFFIX, "261", align, "266" ); /* 260-x *** no names + no comments + no property + flatten */ - parameters = incrementModifyOntology( ParametersIds.LEVEL_FLATTENED, "2", SUFFIX, "250", "260" ); + align = generator.incrementModifyOntology( ParametersIds.LEVEL_FLATTENED, "2", SUFFIX, "250", align, "260" ); /* 265-x *** no names + no comments + no property + flatten + no instance */ - parameters = incrementModifyOntology( ParametersIds.REMOVE_INDIVIDUALS, FULL, SUFFIX, "260", "265" ); + align = generator.incrementModifyOntology( ParametersIds.REMOVE_INDIVIDUALS, FULL, SUFFIX, "260", align, "265" ); //re-establish the parameters - parameters = (Properties)paramsRenameResources.clone(); + align = (Properties)alignRenameResources.clone(); /* 251-x *** no names + no comments + flatten */ - parameters = incrementModifyOntology( ParametersIds.LEVEL_FLATTENED, "2", SUFFIX, "202", "251" ); + align = generator.incrementModifyOntology( ParametersIds.LEVEL_FLATTENED, "2", SUFFIX, "202", align, "251" ); /* 258-x *** no names + no comments + flatten + no instance */ - parameters = incrementModifyOntology( ParametersIds.REMOVE_INDIVIDUALS, FULL, SUFFIX, "251", "258" ); + align = generator.incrementModifyOntology( ParametersIds.REMOVE_INDIVIDUALS, FULL, SUFFIX, "251", align, "258" ); //re-establish the parameters - parameters = (Properties)paramsRenameResources.clone(); + align = (Properties)alignRenameResources.clone(); /* 252-x *** no names + no comments + expand */ - parameters = incrementModifyOntology( ParametersIds.ADD_CLASSES, FULL, SUFFIX, "202", "252" ); + align = generator.incrementModifyOntology( ParametersIds.ADD_CLASSES, FULL, SUFFIX, "202", align, "252" ); /* 259-x *** no names + no comments + expand + no instance */ - parameters = incrementModifyOntology( ParametersIds.REMOVE_INDIVIDUALS, FULL, SUFFIX, "252", "259" ); + align = generator.incrementModifyOntology( ParametersIds.REMOVE_INDIVIDUALS, FULL, SUFFIX, "252", align, "259" ); -// paramsNoProperty = modifier.getProperties(); //get the modifed properties +// alignNoProperty = modifier.getProperties(); //get the modifed properties - parameters = (Properties)paramsRenameResources.clone(); - prevDirName = directoryName( "201", SUFFIX ) + "/"; + align = (Properties)alignRenameResources.clone(); + prevDirName = generator.directoryName( "201", SUFFIX ) + "/"; } //re-establish the parameters SUFFIX = null; - parameters = (Properties)paramsInitial.clone(); + align = (Properties)alignInitial.clone(); /* Tests 221, 232, 233, 241 */ /* 221 *** no hierarchy */ - parameters = incrementModifyOntology( ParametersIds.NO_HIERARCHY, ParametersIds.NO_HIERARCHY, SUFFIX, "101", "221" ); + align = generator.incrementModifyOntology( ParametersIds.NO_HIERARCHY, ParametersIds.NO_HIERARCHY, SUFFIX, "101", align, "221" ); /* 232 *** no hierarchy + no instance */ - parameters = incrementModifyOntology( ParametersIds.REMOVE_INDIVIDUALS, FULL, SUFFIX, "221", "232" ); + align = generator.incrementModifyOntology( ParametersIds.REMOVE_INDIVIDUALS, FULL, SUFFIX, "221", align, "232" ); /* 233 *** no hierarchy + no property */ - parameters = incrementModifyOntology( ParametersIds.REMOVE_PROPERTIES, FULL, SUFFIX, "221", "233" ); + align = generator.incrementModifyOntology( ParametersIds.REMOVE_PROPERTIES, FULL, SUFFIX, "221", align, "233" ); /* 241 *** no hierarchy + no property + no instance */ - parameters = incrementModifyOntology( ParametersIds.REMOVE_INDIVIDUALS, FULL, SUFFIX, "233", "241" ); + align = generator.incrementModifyOntology( ParametersIds.REMOVE_INDIVIDUALS, FULL, SUFFIX, "233", align, "241" ); - //re-establish the parameters - parameters = (Properties)paramsInitial.clone(); + //re-establish the align + align = (Properties)alignInitial.clone(); /* Tests 222, 237 */ /* 222 *** flatten */ - parameters = incrementModifyOntology( ParametersIds.LEVEL_FLATTENED, "2", SUFFIX, "101", "222" ); + align = generator.incrementModifyOntology( ParametersIds.LEVEL_FLATTENED, "2", SUFFIX, "101", align, "222" ); /* 237 *** flatten + no instance */ - parameters = incrementModifyOntology( ParametersIds.REMOVE_INDIVIDUALS, FULL, SUFFIX, "222", "237" ); + align = generator.incrementModifyOntology( ParametersIds.REMOVE_INDIVIDUALS, FULL, SUFFIX, "222", align, "237" ); //re-establish the parameters - parameters = (Properties)paramsInitial.clone(); + align = (Properties)alignInitial.clone(); /* Tests 223, 238 */ /* 223 *** expand */ - parameters = incrementModifyOntology( ParametersIds.ADD_CLASSES, FULL, SUFFIX, "101", "223" ); + align = generator.incrementModifyOntology( ParametersIds.ADD_CLASSES, FULL, SUFFIX, "101", align, "223" ); /* 238 *** expand + no instance */ - parameters = incrementModifyOntology( ParametersIds.REMOVE_INDIVIDUALS, FULL, SUFFIX, "223", "238" ); + align = generator.incrementModifyOntology( ParametersIds.REMOVE_INDIVIDUALS, FULL, SUFFIX, "223", align, "238" ); /* 224 *** no instance */ - parameters = incrementModifyOntology( ParametersIds.REMOVE_INDIVIDUALS, FULL, SUFFIX, "101", "224" ); + align = generator.incrementModifyOntology( ParametersIds.REMOVE_INDIVIDUALS, FULL, SUFFIX, "101", align, "224" ); /* 225 *** no restrictions */ - parameters = incrementModifyOntology( ParametersIds.REMOVE_RESTRICTIONS, FULL, SUFFIX, "101", "225" ); + align = generator.incrementModifyOntology( ParametersIds.REMOVE_RESTRICTIONS, FULL, SUFFIX, "101", align, "225" ); /* Tests 228, 239, 246, 236, 240, 247 */ /* 228 *** no property */ - parameters = incrementModifyOntology( ParametersIds.REMOVE_PROPERTIES, FULL, SUFFIX, "101", "228" ); + align = generator.incrementModifyOntology( ParametersIds.REMOVE_PROPERTIES, FULL, SUFFIX, "101", align, "228" ); /* 236 *** no property + no instance */ - parameters = incrementModifyOntology( ParametersIds.REMOVE_INDIVIDUALS, FULL, SUFFIX, "228", "236" ); + align = generator.incrementModifyOntology( ParametersIds.REMOVE_INDIVIDUALS, FULL, SUFFIX, "228", align, "236" ); /* 240 *** no property + expand */ - parameters = incrementModifyOntology( ParametersIds.ADD_CLASSES, FULL, SUFFIX, "228", "240" ); + align = generator.incrementModifyOntology( ParametersIds.ADD_CLASSES, FULL, SUFFIX, "228", align, "240" ); /* 247 *** no property + expand + no instance */ - parameters = incrementModifyOntology( ParametersIds.REMOVE_INDIVIDUALS, FULL, SUFFIX, "240", "247" ); + align = generator.incrementModifyOntology( ParametersIds.REMOVE_INDIVIDUALS, FULL, SUFFIX, "240", align, "247" ); /* 239 *** no property + flatten */ - parameters = incrementModifyOntology( ParametersIds.LEVEL_FLATTENED, FULL, SUFFIX, "228", "239" ); + align = generator.incrementModifyOntology( ParametersIds.LEVEL_FLATTENED, FULL, SUFFIX, "228", align, "239" ); /* 246 *** no property + flatten + no instance */ - parameters = incrementModifyOntology( ParametersIds.REMOVE_INDIVIDUALS, FULL, SUFFIX, "239", "246" ); + 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 87bbbbed7666168f67449a63748edba35ef8d433..324223c92f47ed9dcd1f8c1d188c13147f5852f1 100644 --- a/src/fr/inrialpes/exmo/align/gen/OntologyModifier.java +++ b/src/fr/inrialpes/exmo/align/gen/OntologyModifier.java @@ -88,6 +88,7 @@ import edu.smu.tspell.wordnet.WordNetDatabase; public class OntologyModifier { private ClassHierarchy classHierarchy; //the class hierarchy + // JE: In all this class, model is useless! private OntModel model; //the model - the original Ontology private OntModel modifiedModel; //the modified Ontology private String namespace; //the Namespace @@ -95,15 +96,15 @@ public class OntologyModifier { private Alignment alignment; //the alignment of the two Ontologies private Properties params; //the alignment private boolean isBuild; //keep track if the class hierarchy is build - private boolean isAlign; //keep track it the initial alignment has already been computed + private boolean isAlign; //keep track if the initial alignment has already been computed private boolean isChanged; //keep track if the namespace of the new ontology is changed - public static String fileName = "refalign.rdf"; //the reference alignment private String base; // //Ontology init, Ontology modified, Alignment align - public OntologyModifier ( OntModel model, OntModel modifiedModel, Alignment alignment ) { + // 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 = modifiedModel; + this.modifiedModel = model; this.alignment = alignment; this.isBuild = false; this.isAlign = false; @@ -1315,7 +1316,22 @@ public class OntologyModifier { res.remove(); } + // isAlign is a not so good way to test initialisation + // (initialisation with an empty Properties is done in the initialiser) + // but the "params" is used everywhere... + //the initial reference alignment + // JE: !!!: no order guarantee in properties !!! + public void initializeAlignment( Properties params ) { + this.params = params; + + Enumeration e = this.params.propertyNames(); + String aux = (String)e.nextElement(); + base = aux.substring(0, aux.lastIndexOf("#")+1); + + this.isAlign = true; + } + public void initializeAlignment() { List<OntClass> classes = this.modifiedModel.listNamedClasses().toList();//all classes List<OntProperty> properties = this.modifiedModel.listAllOntProperties().toList();//all properties @@ -1360,29 +1376,6 @@ public class OntologyModifier { //System.out.println( "[" + key + "][" + value + "]" ); this.alignment.addAlignCell( uri1, uri2, "=", 1 ); } - - /* - OutputStream stream ;//= new FileOutputStream(filename); - if ( fileName == null ) { - stream = System.out; - } else { - stream = new FileOutputStream( fileName ); - } - - // Outputing - PrintWriter writer = new PrintWriter ( - new BufferedWriter( - new OutputStreamWriter( stream, "UTF-8" )), true); - AlignmentVisitor renderer = new RDFRendererVisitor( writer ); - this.alignment.render(renderer); - - //RDFRendererVisitor renderer = new RDFRendererVisitor(writer); - //renderer.visit(this.alignment); - - writer.flush(); - writer.close(); - * - */ } catch (AlignmentException aex) { System.out.println( "Exception " + aex.getMessage() ); } catch (Exception ex) { System.err.println("Exception " + ex.getMessage()); } @@ -1499,16 +1492,6 @@ public class OntologyModifier { return this.params; } - public void setProperties( Properties params ) { - this.params = params; - - Enumeration e = this.params.propertyNames(); - String aux = (String)e.nextElement(); - base = aux.substring(0, aux.lastIndexOf("#")+1); - - this.isAlign = true; - } - //returns the alignment public Alignment getAlignment() { return this.alignment; diff --git a/src/fr/inrialpes/exmo/align/gen/TestGen.java b/src/fr/inrialpes/exmo/align/gen/TestGen.java index ce4894bee1f9739bbf4ca55fe197a0691fdf0254..18ad49cc84a701cb46045a99a4b8c9434dbc705a 100644 --- a/src/fr/inrialpes/exmo/align/gen/TestGen.java +++ b/src/fr/inrialpes/exmo/align/gen/TestGen.java @@ -67,20 +67,22 @@ public class TestGen { } public void run(String[] args) throws Exception { - LongOpt[] longopts = new LongOpt[8]; + LongOpt[] longopts = new LongOpt[10]; params = new Properties(); longopts[0] = new LongOpt("method", LongOpt.REQUIRED_ARGUMENT, null, 'm'); - longopts[1] = new LongOpt("fileName", LongOpt.REQUIRED_ARGUMENT, null, 'n'); + longopts[1] = new LongOpt("init", 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'); longopts[5] = new LongOpt("outdir", LongOpt.REQUIRED_ARGUMENT, null, 'o'); longopts[6] = new LongOpt("urlprefix", LongOpt.REQUIRED_ARGUMENT, null, 'u'); - longopts[7] = new LongOpt("D", LongOpt.REQUIRED_ARGUMENT, null, 'D'); + longopts[7] = new LongOpt("ontoname", LongOpt.REQUIRED_ARGUMENT, null, 'n'); + longopts[8] = new LongOpt("alignname", LongOpt.REQUIRED_ARGUMENT, null, 'a'); + longopts[9] = new LongOpt("D", LongOpt.REQUIRED_ARGUMENT, null, 'D'); - Getopt g = new Getopt("", args, "d::o:u:h:m:n:D:t", longopts); + Getopt g = new Getopt("", args, "d::o:u:h:m:n:i:a:D:t", longopts); int c; String arg; @@ -93,31 +95,33 @@ public class TestGen { methodName = g.getOptarg(); System.err.println("method " + "[" + methodName + "]"); break; - case 'n': + case 'i': fileName = g.getOptarg(); params.setProperty( "filename", fileName ); System.err.println("fileName " + "[" + fileName + "]"); break; + case 'n': + params.setProperty( "ontoname", g.getOptarg() ); + break; + case 'a': + params.setProperty( "alignname", g.getOptarg() ); + break; case 't': testNumber = g.getOptarg(); System.err.println("testNumber " + "[" + testNumber + "]"); break; - case 'o' : - /* Use output directory */ + case 'o' : /* Use output directory */ params.setProperty( "outdir", g.getOptarg() ); break; - case 'u' : - /* URLPrefix */ + case 'u' : /* URLPrefix */ params.setProperty( "urlprefix", g.getOptarg() ); break; - case 'd' : - /* Debug level */ + case 'd' : /* Debug level */ arg = g.getOptarg(); - if ( arg != null ) debug = Integer.parseInt(arg.trim()); - else debug = 4; + if ( arg != null ) params.setProperty( "debug", arg.trim() ); + else params.setProperty( "debug", "4" ); break; - case 'D' : - /* Parameter definition: could be used for all parameters */ + case 'D' : /* Parameter definition: could be used for all parameters */ arg = g.getOptarg(); int index = arg.indexOf('='); if ( index != -1 ) { @@ -132,13 +136,10 @@ public class TestGen { } } - //generate an arbitrary test - if ( methodName.equals( ARBITRARY_TEST ) ) { - //build an ArbitraryTest object and modify the ontology according to it - ArbitraryTest at = new ArbitraryTest(); - at.modifyOntology( fileName, testNumber, params ); - } else if ( methodName.equals( GENERATE_BENCHMARK ) ) { - //generate the benchmark + if ( methodName.equals( ARBITRARY_TEST ) ) { //generate an arbitrary test + 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 ); gb.generate( params ); } @@ -149,8 +150,14 @@ public class TestGen { System.out.println("TestGen [options]"); System.out.println("options are"); System.out.println("--method=methodName, where methodName can be \""+ARBITRARY_TEST+"\" or \""+GENERATE_BENCHMARK+"\""); - System.out.println("--fileName=file [default: onto.rdf]"); + System.out.println("--initonto=filename (initial ontology)"); + System.out.println("--alignname=filename [default: refalign.rdf]"); + System.out.println("--ontoname=filename [default: onto.rdf]"); + System.out.println("--urlprefix=url"); + System.out.println("--outdir=directory [default: .]"); System.out.println("--testNumber=number, if the arbitraryTest is chosen"); + System.out.println("--help"); + System.out.println("--debug=number [default: 0]"); System.out.println("-Dparameter=value"); System.out.println("where the parameters are"); System.out.println( "[--------------------------------------------------------------------------]" ); diff --git a/src/fr/inrialpes/exmo/align/gen/TestGenerator.java b/src/fr/inrialpes/exmo/align/gen/TestGenerator.java index 844502fd3915cbf0d7317784e02c9de8e334e385..fb6cfbb6a210597b2b8f2a76c78142510133deb3 100644 --- a/src/fr/inrialpes/exmo/align/gen/TestGenerator.java +++ b/src/fr/inrialpes/exmo/align/gen/TestGenerator.java @@ -30,127 +30,196 @@ package fr.inrialpes.exmo.align.gen; -import com.hp.hpl.jena.ontology.OntModel; +// Alignment API implementation classes import fr.inrialpes.exmo.align.gen.inter.AlignedOntologyGenerator; import fr.inrialpes.exmo.align.impl.URIAlignment; -import fr.inrialpes.exmo.ontowrap.Ontology; -import fr.inrialpes.exmo.ontowrap.jena25.JENAOntology; -import java.util.Properties; +import fr.inrialpes.exmo.align.impl.renderer.RDFRendererVisitor; + import org.semanticweb.owl.align.Alignment; +import org.semanticweb.owl.align.AlignmentVisitor; + +//Java classes +import java.io.FileOutputStream; +import java.io.InputStream; +import java.io.File; +import java.io.BufferedWriter; +import java.io.IOException; +import java.io.OutputStream; +import java.io.PrintWriter; +import java.io.OutputStreamWriter; +import java.nio.charset.Charset; +import java.util.Properties; + +//Jena API classes +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.rdf.model.RDFWriter; +import com.hp.hpl.jena.util.FileManager; + +import java.util.Properties; public class TestGenerator implements AlignedOntologyGenerator { - private Properties parameters; //the set of parameters + private String urlprefix = "http://example.com/"; // Prefix (before testnumber) of test URL + private String dirprefix = ""; // Prefix (idem) of directory + private String ontoname = "onto.rdf"; // name of ontology to generate + private String alignname = "refalign.rdf"; // name of alignment to generate + private Properties params; //the modifications - private OntModel model; //initial ontology - private OntModel modifiedModel; //modified ontology - private Alignment alignment; //the reference alignment - private String namespace = ""; //the namespace + private OntModel modifiedOntology; //modified ontology + private Alignment resultAlignment; //the reference alignment + private String namespace = ""; //the namespace private OntologyModifier modifier = null; //the modifier + private boolean debug = false; public TestGenerator() {} + // ******************************************************* SETTERS + public void setURLPrefix( String u ) { urlprefix = u; } + + public void setDirPrefix( String d ) { dirprefix = d; } + + public void setOntoFilename( String o ) { ontoname = o; } + + public void setAlignFilename( String a ) { alignname = a; } + + public void setDebug( boolean d ) { debug = d; } + //returns the modified ontology - public Ontology getModifiedOntology() { - JENAOntology onto = new JENAOntology(); //cast the model into Ontology - onto.setOntology( this.modifiedModel ); - return onto; //return the ontology + public OntModel getModifiedOntology() { return modifiedOntology ; } + + public void setNamespace( String ns ) { namespace = ns; } + //return the newNamespace + public String getNamespace() { return namespace; } + + // ******************************************************* GB STUFF + + //gets the URI + public String getURI( String testNumber ) { + return urlprefix + "/" + testNumber + "/" + ontoname + "#"; // Do not like this #... + //return urlprefix + getPrefix(ontoname) + "/" + testNumber + "/" + ontoname + "#"; } - //set the initial ontology - public void setOntology( Ontology o ) { - if ( o instanceof JENAOntology ) { - this.model = ((JENAOntology)o).getOntology(); - this.modifiedModel = ((JENAOntology)o).getOntology(); - } else { - System.err.println("Error : The object given is not an OntModel"); - System.exit(-1); - } + public static String directoryName( String dir, String suffix ) { + if ( suffix == null ) return dir; + else return dir+"-"+suffix; } - public void setNamespace(String namespace) { - this.namespace = namespace; + // ******************************************************* FACILITIES + + public OntModel loadOntology ( String file ) { + InputStream in = FileManager.get().open( file ); + OntModel model = ModelFactory.createOntologyModel( OntModelSpec.OWL_MEM ); + model.read( in, null ); + return model; } - //return the newNamespace - public String getNamespace() { - return this.namespace; + //writes ontology + public static void writeOntology( OntModel model, String destFile, String ns ) { + try { + File f = new File( destFile ); + FileOutputStream fout = new FileOutputStream( f ); + Charset defaultCharset = Charset.forName("UTF8"); + RDFWriter writer = model.getWriter("RDF/XML-ABBREV"); + writer.setProperty( "showXmlDeclaration","true" ); + model.setNsPrefix( "", ns ); // JE: what about it? + writer.setProperty( "xmlbase", ns ); + model.createOntology( ns ); + writer.write( model.getBaseModel(), new OutputStreamWriter(fout, defaultCharset), ""); + fout.close(); + } catch (Exception ex) { + ex.printStackTrace(); + } } - //set the parameters - // JE: modifier may not have been initialised - public void setParameters(Properties p) { - parameters = p; - modifier.setProperties(parameters); + private void outputTestDirectory( OntModel onto, Alignment align, String testnumber ) { + // build the directory to save the file + boolean create = new File( dirprefix+"/"+testnumber ).mkdir(); + /* if ( create ) System.err.println(" Succesufully created the directory "); + else System.err.println(" Error creating the directory "); */ + + // write the ontology into the directory + writeOntology( onto, dirprefix+"/"+testnumber+"/"+ontoname, getURI( testnumber )); + + try { + //write the alignment into the directory + OutputStream stream = new FileOutputStream( dirprefix+"/"+testnumber+"/"+alignname ); + // Outputing + PrintWriter writer = new PrintWriter ( + new BufferedWriter( + new OutputStreamWriter( stream, "UTF-8" )), true); + AlignmentVisitor renderer = new RDFRendererVisitor( writer ); + align.render( renderer ); + writer.flush(); + writer.close(); + } catch ( Exception ex ) { + ex.printStackTrace(); + } } - //get the parameters - public Properties getParameters() { - parameters = modifier.getProperties(); //get the properties - return parameters; + //modifies an ontology from an existing test + /** + * Generate a test by altering an existing test + */ + public Properties incrementModifyOntology( String pKey, String pVal, String suffix, String prevTest, Properties al, String testNb ) { + Properties p = new Properties(); + p.setProperty( pKey, pVal ); + String prevDirName = directoryName( prevTest, suffix ); + String crtDirName = directoryName( testNb, suffix ); + return modifyOntology( dirprefix+"/"+prevDirName+"/"+ontoname, al, crtDirName, p ); } - //generate the alingnment + //modifies an ontology /** - * This in fact is dependent on: - * - p - * - model - * - modifiedModel - * - alignment + * Generate a test from an ontology */ - public Alignment generate( Ontology o, Properties p ) { - this.params = p; - this.alignment = new URIAlignment(); + public Properties modifyOntology( String file, Properties al, String testNumber, Properties params) { + if ( debug ) System.err.println( "Source: "+file+" generate "+testNumber ); + //set the TestGenerator ontology + OntModel onto = loadOntology( file ); // who needs model? + //set the namespace + setNamespace( getURI( testNumber ) ); + Alignment align = null; + if ( al == null ) + align = generate( onto, params ); + else + align = generate( onto, params, al ); + + outputTestDirectory( getModifiedOntology(), align, testNumber ); + 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; // Initialise the modifier class - modifier = new OntologyModifier( this.model, this.modifiedModel, this.alignment); //build the ontology modifier for the first time - modifier.setNewNamespace( this.namespace ); - // JE: This should be put OUT of the modifier (this generate Properties... instead of alignments...) - modifier.initializeAlignment(); // initialize the reference alignment + modifier = new OntologyModifier( onto, new URIAlignment()); //build the ontology modifier for the first time + modifier.setNewNamespace( namespace ); + // Initialize the reference alignment + if ( initalign == null ) { + modifier.initializeAlignment(); + } else { + modifier.initializeAlignment( initalign ); + } // Apply all modifications - //System.out.println( "[-------------------------------------------------]" ); - for( String key : this.params.stringPropertyNames() ) { - String value = this.params.getProperty(key); - //System.out.println( "[" +key + "] => [" + value + "]"); + if ( debug ) System.out.println( "[-------------------------------------------------]" ); + for( String key : params.stringPropertyNames() ) { + String value = params.getProperty(key); + if ( debug ) System.out.println( "[" +key + "] => [" + value + "]"); modifier.modifyOntology( key, value ); //modify the ontology according to it } - //System.out.println( "[-------------------------------------------------]" ); - // JE: this refalign should be variabilised //saves the alignment into the file "refalign.rdf", null->System.out - modifier.computeAlignment( "refalign.rdf" ); //at the end, compute the reference alignment - this.alignment = modifier.getAlignment(); //get the reference alignment - this.modifiedModel = modifier.getModifiedOntology(); //get the modified ontology - return this.alignment; + modifier.computeAlignment( alignname ); //at the end, compute the reference alignment + resultAlignment = modifier.getAlignment(); //get the reference alignment + modifiedOntology = modifier.getModifiedOntology(); //get the modified ontology + return resultAlignment; } - //generate the alingnment - //newParams => keeps track of the previous modifications - public Alignment generate(Ontology o, Properties p, Properties newParams) { - this.params = p; - this.alignment = new URIAlignment(); - modifier = new OntologyModifier( this.model, this.modifiedModel, this.alignment); //build the ontology modifier for the first time - // JE: These two lines (one commented and the next one) are the only difference with the other - // The first one is a different between incremental (an alignment has been initialised) - //modifier.initializeAlignment(); //initialize the reference alignment - - modifier.setProperties(newParams); - //set the new namespace - modifier.setNewNamespace( this.namespace ); - - //System.out.println( "[-------------------------------------------------]" ); - for( String key : this.params.stringPropertyNames() ) { - String value = this.params.getProperty(key); - //System.out.println( "[" +key + "] => [" + value + "]"); - modifier.modifyOntology( key, value ); //modify the ontology according to it - } - //System.out.println( "[-------------------------------------------------]" ); - - //saves the alignment into the file "referenceAlignment.rdf", null->System.out - modifier.computeAlignment( "refalign.rdf" ); //at the end, compute the reference alignment - this.alignment = modifier.getAlignment(); //get the reference alignment - this.modifiedModel = modifier.getModifiedOntology(); //get the modified ontology - return this.alignment; + public Alignment generate( OntModel onto, Properties p ) { + return generate( onto, p, (Properties)null ); } - - } diff --git a/src/fr/inrialpes/exmo/align/gen/inter/AlignedOntologyGenerator.java b/src/fr/inrialpes/exmo/align/gen/inter/AlignedOntologyGenerator.java index 065e59c09cce743092b4e308a15ce3a9f894a93a..881679d26134026e4c5dcee2fdc6a213c4f16d8a 100644 --- a/src/fr/inrialpes/exmo/align/gen/inter/AlignedOntologyGenerator.java +++ b/src/fr/inrialpes/exmo/align/gen/inter/AlignedOntologyGenerator.java @@ -22,13 +22,13 @@ package fr.inrialpes.exmo.align.gen.inter; -import fr.inrialpes.exmo.ontowrap.Ontology; -import java.util.Properties; +import com.hp.hpl.jena.ontology.OntModel; import org.semanticweb.owl.align.Alignment; +import java.util.Properties; public interface AlignedOntologyGenerator { - //generate an Alignment refering to the generated Ontology as onto2 (to be saved) - public Alignment generate(Ontology o, Properties p);; + //generate an Alignment refering to the generated Ontology as onto2 (to be saved) + public Alignment generate( OntModel o, Properties p ); }