📄 ontresourceimpl.java
字号:
/**
* <p>Answer the comment string for this object. If there is
* more than one such resource, an arbitrary selection is made.</p>
* @param lang The language attribute for the desired comment (EN, FR, etc) or null for don't care. Will
* attempt to retreive the most specific comment matching the given language</p>
* @return A comment string matching the given language, or null if there is no matching comment.
* @exception OntProfileException If the {@link Profile#COMMENT()} property is not supported in the current language profile.
*/
public String getComment( String lang ) {
checkProfile( getProfile().COMMENT(), "COMMENT" );
if (lang == null) {
// don't care which language version we get
try {
return getRequiredProperty( getProfile().COMMENT() ).getString();
}
catch (PropertyNotFoundException ignore) {
// no comment :-)
return null;
}
}
else {
// search for the best match for the specified language
return selectLang( listProperties( getProfile().COMMENT() ), lang );
}
}
/**
* <p>Answer an iterator over all of the comment literals for this resource.</p>
* @return An iterator over RDF {@link Literal}'s.
* @exception OntProfileException If the {@link Profile#COMMENT()} property is not supported in the current language profile.
*/
public ExtendedIterator listComments( String lang ) {
checkProfile( getProfile().COMMENT(), "COMMENT" );
return WrappedIterator.create( listProperties( getProfile().COMMENT() ) )
.filterKeep( new LangTagFilter( lang ) )
.mapWith( new ObjectMapper() );
}
/**
* <p>Answer true if this resource has the given comment.</p>
* @param comment The comment to test for
* @param lang The optional language tag, or null for don't care.
* @return True if this resource has <code>comment</code> as a comment.
*/
public boolean hasComment( String comment, String lang ) {
return hasComment( getModel().createLiteral( comment, lang ) );
}
/**
* <p>Answer true if this resource has the given comment.</p>
* @param comment The comment to test for
* @return True if this resource has <code>comment</code> as a comment.
*/
public boolean hasComment( Literal comment ) {
boolean found = false;
ExtendedIterator i = listComments( comment.getLanguage() );
while (!found && i.hasNext()) {
found = comment.equals( i.next() );
}
i.close();
return found;
}
/**
* <p>Remove the statement that the given string is a comment on
* this resource. If this statement
* is not true of the current model, nothing happens.</p>
* @param comment A comment string to be removed
* @param lang A lang tag
*/
public void removeComment( String comment, String lang ) {
removeComment( getModel().createLiteral( comment, lang ) );
}
/**
* <p>Remove the statement that the given string is a comment on
* this resource. If this statement
* is not true of the current model, nothing happens.</p>
* @param comment A comment literal to be removed
*/
public void removeComment( Literal comment ) {
removePropertyValue( getProfile().COMMENT(), "COMMENT", comment );
}
// rdf:type
/**
* <p>Set the RDF type (ie the class) for this resource, replacing any
* existing <code>rdf:type</code> property. Any existing statements for the RDF type
* will first be removed.</p>
*
* @param cls The RDF resource denoting the new value for the <code>rdf:type</code> property,
* which will replace any existing type property.
*/
public void setRDFType( Resource cls ) {
setPropertyValue( RDF.type, "rdf:type", cls );
}
/**
* <p>Add the given class as one of the <code>rdf:type</code>'s for this resource.</p>
*
* @param cls An RDF resource denoting a new value for the <code>rdf:type</code> property.
*/
public void addRDFType( Resource cls ) {
addPropertyValue( RDF.type, "rdf:type", cls );
}
/**
* <p>
* Answer the <code>rdf:type</code> (ie the class) of this resource. If there
* is more than one type for this resource, the return value will be one of
* the values, but it is not specified which one (nor that it will consistently
* be the same one each time). Equivalent to <code>getRDFType( false )</code>.
* </p>
*
* @return A resource that is the rdf:type for this resource, or one of them if
* more than one is defined.
*/
public Resource getRDFType() {
return getRDFType( false );
}
/**
* <p>
* Answer the <code>rdf:type</code> (ie the class) of this resource. If there
* is more than one type for this resource, the return value will be one of
* the values, but it is not specified which one (nor that it will consistently
* be the same one each time).
* </p>
*
* @param direct If true, only consider the direct types of this resource, and not
* the super-classes of the type(s).
* @return A resource that is the rdf:type for this resource, or one of them if
* more than one is defined.
*/
public Resource getRDFType( boolean direct ) {
ExtendedIterator i = null;
try {
i = listRDFTypes( direct );
return i.hasNext() ? (Resource) i.next(): null;
}
finally {
i.close();
}
}
/**
* <p>
* Answer an iterator over the RDF classes to which this resource belongs.
* </p>
*
* @param direct If true, only answer those resources that are direct types
* of this resource, not the super-classes of the class etc.
* @return An iterator over the set of this resource's classes, each of which
* will be a {@link Resource}.
*/
public ExtendedIterator listRDFTypes( boolean direct ) {
Iterator i = listDirectPropertyValues( RDF.type, "rdf:type", null, getProfile().SUB_CLASS_OF(), direct, false );
ExtendedIterator j = WrappedIterator.create( i );
// we only want each result once
return UniqueExtendedIterator.create( j );
}
/**
* <p>
* Answer true if this resource is a member of the class denoted by the
* given URI.</p>
*
* @param uri Denotes the URI of a class to which this value may belong
* @return True if this resource has the given class as one of its <code>rdf:type</code>'s.
*/
public boolean hasRDFType( String uri ) {
return hasRDFType( getModel().getResource( uri ) );
}
/**
* <p>
* Answer true if this resource is a member of the class denoted by the
* given class resource. Includes all available types, so is equivalent to
* <code><pre>
* hasRDF( ontClass, false );
* </pre></code>
* </p>
*
* @param ontClass Denotes a class to which this value may belong
* @return True if this resource has the given class as one of its <code>rdf:type</code>'s.
*/
public boolean hasRDFType( Resource ontClass ) {
return hasRDFType( ontClass, "unknown", false );
}
/**
* <p>
* Answer true if this resource is a member of the class denoted by the
* given class resource.
* </p>
*
* @param ontClass Denotes a class to which this value may belong
* @param direct If true, only consider the direct types of this resource, ignoring
* the super-classes of the stated types.
* @return True if this resource has the given class as one of its <code>rdf:type</code>'s.
*/
public boolean hasRDFType( Resource ontClass, boolean direct ) {
return hasRDFType( ontClass, "unknown", direct );
}
protected boolean hasRDFType( Resource ontClass, String name, boolean direct ) {
checkProfile( ontClass, name );
if (!direct) {
// just an ordinary query - we can answer this directly (more efficient)
return hasPropertyValue( RDF.type, "rdf:type", ontClass );
}
else {
// need the direct version - not so efficient
ExtendedIterator i = null;
try {
i = listRDFTypes( true );
while (i.hasNext()) {
if (ontClass.equals( i.next() )) {
return true;
}
}
return false;
}
finally {
i.close();
}
}
}
/**
* <p>Remove the statement that this resource is of the given RDF type. If this statement
* is not true of the current model, nothing happens.</p>
* @param cls A resource denoting a class that that is to be removed from the classes of this resource
*/
public void removeRDFType( Resource cls ) {
removePropertyValue( RDF.type, "rdf:type", cls );
}
// utility methods
/**
* <p>Answer the cardinality of the given property on this resource. The cardinality
* is the number of distinct values there are for the property.</p>
* @param p A property
* @return The cardinality for the property <code>p</code> on this resource, as an
* integer greater than or equal to zero.
*/
public int getCardinality( Property p ) {
int n = 0;
for (Iterator i = UniqueExtendedIterator.create( listPropertyValues( p ) ); i.hasNext(); n++) {
i.next();
}
return n;
}
/**
* <p>
* Set the value of the given property of this ontology resource to the given
* value, encoded as an RDFNode. Maintains the invariant that there is
* at most one value of the property for a given resource, so existing
* property values are first removed. To add multiple properties, use
* {@link #addProperty( Property, RDFNode ) addProperty}.
* </p>
*
* @param property The property to update
* @param value The new value of the property as an RDFNode, or null to
* effectively remove this property.
*/
public void setPropertyValue( Property property, RDFNode value ) {
// if there is an existing property, remove it
removeAll( property );
// now set the new value
if (value != null) {
addProperty( property, value );
}
}
/**
* <p>Answer the value of a given RDF property for this ontology resource, or null
* if it doesn't have one. The value is returned as an RDFNode, from which
* the concrete data value can be extracted for literals. If the value is
* a resource, it will present the {@link OntResource} facet.
* If there is more than one RDF
* statement with the given property for the current value, it is not defined
* which of the values will be returned.</p>
*
* @param property An RDF property
* @return An RDFNode whose value is the value, or one of the values, of the
* given property. If the property is not defined the method returns null.
*/
public RDFNode getPropertyValue( Property property ) {
Statement s = getProperty( property );
if (s == null) {
return null;
}
else {
return asOntResource( s.getObject() );
}
}
/**
* <p>Answer an iterator over the set of all values for a given RDF property. Each
* value in the iterator will be an RDFNode, representing the value (object) of
* each statement in the underlying model.</p>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -