diff OPPL/src/OPPLQueryGalaxy.java @ 15:622cde484f4c draft

Add new tool to perform OPPL queries
author Mikel Egana Aranguren <mikel-egana-aranguren@toolshed.g2.bx.psu.edu>
date Thu, 12 Jul 2012 17:12:00 +0200
parents
children 6c25e717c896
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/OPPL/src/OPPLQueryGalaxy.java	Thu Jul 12 17:12:00 2012 +0200
@@ -0,0 +1,171 @@
+/**
+ * 
+ */
+package es.upm.cbgp.opplquery.oppl.galaxy;
+
+import java.io.File;
+import java.io.FileNotFoundException;
+import java.util.Iterator;
+import java.util.Scanner;
+import java.util.Set;
+import java.util.logging.Logger;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+import org.semanticweb.owlapi.expression.ParserException;
+import org.semanticweb.owlapi.model.IRI;
+import org.semanticweb.owlapi.model.OWLObject;
+import org.semanticweb.owlapi.model.OWLOntologyCreationException;
+
+import es.upm.fi.dia.oeg.oppl.galaxy.GalaxyOWLAPI;
+
+import org.coode.oppl.ChangeExtractor;
+import org.coode.oppl.ConstraintSystem;
+import org.coode.oppl.OPPLParser;
+import org.coode.oppl.OPPLScript;
+import org.coode.oppl.ParserFactory;
+import org.coode.parsers.ErrorListener;
+import org.coode.parsers.LoggerErrorListener;
+import org.coode.oppl.bindingtree.Assignment;
+import org.coode.oppl.bindingtree.BindingNode;
+import org.coode.oppl.exceptions.QuickFailRuntimeExceptionHandler;
+import org.coode.oppl.exceptions.RuntimeExceptionHandler;
+
+public class OPPLQueryGalaxy {
+
+	/**
+	 * @param args
+	 * @throws OWLOntologyCreationException 
+	 * @throws ParserException 
+	 * @throws FileNotFoundException 
+	 */
+	public static void main(String[] args) throws OWLOntologyCreationException, ParserException, FileNotFoundException {
+		// Get the arguments from command-line
+		String OWLFilePath = args [0]; // /home/mikel/UPM/OPPL_galaxy/OPPL/OPPL/test-data/ontology/single/test.owl
+		String reasoner_type = args [1]; // Pellet|FaCTPlusPlus|HermiT
+		String Answer_render = args [2]; // URI|URIfragment|URIfragment2OBO
+		String OPPL_script_sourcee = args [3];
+		
+//		String OPPL_script_file = args [3]; 
+//		File OPPL_script_file = new File("/home/mikel/UPM/OPPL_galaxy/OPPL/OPPL/test-data/oppl_script/test_oppl_query.oppl");
+//		File OPPL_script_file = new File("/home/mikel/UPM/OPPL_galaxy/OPPL/OPPL/test-data/oppl_script/test_oppl_query_object_prop.oppl");
+//		File OPPL_script_file = new File("/home/mikel/UPM/OPPL_galaxy/OPPL/OPPL/test-data/oppl_script/test_oppl_query_object_ind.oppl");
+		
+//		String OPPL_script_source = "";
+//		Scanner input = new Scanner(OPPL_script_file);
+//		while(input.hasNext()) {
+//		    String nextToken = input.next();
+//		    OPPL_script_source = OPPL_script_source + " " + nextToken;
+//		}
+//		input.close();
+		
+		// Create the manager
+		GalaxyOWLAPI galaxyowlapi = new GalaxyOWLAPI();
+				
+		// Load the main ontology and hope for the imported URIs to be resolvable		
+		galaxyowlapi.loadMainOntology(OWLFilePath);
+				
+		// Set the reasoner
+		
+		// Pellet
+		if(reasoner_type.equals("Pellet")){
+			galaxyowlapi.setReasonerPellet();
+		}
+		// FaCTPlusPlus
+		else if (reasoner_type.equals("FaCTPlusPlus")){
+			galaxyowlapi.setReasonerFaCT();
+		}
+		// HermiT
+		else{
+			galaxyowlapi.setReasonerHermit();
+		}
+		
+		OPPL_script_source = completeOPPLScript(OPPL_script_source);
+//		System.out.println(OPPL_script_source);
+		
+		ParserFactory parserFactory = new ParserFactory(galaxyowlapi.getOWLManager(), galaxyowlapi.getMainOntology(), galaxyowlapi.getReasoner()); 
+		Logger logger = Logger.getLogger(OPPLQueryGalaxy.class.getName());
+		ErrorListener errorListener = (ErrorListener) new LoggerErrorListener(logger);
+		OPPLParser opplparser = parserFactory.build(errorListener);
+		OPPLScript OPPLscript = opplparser.parse(OPPL_script_source);
+		RuntimeExceptionHandler exceptionhandler = new QuickFailRuntimeExceptionHandler(); 		
+		ChangeExtractor extractor = new ChangeExtractor(exceptionhandler, true);
+		extractor.visit(OPPLscript);
+		ConstraintSystem cs = OPPLscript.getConstraintSystem();
+		Set<BindingNode> nodes =  cs.getLeaves();
+				
+		Iterator NodesIterator = nodes.iterator();
+		while(NodesIterator.hasNext()){
+			Set Assignments = ((BindingNode)NodesIterator.next()).getAssignments();
+			Iterator AssignmentIterator = Assignments.iterator();
+			while(AssignmentIterator.hasNext()){
+				Assignment assignment = (Assignment)AssignmentIterator.next();
+				System.out.print(assignment.getAssignedVariable().toString());
+				System.out.print("\t");	
+				String OWLObjectString = ((OWLObject)assignment.getAssignment()).toString();
+				IRI entityIRI = IRI.create(OWLObjectString.substring(1,OWLObjectString.length()-1));
+				print_result_entity(entityIRI, Answer_render);
+				System.out.print("\n");
+			}		
+		}
+	}
+	
+	//URI|URIfragment|URIfragment2OBO
+	private static void print_result_entity (IRI iri, String Answer_render){
+		if(Answer_render.equals("URI")){
+			System.out.print(iri);
+		}
+		
+		// Weird bug: in eclipse it can print out the IRIs of every entity, but in Galaxy it can't!
+		// done manually
+		else if(Answer_render.equals("URIfragment")){	
+			if(iri.toString().contains("#")){
+				System.out.print(iri.getFragment());
+			}
+			else{
+				String [] iri_tokens = iri.toString().split("/");
+				System.out.print(iri_tokens[iri_tokens.length-1]);
+			}
+		}
+		else{
+			if(iri.toString().contains("#")){
+				System.out.print((iri.getFragment()).replace("_", ":"));
+			}
+			else{
+				String [] iri_tokens = iri.toString().split("/");
+				System.out.print((iri_tokens[iri_tokens.length-1]).replace("_", ":"));
+			}
+		}
+	}
+	
+	// Very crappy stuff: complete the query to make a whole OPPL script that can be parsed
+	private static String completeOPPLScript (String OPPLQuery){
+		
+		// Get the first variable and add at least an axiom to make a whole script		
+		Pattern p = Pattern.compile("(\\?\\w+):(CLASS|INDIVIDUAL|OBJECTPROPERTY|DATAPROPERTY|ANNOTATIONPROPERTY|CONSTANT)");
+		Matcher m = p.matcher(OPPLQuery);
+		m.find();
+		if (m.group(2).equals("CLASS")){
+			OPPLQuery = OPPLQuery + " BEGIN ADD " + m.group(1) + " SubClassOf !A END;";
+		}
+		else if (m.group(2).equals("INDIVIDUAL")){
+			OPPLQuery = OPPLQuery + " BEGIN ADD " + m.group(1) + " !p !b END;";
+		}
+		else if (m.group(2).equals("OBJECTPROPERTY")){
+			OPPLQuery = OPPLQuery + " BEGIN ADD Transitive ?p END;";
+		}
+//		else if (m.group(2).equals("DATAPROPERTY")){
+//			OPPLQuery = OPPLQuery + " BEGIN ADD ?whole SubClassOf !A END;";
+//		}
+//		else if (m.group(2).equals("ANNOTATIONPROPERTY")){
+//			OPPLQuery = OPPLQuery + " BEGIN ADD ?whole SubClassOf !A END;";
+//		}
+//		else if (m.group(2).equals("CONSTANT")){
+//			OPPLQuery = OPPLQuery + " BEGIN ADD ?whole SubClassOf !A END;";
+//		}
+		else{
+			OPPLQuery = "Malformed OPPL query";
+		}
+		return OPPLQuery;
+	}
+}