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

📄 axiomextractor.java

📁 Semantic Web Ontology Editor
💻 JAVA
📖 第 1 页 / 共 2 页
字号:
						}
					}
					
					// equivalents ( intersections, unions, enumerations )
					Set equivalences =  new HashSet();
					equivalences.add( c );
					if ( myReasoner.isConsistent(c) )
					{
						// get all named equivalent classes (intersections, unions, enumerations )
						Set reasonedEquiSet = myReasoner.equivalentClassesOf(c);
						equivalences.addAll( reasonedEquiSet );
						
						// get complements classes (and make them into OWLNot, so they are equivalent to c)
						Set reasonedCompSet = myReasoner.complementClassesOf( c );
						for ( Iterator it = reasonedCompSet.iterator(); it.hasNext(); )
						{	
							OWLClass desc =  (OWLClass)it.next();
							OWLNot complement = factory.getOWLNot( desc );
							equivalences.add( complement );
						}
					}
					else // if not consistent, it is equivalent to owlNothing
					{ equivalences.add(owlNothing); }
					// only add to equivalenceMap if #equivalent classes is greater than 1 
					// ( only one means itself -- "A equivalentTo A")
					if ( equivalences.size() > 1 )
					{ addToEquivalents( equivalenceMap, (HashSet)equivalences ); }
					
					/* get all named disjoint classes for class 'c'
					 *   if c is inconsistent, then nothing is done
					 *   if c is consistent, then
					 *    - retrieave all disjoint classes from reasoner
					 * 
					 */
					HashSet disjointsForClass = new HashSet();
					if ( myReasoner.isConsistent(c) )
					{
						Set dis = myReasoner.disjointClassesOf( c );
						for (Iterator it = dis.iterator(); it.hasNext(); )
						{
							Set classes  = (Set)it.next();
							// only get the first class, since the rest are equivalents
							Iterator iter = classes.iterator();
							OWLClass aClass = (OWLClass)iter.next();
							// add to set only if cClass is consistent
							if ( myReasoner.isConsistent(aClass) )
								disjointsForClass.add( aClass );
						}
					}
					// now refine disjointsForClass so that every class in disjointsForClass
					// is not subsumed by another member in set.
					 findRootDisjoints( disjointsForClass );
					// now go over the disjointsForClass set and add disjoint axioms
					 for ( Iterator it = disjointsForClass.iterator(); it.hasNext(); )
					 {
						 OWLClass aClass = (OWLClass)it.next();
						 HashSet mutuallyDisjointClasses = new HashSet();
						 mutuallyDisjointClasses.add( c );
						 mutuallyDisjointClasses.add( aClass );
						 classAxiomContainers.add( new ClassAxiomContainer( 
					              new OWLDisjointClassesAxiomImpl( factory, mutuallyDisjointClasses ),
								  myShortform, myModel )); 
					 }
					 
				}
				
				// build equivalence axioms from equivalence maps
				for ( Iterator it = equivalenceMap.keySet().iterator(); it.hasNext(); )
				{
					OWLDescription desc = (OWLDescription)it.next();
					Set equivalentClasses = (Set)equivalenceMap.get( desc );
					classAxiomContainers.add( new ClassAxiomContainer( 
				              new OWLEquivalentClassesAxiomImpl( factory, equivalentClasses ),
							  myShortform, myModel ));
				}
			}
			
			return new Vector( classAxiomContainers );
		}
		catch (Exception ex)
		{
			ex.printStackTrace();
		}
		return null;
	}
	
	
	/* 
	 * PRIVATE helper methods
	 */
	
	/* Given a set of equivalent classes/expressions, merge them into known ones if known ones
	 * exist.  If not, create new places for them in the equivalenceMap
	 * 
	 */
	private void addToEquivalents( Hashtable equivalenceMap, HashSet equivalentClasses ) throws OWLException
	{
		// equiClone only used for iterating through the equivalentClasses set
		HashSet equiClone = (HashSet)equivalentClasses.clone();
		
		for ( Iterator eqIt = equiClone.iterator(); eqIt.hasNext(); )
		{
			OWLDescription desc = (OWLDescription)eqIt.next();
			
//			ConcisePlainVisitor walker = new ConcisePlainVisitor( myShortform, myModel );
			// check to see if desc already in map as key
			if ( equivalenceMap.keySet().contains( desc ) )
			{
//				desc.accept( walker );
//				String descStr = walker.result();
//				walker.reset();
//				System.err.println("adding additional equivalentClasses of [" + descStr +"]" );
				
				Set oldEquiSet = (Set)equivalenceMap.get( desc );
				
				/*
				for ( Iterator it = oldEquiSet.iterator(); it.hasNext(); )
				{
					OWLDescription equiDesc = (OWLDescription)it.next();
					
					equiDesc.accept( walker );
					String someDesc = walker.result();
					walker.reset();					
					System.err.println("   [o] equivalent to [" + someDesc +"]" );
				}
				for ( Iterator it = equivalentClasses.iterator(); it.hasNext(); )
				{
					OWLDescription equiDesc = (OWLDescription)it.next();
					
					equiDesc.accept( walker );
					String someDesc = walker.result();
					walker.reset();					
					System.err.println("   [n] equivalent to [" + someDesc +"]" );
				}
				*/
				
				addKnownEquivalences( equivalenceMap, oldEquiSet, equivalentClasses );
				
				// for the updated oldEquiSet, update to its members
				for ( Iterator it = oldEquiSet.iterator(); it.hasNext(); )
				{
					Object obj = it.next();
					equivalenceMap.put( obj, oldEquiSet );
				}
				//equivalentClasses.addAll( oldEquiSet );
				//equivalenceMap.put( desc, oldEquiSet );
			}
			else 
			{
				// not in map, construct a new set, find 
				// known euivalent classes of equivalent classes, 
				// and put those in the new set.
				Set newEquivalences = new HashSet();
				newEquivalences.addAll( equivalentClasses );
				
//				desc.accept( walker );
//				String descStr = walker.result();
//				walker.reset();
//				System.err.println("adding new equivalentClasses of [" + descStr +"]" );
				
				addKnownEquivalences( equivalenceMap, newEquivalences, equivalentClasses );

//				System.err.println(" * putting in map with set of size " + newEquivalences.size() );
				// for the updated newEquivalences, update to its members
				for ( Iterator it = newEquivalences.iterator(); it.hasNext(); )
				{
					Object obj = it.next();
					equivalenceMap.put( obj, newEquivalences );
				}
				equivalenceMap.put( desc, newEquivalences );
			}
		}
	}

	/* 
	 * Given the equivalenceMap, a set of known equivalences, and a set of new equivalences.
	 *  for each member X of new equivalence, attempts to find to see if it already is registered
	 *  in the map.  If it is, then find the existing equivalent set for that member from the
	 *  map (calling 'get').  Add the members of the existing equivalences to known equivalences,
	 *  and update the Map for X.
	 * 
	 */
	private void addKnownEquivalences( Hashtable equivalenceMap, Set knownEquivalences, Set equivalentClasses ) throws OWLException
	{
//		ConcisePlainVisitor walker = new ConcisePlainVisitor( myShortform, myModel );
//		System.err.println("  adding known euqivalences");
		
		// for each equivalent class, find if it exists already in equivalenceMap.
		// if it does, then we get its known equivalent classes and add to newEquivalences
		// set its equivalent set to this newEquivalences set
		for ( Iterator it = equivalentClasses.iterator(); it.hasNext(); )
		{
			OWLDescription equiDesc = (OWLDescription)it.next();
			
// 			equiDesc.accept( walker );
//			String equiStr = walker.result();
//			walker.reset();
			
//			System.err.println("   equivalent to: [" + equiStr +"]" );
			if ( equivalenceMap.keySet().contains( equiDesc ) )
			{
				Set knownEquiSet = (Set)equivalenceMap.get( equiDesc );
//			System.err.println("   ["+ equiStr +"] exists in map, with old size = " + knownEquiSet.size() );
				knownEquivalences.addAll( knownEquiSet );
				equivalenceMap.put( equiDesc, knownEquivalences );
//			System.err.println("   ["+ equiStr +"] exists in map, with new size = " + newEquivalences.size() );
			}
		}
	}

	
	/* 
	 * refine input disjointsForClass so that every class in disjointsForClass
	 * is not subsumed by another member in set.
	 */ 
	private void findRootDisjoints( HashSet disjointsForClass ) throws OWLException
	{
		HashSet subclassSet = new HashSet();
		for ( Iterator it = disjointsForClass.iterator(); it.hasNext(); )
		{
			OWLClass iClass = (OWLClass)it.next();
			if ( subclassSet.contains( iClass ) ) // if is already known to be a subclass, then don't process it
				continue;
			for ( Iterator jt = disjointsForClass.iterator(); jt.hasNext(); )
			{
				OWLClass jClass = (OWLClass)jt.next();
				if ( !myReasoner.isEquivalentClass( jClass, iClass) )
				{
					if ( myReasoner.isSubClassOf(jClass, iClass) )
					{
						//System.out.println( " -" + myShortform.shortForm(jClass.getURI())+ " subsumed by " + myShortform.shortForm(iClass.getURI()));
						subclassSet.add( jClass );
					}
				}
			}
		}
		disjointsForClass.removeAll( subclassSet );
	}
}

⌨️ 快捷键说明

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