⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 axiomextractor.java

📁 Semantic Web Ontology Editor
💻 JAVA
📖 第 1 页 / 共 2 页
字号:
package org.mindswap.swoop.explore;

import java.net.URI;
import java.util.Collection;
import java.util.Collections;
import java.util.HashSet;
import java.util.Hashtable;
import java.util.Iterator;
import java.util.Set;
import java.util.TreeSet;
import java.util.Vector;

import org.mindswap.swoop.SwoopModel;
import org.mindswap.swoop.reasoner.PelletReasoner;
import org.mindswap.swoop.reasoner.SwoopReasoner;
import org.mindswap.swoop.reasoner.SwoopToldReasoner;
import org.mindswap.swoop.renderer.entity.ConciseFormatEntityRenderer;
import org.mindswap.swoop.utils.graph.hierarchy.OntologyGraphNode;
import org.mindswap.swoop.utils.graph.hierarchy.OntologyWithClassHierarchyGraph;
import org.mindswap.swoop.utils.graph.hierarchy.SwoopOntologyVertex;
import org.mindswap.swoop.utils.graph.hierarchy.popup.ClassAxiomContainer;
import org.mindswap.swoop.utils.graph.hierarchy.popup.ConcisePlainVisitor;
import org.mindswap.swoop.utils.graph.hierarchy.popup.SubclassAxiomContainerComparator;
import org.mindswap.swoop.utils.owlapi.AxiomCollector;
import org.mindswap.swoop.utils.owlapi.OWLDescriptionFinder;
import org.semanticweb.owl.impl.model.OWLDataFactoryImpl;
import org.semanticweb.owl.impl.model.OWLDisjointClassesAxiomImpl;
import org.semanticweb.owl.impl.model.OWLEquivalentClassesAxiomImpl;
import org.semanticweb.owl.impl.model.OWLSubClassAxiomImpl;
import org.semanticweb.owl.model.OWLClass;
import org.semanticweb.owl.model.OWLClassAxiom;
import org.semanticweb.owl.model.OWLDescription;
import org.semanticweb.owl.model.OWLDisjointClassesAxiom;
import org.semanticweb.owl.model.OWLEquivalentClassesAxiom;
import org.semanticweb.owl.model.OWLException;
import org.semanticweb.owl.model.OWLNot;
import org.semanticweb.owl.model.OWLOntology;
import org.semanticweb.owl.model.OWLSubClassAxiom;

import aterm.pure.ATermApplImpl;

public class AxiomExtractor 
{
	private Set myOntologies = null;
	private OWLOntology myOntology = null;
	private SwoopModel myModel = null;
	private SwoopReasoner myReasoner = null;
	private ConciseFormatEntityRenderer myShortform = null;
	
	private OWLClass owlThing = null;
	private OWLClass owlNothing = null;
	
	public AxiomExtractor( OWLOntology ont, SwoopModel model, SwoopReasoner reasoner )
	{
		init( ont, model, reasoner );
	}
	
	private void init( OWLOntology ont, SwoopModel model, SwoopReasoner reasoner )
	{
		try
		{
			myModel     = model;
			myShortform = new ConciseFormatEntityRenderer();
			myShortform.setSwoopModel( myModel );	
			myOntologies = new HashSet();
			myOntologies.add( ont );
			myReasoner = reasoner;
			
			owlThing   = myReasoner.getOntology().getOWLDataFactory().getOWLThing();
			owlNothing = myReasoner.getOntology().getOWLDataFactory().getOWLNothing();
		}
		catch ( OWLException e )
		{
			e.printStackTrace();
		}
	}

