📄 ontclassimpl.java
字号:
/*****************************************************************************
* Source code information
* -----------------------
* Original author Ian Dickinson, HP Labs Bristol
* Author email Ian.Dickinson@hp.com
* Package Jena 2
* Web http://sourceforge.net/projects/jena/
* Created 27-Mar-2003
* Filename $RCSfile: OntClassImpl.java,v $
* Revision $Revision: 1.53 $
* Release status $State: Exp $
*
* Last modified on $Date: 2007/01/02 11:49:47 $
* by $Author: andy_seaborne $
*
* (c) Copyright 2002, 2003, 2004, 2005, 2006, 2007 Hewlett-Packard Development Company, LP
* (see footer for full conditions)
*****************************************************************************/
// Package
///////////////
package com.hp.hpl.jena.ontology.impl;
// Imports
///////////////
import com.hp.hpl.jena.ontology.*;
import com.hp.hpl.jena.enhanced.*;
import com.hp.hpl.jena.graph.*;
import com.hp.hpl.jena.graph.query.*;
import com.hp.hpl.jena.rdf.model.*;
import com.hp.hpl.jena.reasoner.*;
import com.hp.hpl.jena.util.iterator.*;
import com.hp.hpl.jena.vocabulary.*;
import java.util.*;
/**
* <p>
* Implementation of the ontology abstraction representing ontology classes.
* </p>
*
* @author Ian Dickinson, HP Labs
* (<a href="mailto:Ian.Dickinson@hp.com" >email</a>)
* @version CVS $Id: OntClassImpl.java,v 1.53 2007/01/02 11:49:47 andy_seaborne Exp $
*/
public class OntClassImpl
extends OntResourceImpl
implements OntClass
{
// Constants
//////////////////////////////////
/* LDP never returns properties in these namespaces */
private static final String[] IGNORE_NAMESPACES = new String[] {
OWL.NS,
DAMLVocabulary.NAMESPACE_DAML_2001_03_URI,
RDF.getURI(),
RDFS.getURI(),
ReasonerVocabulary.RBNamespace
};
// Static variables
//////////////////////////////////
/**
* A factory for generating OntClass facets from nodes in enhanced graphs.
* Note: should not be invoked directly by user code: use
* {@link com.hp.hpl.jena.rdf.model.RDFNode#as as()} instead.
*/
public static Implementation factory = new Implementation() {
public EnhNode wrap( Node n, EnhGraph eg ) {
if (canWrap( n, eg )) {
return new OntClassImpl( n, eg );
}
else {
throw new ConversionException( "Cannot convert node " + n.toString() + " to OntClass: it does not have rdf:type owl:Class or equivalent");
}
}
public boolean canWrap( Node node, EnhGraph eg ) {
// node will support being an OntClass facet if it has rdf:type owl:Class or equivalent
Profile profile = (eg instanceof OntModel) ? ((OntModel) eg).getProfile() : null;
return (profile != null) && profile.isSupported( node, eg, OntClass.class );
}
};
// Instance variables
//////////////////////////////////
/** Query for properties with this class as domain */
protected BindingQueryPlan m_domainQuery;
/** Query for properties restricted by this class */
protected BindingQueryPlan m_restrictionPropQuery = null;
// Constructors
//////////////////////////////////
/**
* <p>
* Construct an ontology class node represented by the given node in the given graph.
* </p>
*
* @param n The node that represents the resource
* @param g The enh graph that contains n
*/
public OntClassImpl( Node n, EnhGraph g ) {
super( n, g );
// pre-built queries
// ?x a rdf:Property ; rdfs:domain this.
Query q = new Query();
q.addMatch( Query.X, getProfile().DOMAIN().asNode(), asNode() );
m_domainQuery = getModel().queryHandler().prepareBindings( q, new Node[] {Query.X} );
// this rdfs:subClassOf ?x. ?x owl:onProperty ?y.
if (getProfile().ON_PROPERTY() != null) {
q = new Query();
q.addMatch( asNode(), getProfile().SUB_CLASS_OF().asNode(), Query.X );
q.addMatch( Query.X, getProfile().ON_PROPERTY().asNode(), Query.Y );
m_restrictionPropQuery = getModel().queryHandler().prepareBindings( q, new Node[] {Query.Y} );
}
}
// External signature methods
//////////////////////////////////
// subClassOf
/**
* <p>Assert that this class is sub-class of the given class. Any existing
* statements for <code>subClassOf</code> will be removed.</p>
* @param cls The class that this class is a sub-class of
* @exception OntProfileException If the {@link Profile#SUB_CLASS_OF()} property is not supported in the current language profile.
*/
public void setSuperClass( Resource cls ) {
setPropertyValue( getProfile().SUB_CLASS_OF(), "SUB_CLASS_OF", cls );
}
/**
* <p>Add a super-class of this class.</p>
* @param cls A class that is a super-class of this class.
* @exception OntProfileException If the {@link Profile#SUB_CLASS_OF()} property is not supported in the current language profile.
*/
public void addSuperClass( Resource cls ) {
addPropertyValue( getProfile().SUB_CLASS_OF(), "SUB_CLASS_OF", cls );
}
/**
* <p>Answer a class that is the super-class of this class. If there is
* more than one such class, an arbitrary selection is made.</p>
* @return A super-class of this class
* @exception OntProfileException If the {@link Profile#SUB_CLASS_OF()} property is not supported in the current language profile.
*/
public OntClass getSuperClass() {
return (OntClass) objectAs( getProfile().SUB_CLASS_OF(), "SUB_CLASS_OF", OntClass.class );
}
/**
* <p>Answer an iterator over all of the classes that are declared to be super-classes of
* this class. Each element of the iterator will be an {@link OntClass}.</p>
* @return An iterator over the super-classes of this class.
* @exception OntProfileException If the {@link Profile#SUB_CLASS_OF()} property is not supported in the current language profile.
*/
public ExtendedIterator listSuperClasses() {
return listSuperClasses( false );
}
/**
* <p>Answer an iterator over all of the classes that are declared to be super-classes of
* this class. Each element of the iterator will be an {@link OntClass}.
* See {@link #listSubClasses( boolean )} for a full explanation of the <em>direct</em>
* parameter.
* </p>
*
* @param direct If true, only answer the direcly adjacent classes in the
* super-class relation: i.e. eliminate any class for which there is a longer route
* to reach that child under the super-class relation.
* @return an iterator over the resources representing this class's sub-classes.
* @exception OntProfileException If the {@link Profile#SUB_CLASS_OF()} property is not supported in the current language profile.
*/
public ExtendedIterator listSuperClasses( boolean direct ) {
return UniqueExtendedIterator.create(
listDirectPropertyValues( getProfile().SUB_CLASS_OF(), "SUB_CLASS_OF", OntClass.class, getProfile().SUB_CLASS_OF(), direct, false )
.filterDrop( new SingleEqualityFilter( this ) ) );
}
/**
* <p>Answer true if the given class is a super-class of this class.</p>
* @param cls A class to test.
* @return True if the given class is a super-class of this class.
* @exception OntProfileException If the {@link Profile#SUB_CLASS_OF()} property is not supported in the current language profile.
*/
public boolean hasSuperClass( Resource cls ) {
return hasSuperClass( cls, false );
}
/**
* <p>Answer true if this class has any super-class in the model. Note that
* when using a reasoner, all OWL classes have owl:Thing as a super-class.</p>
* @return True if this class has any known super-class.
* @exception OntProfileException If the {@link Profile#SUB_CLASS_OF()} property is not supported in the current language profile.
*/
public boolean hasSuperClass() {
return getSuperClass() != null;
}
/**
* <p>Answer true if the given class is a super-class of this class.
* See {@link #listSubClasses( boolean )} for a full explanation of the <em>direct</em>
* parameter.
* </p>
* @param cls A class to test.
* @param direct If true, only search the classes that are directly adjacent to this
* class in the class hierarchy.
* @return True if the given class is a super-class of this class.
* @exception OntProfileException If the {@link Profile#SUB_CLASS_OF()} property is not supported in the current language profile.
*/
public boolean hasSuperClass( Resource cls, boolean direct ) {
if (!direct) {
// don't need any special case, we just get the property
return hasPropertyValue( getProfile().SUB_CLASS_OF(), "SUB_CLASS_OF", cls );
}
else {
// we want the direct, not general relationship
// first try to find an inf graph that can do the work for us
InfGraph ig = null;
if (getGraph() instanceof InfGraph) {
ig = (InfGraph) getGraph();
}
else if (getGraph() instanceof OntModel) {
OntModel m = (OntModel) getGraph();
if (m.getGraph() instanceof InfGraph) {
ig = (InfGraph) m.getGraph();
}
}
if (ig != null && ig.getReasoner().supportsProperty( ReasonerVocabulary.directSubClassOf )) {
// we can look this up directly
return hasPropertyValue( ReasonerVocabulary.directSubClassOf, "direct sub-class", cls );
}
else {
// otherwise, not an inf-graph or the given inf-graph does not support direct directly (:-)
return hasSuperClassDirect(cls);
}
}
}
/**
* <p>Remove the given class from the super-classes of this class. If this statement
* is not true of the current model, nothing happens.</p>
* @param cls A class to be removed from the super-classes of this class
* @exception OntProfileException If the {@link Profile#SUB_CLASS_OF()} class is not supported in the current language profile.
*/
public void removeSuperClass( Resource cls ) {
removePropertyValue( getProfile().SUB_CLASS_OF(), "SUB_CLASS_OF", cls );
}
/**
* <p>Assert that this class is super-class of the given class. Any existing
* statements for <code>subClassOf</code> on <code>prop</code> will be removed.</p>
* @param cls The class that is a sub-class of this class
* @exception OntProfileException If the {@link Profile#SUB_CLASS_OF()} property is not supported in the current language profile.
*/
public void setSubClass( Resource cls ) {
// first we have to remove all of the inverse sub-class links
checkProfile( getProfile().SUB_CLASS_OF(), "SUB_CLASS_OF" );
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -