view src/de/mpiwg/dwinter/duomo/lexdump/OWLImporter.java @ 4:72004a788198

save single file
author dwinter
date Sun, 06 Feb 2011 21:19:48 +0100
parents d9fd32ecae24
children 923e73fa07f1
line wrap: on
line source

package de.mpiwg.dwinter.duomo.lexdump;

import java.io.File;
import java.net.URI;
import java.net.URISyntaxException;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;

import org.apache.log4j.Logger;

import edu.stanford.smi.protege.exception.OntologyLoadException;
import edu.stanford.smi.protegex.owl.ProtegeOWL;
import edu.stanford.smi.protegex.owl.jena.JenaOWLModel;
import edu.stanford.smi.protegex.owl.model.OWLClass;
import edu.stanford.smi.protegex.owl.model.OWLDatatypeProperty;
import edu.stanford.smi.protegex.owl.model.OWLIndividual;
import edu.stanford.smi.protegex.owl.model.OWLNamedClass;
import edu.stanford.smi.protegex.owl.model.RDFProperty;
import edu.stanford.smi.protegex.owl.model.RDFSDatatype;
import edu.stanford.smi.protegex.owl.model.RDFSLiteral;
import edu.stanford.smi.protegex.owl.model.impl.DefaultRDFProperty;
import edu.stanford.smi.protegex.owl.model.impl.DefaultRDFSLiteral;
import edu.stanford.smi.protegex.owl.repository.RepositoryManager;
import edu.stanford.smi.protegex.owl.repository.impl.LocalFolderRepository;

public class OWLImporter {

	JenaOWLModel owlModel; // contains the model
	Logger logger = Logger.getRootLogger();
	private HashMap<String, String> typeId2className=null;
	private HashMap<String, OWLNamedClass> typeId2class=null;
	private String ontFolder;
	private URI uri;

	public OWLImporter(String folder, URI uri) throws OntologyLoadException {
		// owlModel = ProtegeOWL.createJenaOWLModelFromURI(uri);

		this.ontFolder=folder;
		this.uri=uri;
		
		loadOWL(folder, uri);
	}

	public void reloadOWL() throws OntologyLoadException{
		loadOWL(ontFolder, uri);
	}
	
	public void loadOWL(String folder, URI uri) throws OntologyLoadException {
		owlModel = ProtegeOWL.createJenaOWLModel();
		// Load repository
		RepositoryManager rman = owlModel.getRepositoryManager();

		// Add working directory to repository manager.
		File workingDirectory = new File(folder);
		rman.addGlobalRepository(new LocalFolderRepository(workingDirectory));
		// Load ontology

		((JenaOWLModel) owlModel).load(uri, "OWL-DL");
	}

	/**
	 * Drucke das Modell nach stdout
	 */
	public void printModel() {
		Collection<?> classes = owlModel.getUserDefinedOWLNamedClasses();
		for (Iterator<?> it = classes.iterator(); it.hasNext();) {
			OWLNamedClass cls = (OWLNamedClass) it.next();
			Collection<?> instances = cls.getInstances(false);
			System.out.println("Class " + cls.getBrowserText() + " ("
					+ instances.size() + ")");
			for (Iterator<?> jt = instances.iterator(); jt.hasNext();) {
				OWLIndividual individual = (OWLIndividual) jt.next();
				System.out.println(" - " + individual.getBrowserText());
			}
		}

	}