	public Vector extractSubclassAxioms( boolean withReasoner )
	{
		// use  a sorted set
		Set subclassAxioms = new TreeSet( SubclassAxiomContainerComparator.getInstance() );
		try
		{
			for (Iterator it = myOntologies.iterator(); it.hasNext(); )
			{
				OWLOntology ont = (OWLOntology)it.next();
				myModel.setSelectedOntology( ont );
				try
				{
					if ( withReasoner ) // load pellet for each ontology
					{	
						System.err.println("AxiomExtractor: setting Pellet reasoner");
						PelletReasoner reasoner = new PelletReasoner();
						// use pellet.  Place it in model's reasonerCache.
						myModel.setReasonerWithThreadBlock( reasoner );						
						myReasoner = myModel.getReasonerCache().getReasoner(ont, reasoner.getName() );
					}
					else // use told reasoner
					{
						System.err.println("AxiomExtractor: setting told reasoner");
						SwoopToldReasoner reasoner = new SwoopToldReasoner();
						myModel.setReasoner( reasoner );
						myReasoner = myModel.getReasonerCache().getReasoner(ont, reasoner.getName() );
					}
				}
				catch ( Exception e )
				{
					System.err.println("** Cannot set reasoner **");
					e.printStackTrace();
				}
				
				OWLClass owlThing = ont.getOWLDataFactory().getOWLThing();
				OWLDataFactoryImpl factory = (OWLDataFactoryImpl)ont.getOWLDataFactory();
				Set classSet = ont.getClasses();
				
				for (Iterator iter = classSet.iterator(); iter.hasNext(); ) 
				{
					OWLClass clazz = (OWLClass)iter.next();
					Set supers = OWLDescriptionFinder.getSuperClasses(clazz, Collections.singleton(ont));
					//if(myReasoner.isConsistent(clazz)) 
					//{
						// remove all the named classes because reasoner will eventually add them
						Iterator iterator = supers.iterator();
						while(iterator.hasNext())
							if(iterator.next() instanceof OWLClass)
								iterator.remove();		
						// add all the named superclasses (including inferred)
						supers.addAll(myReasoner.superClassesOf(clazz));
						// remove owl:Thing from the superclass set
						iterator = supers.iterator();
						while(iterator.hasNext()) 
						{
							Object o = iterator.next();
							if(o instanceof Set && ((Set)o).contains(owlThing))
								iterator.remove();
							else
							{
								OWLDescription desc = null;
								if ( o instanceof Set)
								{
									 desc = (OWLDescription)((Set)o).iterator().next();
								}
								else
									desc = (OWLDescription)o;
								subclassAxioms.add( new ClassAxiomContainer( 
										              new OWLSubClassAxiomImpl( factory, (OWLDescription)clazz, desc),
													  myShortform, myModel ));
							}
						}
					//}
				}		
			}
			// return the sorted Vector
			return new Vector( subclassAxioms );
		}
		catch (OWLException ex)
		{
			ex.printStackTrace();
		}
		return null;
	}

	/*
	 * extracts class axioms in the import closure of the currently selected ontology in Swoop
	 * 
	 */
	public Vector extractClassAxioms( )
	{
		// maps a class/class expression (key) to its set of equivalent classes/class expressions (values)
		// each equivvalent set contains the key as well.
		Hashtable equivalenceMap = new Hashtable();

		// use a sorted set
		Set classAxiomContainers = new TreeSet( SubclassAxiomContainerComparator.getInstance() );
		
		try
		{
			Set importClosure = myReasoner.getOntologies();
			/* 	for each ontology in the import closure
			 *	find all told class axioms
			 */	
			for ( Iterator ontIter = importClosure.iterator(); ontIter.hasNext(); )
			{ 
				OWLOntology ont = (OWLOntology)ontIter.next();
				Set axioms = AxiomCollector.axiomize( ont );
				for ( Iterator it = axioms.iterator(); it.hasNext(); )
				{
					Object obj = it.next();
					if ( (obj instanceof OWLClassAxiom))
					{
						if ( obj instanceof OWLEquivalentClassesAxiom)
						{
							OWLEquivalentClassesAxiom qui = (OWLEquivalentClassesAxiom)obj;
							Set equivalentClasses = qui.getEquivalentClasses();
							if ( equivalentClasses.size() == 1 )
								continue;
							else
							{ addToEquivalents( equivalenceMap, (HashSet)equivalentClasses ); }
						}
						else //subclass or disjoint axioms
							classAxiomContainers.add( new ClassAxiomContainer( (OWLClassAxiom)obj, myShortform, myModel ) );
					}
				}
			}
			
			
			/*
			 * now get the inferred axioms
			 * 
			 */
			for ( Iterator ontIter = importClosure.iterator(); ontIter.hasNext(); )
			{
				OWLOntology ont = (OWLOntology)ontIter.next();
				OWLDataFactoryImpl factory = (OWLDataFactoryImpl)ont.getOWLDataFactory();
				
				for ( Iterator classIter = ont.getClasses().iterator(); classIter.hasNext(); )
				{
					OWLClass c = (OWLClass)classIter.next();					
					// superclasses
					Set supers = c.getSuperClasses( importClosure );
					if( myReasoner.isConsistent(c) )
					{
						supers.addAll( myReasoner.superClassesOf(c));						
						// remove owl:Thing from the superclass set
						for (Iterator i = supers.iterator(); i.hasNext(); ) 
						{
							Object o = i.next();
							if(o instanceof Set && ((Set)o).contains(owlThing))
								i.remove();
							else
							{
								OWLDescription desc = null;
								if ( o instanceof Set)								
									desc = (OWLDescription)((Set)o).iterator().next();								
								else
									desc = (OWLDescription)o;
								classAxiomContainers.add( new ClassAxiomContainer( 
										              new OWLSubClassAxiomImpl( factory, (OWLDescription)c, desc),
													  myShortform, myModel ));
							}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -