view 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 source

/**
 * 
 */
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;
	}
}