	public static void main(String args[]) throws URISyntaxException {
		String base = "/Users/dwinter/Documents/Projekte/Diss - data-mining/eclipseWorkspace/de.mpiwg.dwinter.duomo/owlInput";
		URI ontologieUri = new URI(
				"file:///Users/dwinter/Documents/Projekte/Diss%20-%20data-mining/eclipseWorkspace/de.mpiwg.dwinter.duomo/owlInput/duomoAnalysis.owl");
		try {

			OWLImporter im = new OWLImporter(base, ontologieUri);
			im.printModel();
		} catch (OntologyLoadException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}

	public OWLIndividual createInstance(String string) {
		OWLNamedClass owlclass = (OWLNamedClass) owlModel
				.getOWLNamedClass(string);

		if (owlclass == null) {
			logger.debug("Cannot find OWLClass:" + string);
			return null;
		}
		//logger.debug("Create new individual of type:"+string);
		return owlclass.createOWLIndividual(null);

	}

	public void setProperty(OWLIndividual identifier, String propertyName,
			Object value) {
		RDFProperty prop = owlModel.getRDFProperty(propertyName);
		identifier.setPropertyValue(prop, value);

	}
	
	public void setDataTypePropery(OWLIndividual eventInstance,
			String propertyName, String value, String lang) {
		RDFProperty prop = owlModel.getRDFProperty(propertyName);
//		if(OWLDatatypeProperty.class.isInstance(prop)){
//			OWLDatatypeProperty dp = (OWLDatatypeProperty)prop;
//			prop.set
//			
//		} else {
//			logger.error("Is not a datatypeprop:"+propertyName);
//		}
		
		
		RDFSLiteral langLiteral = owlModel.createRDFSLiteral(value, lang);
		eventInstance.setPropertyValue(prop, langLiteral);

		
	}

	public Object getRelatedIndividual(OWLIndividual cardInd,
			String propertyName) {
		RDFProperty prop = owlModel.getRDFProperty(propertyName);
		if (prop == null) {
			logger.debug("Property does not exist:" + propertyName);
		}

		Object value = cardInd.getPropertyValue(prop);
		return value;
	}

	public OWLIndividual getIndividual(String classNameFrom,
			String propertyNameToClass, String classNameTo,
			String propertyName2, Object value) {

		RDFProperty prop = owlModel.getRDFProperty(propertyName2);

		OWLClass classTo = owlModel.getOWLNamedClass(classNameTo);
		Collection<?> instances = classTo.getInstances(true);
		OWLIndividual toIv = null;
		// Such individiual mit propertyName2 und Wert value
		for (Iterator<?> jt = instances.iterator(); jt.hasNext();) {
			OWLIndividual iv = (OWLIndividual) jt.next();
			Object propVal = iv.getPropertyValue(prop);
		
			if (propVal!=null && iv.getPropertyValue(prop).equals(value)) {
				toIv = iv;
				break;
			}
		}

		// kein treffer
		if (toIv == null)
			return null;

		// jetzt suche das Invidual, dass mit dieser Instance verbunden ist
		RDFProperty prop2 = owlModel.getRDFProperty(propertyNameToClass);

		OWLClass classFrom = owlModel.getOWLNamedClass(classNameFrom);
		Collection<?> instancesFrom = classFrom.getInstances(true);
		OWLIndividual fromIv = null;
		// Such individiual mit propertyName2 und Wert value
		for (Iterator<?> jt = instancesFrom.iterator(); jt.hasNext();) {
			OWLIndividual iv = (OWLIndividual) jt.next();
			Object propValue = iv.getPropertyValue(prop2);
			if (propValue!=null && iv.getPropertyValue(prop2).equals(toIv)) {
				fromIv = iv;
				break;
			}
		}

		return fromIv;
	}
	
	public List<OWLIndividual> getIndividuals(String classNameFrom,
			String propertyNameToClass, String classNameTo,
			String propertyName2, Object value) {

		List<OWLIndividual>  returnList= new ArrayList<OWLIndividual>();
		
		RDFProperty prop = owlModel.getRDFProperty(propertyName2);

		OWLClass classTo = owlModel.getOWLNamedClass(classNameTo);
		Collection<?> instances = classTo.getInstances(true);
		OWLIndividual toIv = null;
		// Such individiual mit propertyName2 und Wert value
		for (Iterator<?> jt = instances.iterator(); jt.hasNext();) {
			OWLIndividual iv = (OWLIndividual) jt.next();
			if (iv.getPropertyValue(prop).equals(value)) {
				toIv = iv;
				break;
			}
		}

		// kein treffer
		if (toIv == null)
			return null;

		// jetzt suche das Invidual, dass mit dieser Instance verbunden ist
		RDFProperty prop2 = owlModel.getRDFProperty(propertyNameToClass);

		OWLClass classFrom = owlModel.getOWLNamedClass(classNameFrom);
		Collection<?> instancesFrom = classFrom.getInstances(true);
		//OWLIndividual fromIv = null;
		// Such individiual mit propertyName2 und Wert value
		for (Iterator<?> jt = instancesFrom.iterator(); jt.hasNext();) {
			OWLIndividual iv = (OWLIndividual) jt.next();
			if (iv.getPropertyValue(prop2).equals(toIv)) {
				returnList.add(iv);
				break;
			}
		}

		return returnList;
	}

	public List<OWLIndividual> getIndividuals(String className, String propertyName,
			OWLIndividual targetInd) {
		List<OWLIndividual>  returnList= new ArrayList<OWLIndividual>();
		
		RDFProperty prop = owlModel.getRDFProperty(propertyName);

		OWLClass cls = owlModel.getOWLNamedClass(className);
		
		Collection<?> instances = cls.getInstances(true);
		// Such individiual mit propertyName2 und Wert value
		for (Iterator<?> jt = instances.iterator(); jt.hasNext();) {
			OWLIndividual iv = (OWLIndividual) jt.next();
			if (iv.getPropertyValue(prop).equals(targetInd)) {
				returnList.add(iv);
				
			}
		}

		return returnList;
	}
	
	public OWLIndividual createTimeSpan(String dateDcStart, String dateDcEnd) {
		OWLIndividual timeSpan = createInstance("DatesDocument");
		
			
		
		setProperty(timeSpan, "has_readable_date", dateDcStart);
		
		if(!(dateDcEnd==null || dateDcEnd.equals(""))){
			setProperty(timeSpan, "has_readable_to_date", dateDcEnd);
		} else {
			dateDcEnd=dateDcStart;
		}
		
		OWLIndividual timeSpanIdentifier = createInstance("Identifier");
		setProperty(timeSpanIdentifier,"has_readable_id",dateDcStart+"-"+dateDcEnd);
		
		setProperty(timeSpan,"crm:P48_has_preferred_identifier",timeSpanIdentifier);
		
		return timeSpan;
	}

	public OWLIndividual getIndividualByReadableId(String className,String identifier){
		return getIndividual(className, "crm:P48_has_preferred_identifier", "Identifier", "has_readable_id", identifier);
	}

	public String getClassNameFromTypeId(String typeId) {
		if (typeId2className==null){ // hash nicht angelegt
			createTypeId2classHashes();	
		}
		
		return typeId2className.get(typeId);
		
	}

	private void createTypeId2classHashes() {
		typeId2className= new HashMap<String,String>();
		typeId2class= new HashMap<String,OWLNamedClass>();
		
		Collection<?> classes = owlModel.getUserDefinedOWLNamedClasses();
		
		RDFProperty property = owlModel.getRDFProperty("duomoTypeID");
		for (Iterator<?> it = classes.iterator(); it.hasNext();) {
			OWLNamedClass cls = (OWLNamedClass) it.next();
			String tid = (String) cls.getPropertyValue(property);
			if(tid!=null){
				typeId2class.put(tid, cls);
				typeId2className.put(tid, cls.getName());
				logger.debug("Adding to typId2className:"+tid+"---"+cls.getName());
			}
		}
	}

	public OWLNamedClass getClassFromTypeId(String typeId) {
		if (typeId2className==null){ // hash nicht angelegt
			createTypeId2classHashes();	
		}
		
		return typeId2class.get(typeId);
	}

	public void save(String string) throws URISyntaxException, Exception {
		owlModel.save(new URI(string));
		
	}

	public OWLIndividual createOrGetInstanceWithIdentifier(String classNameInstance,
			String classNameIdentifier, String identifier) {
		OWLIndividual ind = getIndividualByReadableId(classNameInstance, identifier);
		if(ind==null){
			ind = createInstance(classNameInstance);
			OWLIndividual identifierInd = createInstance(classNameIdentifier);
			setProperty(identifierInd, "has_readable_id", identifier);
			setProperty(ind, "crm:P48_has_preferred_identifier",
			identifierInd);
		}
		return ind;
	}
}