package org.neo4j.meta.input.owl;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.Serializable;
import java.io.Writer;
import java.text.ParseException;
import java.util.Collection;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;
import org.neo4j.graphdb.Node;
import org.neo4j.graphdb.RelationshipType;
import org.neo4j.graphdb.Transaction;
import org.neo4j.meta.model.ClassRange;
import org.neo4j.meta.model.DataRange;
import org.neo4j.meta.model.MetaModelClass;
import org.neo4j.meta.model.MetaModelObject;
import org.neo4j.meta.model.MetaModelProperty;
import org.neo4j.meta.model.MetaModelRestrictable;
import org.neo4j.meta.model.RdfDatatypeRange;
import org.neo4j.meta.model.ResourceRange;
import org.neo4j.util.GraphDatabaseUtil;
import org.neo4j.util.GraphDbStringSet;
import org.semanticweb.owl.apibinding.OWLManager;
import org.semanticweb.owl.model.OWLAntiSymmetricObjectPropertyAxiom;
import org.semanticweb.owl.model.OWLAxiomAnnotationAxiom;
import org.semanticweb.owl.model.OWLClass;
import org.semanticweb.owl.model.OWLClassAssertionAxiom;
import org.semanticweb.owl.model.OWLClassAxiom;
import org.semanticweb.owl.model.OWLConstant;
import org.semanticweb.owl.model.OWLConstantAnnotation;
import org.semanticweb.owl.model.OWLDataAllRestriction;
import org.semanticweb.owl.model.OWLDataComplementOf;
import org.semanticweb.owl.model.OWLDataExactCardinalityRestriction;
import org.semanticweb.owl.model.OWLDataMaxCardinalityRestriction;
import org.semanticweb.owl.model.OWLDataMinCardinalityRestriction;
import org.semanticweb.owl.model.OWLDataOneOf;
import org.semanticweb.owl.model.OWLDataProperty;
import org.semanticweb.owl.model.OWLDataPropertyAssertionAxiom;
import org.semanticweb.owl.model.OWLDataPropertyAxiom;
import org.semanticweb.owl.model.OWLDataPropertyDomainAxiom;
import org.semanticweb.owl.model.OWLDataPropertyExpression;
import org.semanticweb.owl.model.OWLDataPropertyRangeAxiom;
import org.semanticweb.owl.model.OWLDataRange;
import org.semanticweb.owl.model.OWLDataRangeFacetRestriction;
import org.semanticweb.owl.model.OWLDataRangeRestriction;
import org.semanticweb.owl.model.OWLDataSomeRestriction;
import org.semanticweb.owl.model.OWLDataSubPropertyAxiom;
import org.semanticweb.owl.model.OWLDataType;
import org.semanticweb.owl.model.OWLDataValueRestriction;
import org.semanticweb.owl.model.OWLDeclarationAxiom;
import org.semanticweb.owl.model.OWLDescription;
import org.semanticweb.owl.model.OWLDifferentIndividualsAxiom;
import org.semanticweb.owl.model.OWLDisjointClassesAxiom;
import org.semanticweb.owl.model.OWLDisjointDataPropertiesAxiom;
import org.semanticweb.owl.model.OWLDisjointObjectPropertiesAxiom;
import org.semanticweb.owl.model.OWLDisjointUnionAxiom;
import org.semanticweb.owl.model.OWLEntityAnnotationAxiom;
import org.semanticweb.owl.model.OWLEquivalentClassesAxiom;
import org.semanticweb.owl.model.OWLEquivalentDataPropertiesAxiom;
import org.semanticweb.owl.model.OWLEquivalentObjectPropertiesAxiom;
import org.semanticweb.owl.model.OWLFunctionalDataPropertyAxiom;
import org.semanticweb.owl.model.OWLFunctionalObjectPropertyAxiom;
import org.semanticweb.owl.model.OWLImportsDeclaration;
import org.semanticweb.owl.model.OWLIndividual;
import org.semanticweb.owl.model.OWLInverseFunctionalObjectPropertyAxiom;
import org.semanticweb.owl.model.OWLInverseObjectPropertiesAxiom;
import org.semanticweb.owl.model.OWLIrreflexiveObjectPropertyAxiom;
import org.semanticweb.owl.model.OWLNegativeDataPropertyAssertionAxiom;
import org.semanticweb.owl.model.OWLNegativeObjectPropertyAssertionAxiom;
import org.semanticweb.owl.model.OWLObject;
import org.semanticweb.owl.model.OWLObjectAllRestriction;
import org.semanticweb.owl.model.OWLObjectAnnotation;
import org.semanticweb.owl.model.OWLObjectComplementOf;
import org.semanticweb.owl.model.OWLObjectExactCardinalityRestriction;
import org.semanticweb.owl.model.OWLObjectIntersectionOf;
import org.semanticweb.owl.model.OWLObjectMaxCardinalityRestriction;
import org.semanticweb.owl.model.OWLObjectMinCardinalityRestriction;
import org.semanticweb.owl.model.OWLObjectOneOf;
import org.semanticweb.owl.model.OWLObjectProperty;
import org.semanticweb.owl.model.OWLObjectPropertyAssertionAxiom;
import org.semanticweb.owl.model.OWLObjectPropertyAxiom;
import org.semanticweb.owl.model.OWLObjectPropertyChainSubPropertyAxiom;
import org.semanticweb.owl.model.OWLObjectPropertyDomainAxiom;
import org.semanticweb.owl.model.OWLObjectPropertyExpression;
import org.semanticweb.owl.model.OWLObjectPropertyInverse;
import org.semanticweb.owl.model.OWLObjectPropertyRangeAxiom;
import org.semanticweb.owl.model.OWLObjectSelfRestriction;
import org.semanticweb.owl.model.OWLObjectSomeRestriction;
import org.semanticweb.owl.model.OWLObjectSubPropertyAxiom;
import org.semanticweb.owl.model.OWLObjectUnionOf;
import org.semanticweb.owl.model.OWLObjectValueRestriction;
import org.semanticweb.owl.model.OWLOntology;
import org.semanticweb.owl.model.OWLOntologyAnnotationAxiom;
import org.semanticweb.owl.model.OWLOntologyCreationException;
import org.semanticweb.owl.model.OWLOntologyManager;
import org.semanticweb.owl.model.OWLProperty;
import org.semanticweb.owl.model.OWLReflexiveObjectPropertyAxiom;
import org.semanticweb.owl.model.OWLSameIndividualsAxiom;
import org.semanticweb.owl.model.OWLSubClassAxiom;
import org.semanticweb.owl.model.OWLSymmetricObjectPropertyAxiom;
import org.semanticweb.owl.model.OWLTransitiveObjectPropertyAxiom;
import org.semanticweb.owl.model.OWLTypedConstant;
import org.semanticweb.owl.model.OWLUntypedConstant;
import org.semanticweb.owl.model.SWRLAtomConstantObject;
import org.semanticweb.owl.model.SWRLAtomDVariable;
import org.semanticweb.owl.model.SWRLAtomIVariable;
import org.semanticweb.owl.model.SWRLAtomIndividualObject;
import org.semanticweb.owl.model.SWRLBuiltInAtom;
import org.semanticweb.owl.model.SWRLClassAtom;
import org.semanticweb.owl.model.SWRLDataRangeAtom;
import org.semanticweb.owl.model.SWRLDataValuedPropertyAtom;
import org.semanticweb.owl.model.SWRLDifferentFromAtom;
import org.semanticweb.owl.model.SWRLObjectPropertyAtom;
import org.semanticweb.owl.model.SWRLRule;
import org.semanticweb.owl.model.SWRLSameAsAtom;
import org.semanticweb.owl.util.OWLObjectVisitorAdapter;
import org.semanticweb.owl.vocab.OWLXMLVocabulary;
/**
* Utility for reading the ontologies an filling the meta model
* {@link MetaManager} and the in-memory representation {@link OwlModel}
* with all the properties, classes and restrictions from the ontologies.
*/
class Owl2GraphDbUtil
{
private static enum RelTypes implements RelationshipType
{
REF_OWL_2_NEO_ONTOLOGIES,
OWL_2_NEO_ONTOLOGY,
}
private OWLOntologyManager owl;
private Owl2GraphDb owl2GraphDb;
private Set<String> ontologyBaseUris = new HashSet<String>();
Owl2GraphDbUtil( Owl2GraphDb owl2GraphDb )
{
this.owl2GraphDb = owl2GraphDb;
initialize();
}
private void initialize()
{
this.owl = OWLManager.createOWLOntologyManager();
}
private void putOwlFile( File owlFile )
{
try
{
owl.loadOntology( owlFile.toURI() );
getStoredOntologies().add( readFile( owlFile ) );
}
catch ( OWLOntologyCreationException e )
{
throw new RuntimeException( e );
}
}
private Node getReferenceNode()
{
return new GraphDatabaseUtil( owl2GraphDb.getGraphDb() ).getOrCreateSubReferenceNode(
RelTypes.REF_OWL_2_NEO_ONTOLOGIES );
}
private Collection<String> getStoredOntologies()
{
return new GraphDbStringSet( getReferenceNode(),
RelTypes.OWL_2_NEO_ONTOLOGY );
}
private String readFile( File file )
{
BufferedReader input = null;
try
{
input = new BufferedReader( new InputStreamReader(
new FileInputStream( file ) ) );
StringBuffer buffer = new StringBuffer();
char[] readBuffer = new char[ 4000 ];
int charsRead = -1;
do
{
charsRead = input.read( readBuffer );
if ( charsRead != -1 )
{
buffer.append( readBuffer, 0, charsRead );
}
}
while ( charsRead != -1 );
return buffer.toString();
}
catch ( IOException e )
{
throw new RuntimeException( e );
}
finally
{
IoUtil.safeClose( input );
}
}
private File storeToTempFile( String string )
{
Writer writer = null;
try
{
File file = File.createTempFile( "owl", "neo" );
writer = new FileWriter( file );
writer.write( string );
return file;
}
catch ( IOException e )
{
throw new RuntimeException( e );
}
finally
{
IoUtil.safeClose( writer );
}
}
private String getOntologyUri( String entireOntologyAsString )
{
String lookFor = "xmlns";
int startIndex = -1;
for ( int tempIndex = 0; true; )
{
tempIndex = entireOntologyAsString.indexOf( lookFor, tempIndex );
if ( tempIndex == -1 )
{
break;
}
else
{
char consecutiveChar = entireOntologyAsString.charAt(
tempIndex + lookFor.length() );
if ( consecutiveChar == ':' )
{
continue;
}
startIndex = tempIndex + lookFor.length();
while ( " =".indexOf(
entireOntologyAsString.charAt( startIndex ) ) != -1 )
{
startIndex++;
}
break;
}
}
if ( startIndex == -1 )
{
throw new RuntimeException( "Missing '" + lookFor + "'" );
}
startIndex += lookFor.length();
int endIndex = entireOntologyAsString.indexOf( "\"", startIndex );
if ( endIndex == -1 )
{
throw new RuntimeException( "No end for '" + lookFor + "'" );
}
String result =
entireOntologyAsString.substring( startIndex, endIndex );
if ( result.endsWith( "#" ) )
{
result = result.substring( 0, result.length() - 1 );
}
return result;
}
/**
* Performs the sync from the ontologies to a Neo4j representation,
* using {@link Owl2GraphDb#getMetaModel()}.
* @param ontologies an array of files, containing ontologies
* (in RDF XML format), to sync.
* @param clearPreviousOntologies whether or not to remove previously stored
* ontologies (ontologies are stored in Neo4j after each sync).
*/
public void syncOntologiesWithGraphDbRepresentation(
boolean clearPreviousOntologies, File... ontologies )
{
Transaction tx = owl2GraphDb.getGraphDb().beginTx();
try
{
if ( clearPreviousOntologies )
{
getStoredOntologies().clear();
}
Map<String, String> updates = checkForNewOntologies( ontologies );
for ( String ontologyString : getStoredOntologies() )
{
// Well, this is a little awkwaard... but the ontology manager
// will complain if it doesn't get a File as the source of
// the ontology.
File ontologyFile = storeToTempFile( ontologyString );
this.putOwlFile( ontologyFile );
IoUtil.safeDelete( ontologyFile );
}
this.syncOntologies();
sendUpdateEvents( updates );
tx.success();
}
finally
{
tx.finish();
}
}
private void sendUpdateEvents( Map<String, String> updates )
{
for ( Map.Entry<String, String> entry : updates.entrySet() )
{
for ( OntologyChangeHandler handler :
owl2GraphDb.getOntologyChangeHandlers() )
{
String ontologyUri = entry.getKey();
if ( entry.getValue().equals( "updated" ) )
{
handler.ontologyUpdated( ontologyUri );
}
else
{
handler.ontologyAdded( ontologyUri );
}
}
}
}
private Map<String, String> checkForNewOntologies( File... ontologies )
{
Map<String, String> result = new HashMap<String, String>();
Collection<String> storedOntologies = getStoredOntologies();
Map<String, String> map = new HashMap<String, String>();
for ( String ontologyString : getStoredOntologies() )
{
map.put( getOntologyUri( ontologyString ), ontologyString );
}
for ( File ontology : ontologies )
{
String ontologyString = readFile( ontology );
String ontologyUri = getOntologyUri( ontologyString );
if ( map.containsKey( ontologyUri ) )
{
if ( !ontologyString.equals( map.get( ontologyUri ) ) )
{
storedOntologies.remove( map.get( ontologyUri ) );
storedOntologies.add( ontologyString );
result.put( ontologyUri, "updated" );
}
}
else
{
storedOntologies.add( ontologyString );
result.put( ontologyUri, "added" );
}
}
return result;
}
String[] getOntologyBaseUris()
{
return ontologyBaseUris.toArray(
new String[ ontologyBaseUris.size() ] );
}
private void syncOntologies()
{
for ( OWLOntology ontology : owl.getOntologies() )
{
this.ontologyBaseUris.add( ontology.getURI().toString() );
// Sync classes
for ( OWLClass owlClass : ontology.getReferencedClasses() )
{
this.syncClass( ontology, owlClass );
}
// Sync properties
for ( OWLProperty owlProperty :
ontology.getReferencedDataProperties() )
{
this.syncProperty( ontology, owlProperty );
}
for ( OWLProperty owlProperty :
ontology.getReferencedObjectProperties() )
{
this.syncProperty( ontology, owlProperty );
}
}
}
private void syncClass( OWLOntology ontology, OWLClass owlClass )
{
System.out.println( "class " + owlClass.getURI().toString() );
MetaModelClass modelClass =
getMetaClass( owlClass.getURI().toString() );
TheVisitor visitor = new TheVisitor( modelClass );
for ( OWLClassAxiom axiom : ontology.getAxioms( owlClass ) )
{
axiom.accept( visitor );
}
}
private void syncProperty( OWLOntology ontology, OWLProperty owlProperty )
{
TheVisitor visitor = new TheVisitor(
getModelProperty( owlProperty.getURI().toString() ) );
if ( owlProperty instanceof OWLDataProperty )
{
addPropertyType( owlProperty.getURI().toString(),
OWLXMLVocabulary.DATA_PROPERTY.getURI().toString() );
for ( OWLDataPropertyAxiom axiom :
ontology.getAxioms( ( OWLDataProperty ) owlProperty ) )
{
axiom.accept( visitor );
}
}
else
{
addPropertyType( owlProperty.getURI().toString(),
OWLXMLVocabulary.OBJECT_PROPERTY.getURI().toString() );
for ( OWLObjectPropertyAxiom axiom :
ontology.getAxioms( ( OWLObjectProperty ) owlProperty ) )
{
axiom.accept( visitor );
}
}
}
private MetaModelClass getMetaClass( String uri )
{
return this.owl2GraphDb.getMetaModel().getGlobalNamespace().getMetaClass(
uri, true );
}
private MetaModelProperty getModelProperty( String uri )
{
return this.owl2GraphDb.getMetaModel().getGlobalNamespace().getMetaProperty(
uri, true );
}
private MetaModelClass getNodeTypeForClassOrUnion(
OWLDescription description )
{
if ( !description.isAnonymous() )
{
return getMetaClass( description.asOWLClass().getURI().toString() );
}
return getOrCreateNodeTypeForUnion( getAllClasses( description ) );
}
private Set<String> getAllClasses( OWLDescription description )
{
Set<String> classes = new HashSet<String>();
if ( description instanceof OWLClass &&
!description.asOWLClass().isAnonymous() )
{
classes.add( description.asOWLClass().getURI().toString() );
}
else if ( description instanceof OWLObjectUnionOf )
{
OWLObjectUnionOf unionOf = ( OWLObjectUnionOf ) description;
for ( OWLDescription d : unionOf.getOperands() )
{
if ( d.isAnonymous() )
{
// System.out.println( "Anonymous class (not supported!) " +
// d );
continue;
}
classes.add( d.asOWLClass().getURI().toString() );
}
}
else if ( description instanceof OWLObjectIntersectionOf )
{
handleUnsupported( description );
}
else if ( description instanceof OWLObjectComplementOf )
{
handleUnsupported( description );
}
else if ( description instanceof OWLObjectOneOf )
{
// TODO
OWLObjectOneOf oneOf = ( OWLObjectOneOf ) description;
for ( OWLIndividual individual : oneOf.getIndividuals() )
{
classes.add( individual.getURI().toString() );
}
}
else
{
handleUnsupported( description );
}
return classes;
}
private void handleUnsupported( OWLObject construct )
{
this.owl2GraphDb.getUnsupportedConstructHandler().handle( construct );
}
private MetaModelClass getOrCreateNodeTypeForUnion(
Set<String> classes )
{
MetaModelClass result = null;
for ( MetaModelClass nodeType : this.owl2GraphDb
.getMetaModel().getGlobalNamespace().getMetaClasses() )
{
if ( typeMatches( nodeType, classes ) )
{
result = nodeType;
break;
}
}
if ( result == null )
{
result = createUnionSuperType( classes );
}
return result;
}
private boolean typeMatches( MetaModelClass typeToTest,
Set<String> classes )
{
Collection<MetaModelClass> subTypes = typeToTest.getDirectSubs();
if ( subTypes.size() != classes.size() )
{
return false;
}
for ( MetaModelClass subType : subTypes )
{
if ( !classes.contains( subType.getName() ) )
{
return false;
}
}
return true;
}
private MetaModelClass createUnionSuperType( Set<String> classes )
{
String name = "";
for ( String className : classes )
{
if ( name.length() > 0 )
{
name += ",";
}
name += className;
}
name = "Union[" + name + "]";
MetaModelClass type = getMetaClass( name );
for ( String cls : classes )
{
type.getDirectSubs().add( getMetaClass( cls ) );
}
return type;
}
private void addPropertyType( String propertyUri, String propertyType )
{
MetaModelProperty property = getModelProperty( propertyUri );
if ( propertyType.equals(
OWLXMLVocabulary.FUNCTIONAL_DATA_PROPERTY.getURI().toString() ) ||
propertyType.equals(
OWLXMLVocabulary.FUNCTIONAL_OBJECT_PROPERTY.getURI().toString() ) )
{
property.setAdditionalProperty( MetaModelObject.KEY_FUNCTIONALITY,
"functional" );
}
else if ( propertyType.equals(
OWLXMLVocabulary.SYMMETRIC_OBJECT_PROPERTY.getURI().toString() ) )
{
property.setAdditionalProperty( MetaModelObject.KEY_FUNCTIONALITY,
"symmetric" );
}
else if ( propertyType.equals(
OWLXMLVocabulary.TRANSITIVE_OBJECT_PROPERTY.getURI().toString() ) )
{
property.setAdditionalProperty( MetaModelObject.KEY_FUNCTIONALITY,
"transitive" );
}
}
/**
* This visitor gets notifications about all the class/restriction/property
* attributes such as range, domain, cardinality a.s.o.
*
* It contains many unimplemented <code>visit</code> methods which will
* get implemented on demand when the ontologies requires it. They are
* there right now, throwing {@link UnsupportedOperationException} for
* all methods which are currently unimplemented to give a signal that
* the ontologies contains some logic which this visitor currently doesn't
* handle (and hence should be implemented).
*/
private class TheVisitor extends OWLObjectVisitorAdapter
{
private MetaModelClass modelClass;
private MetaModelProperty modelProperty;
TheVisitor( MetaModelClass modelClass )
{
this.modelClass = modelClass;
}
TheVisitor( MetaModelProperty modelProperty )
{
this.modelProperty = modelProperty;
}
// private void set( String propertyUri, String key, Object value )
// {
// set( propertyUri, Collections.singletonMap( key, value ) );
// }
//
// private void set( String propertyUri, Map<String, Object> values )
// {
// MetaModelProperty modelProperty = getModelProperty( propertyUri );
// MetaModelRestrictable restriction = modelProperty;
// if ( this.modelClass != null )
// {
// // This is for a class, hence it's a restriction
// restriction = modelClass.getRestriction( modelProperty, true );
// }
//
// for ( String key : values.keySet() )
// {
// // TODO
//// restriction.set( key, values.get( key ) );
// }
// }
private MetaModelRestrictable getRestrictable( String propertyUri )
{
MetaModelProperty modelProperty = getModelProperty( propertyUri );
MetaModelRestrictable restriction = modelProperty;
if ( this.modelClass != null )
{
// This is for a class, hence it's a restriction
restriction = modelClass.getRestriction( modelProperty, true );
}
return restriction;
}
private void addDomain( String propertyUri, String domainClass )
{
MetaModelProperty property = getModelProperty( propertyUri );
MetaModelClass metaClass = getMetaClass( domainClass );
metaClass.getDirectProperties().add( property );
}
private String getPropertyUri( OWLDataPropertyExpression property )
{
return ( ( OWLDataProperty ) property ).getURI().toString();
}
private String getPropertyUri( OWLObjectPropertyExpression property )
{
return ( ( OWLObjectProperty ) property ).getURI().toString();
}
private void visitSubPropertyOf( String superPropertyUri,
String subPropertyUri )
{
MetaModelProperty superProperty =
getModelProperty( superPropertyUri );
MetaModelProperty subProperty = getModelProperty( subPropertyUri );
subProperty.getDirectSupers().add( superProperty );
}
private void visitAllRestriction( String propertyUri,
OWLDescription filler )
{
MetaModelClass metaClass = getNodeTypeForClassOrUnion( filler );
getRestrictable( propertyUri ).setRange(
new ClassRange( metaClass ) );
}
private void visitPropertyDomain( String propertyUri,
OWLDescription domain )
{
MetaModelProperty property = getModelProperty( propertyUri );
for ( String className : getAllClasses( domain ) )
{
addDomain( property.getName(), className );
}
}
@Override
public void visit( OWLClass value )
{
MetaModelClass superType =
getMetaClass( value.getURI().toString() );
modelClass.getDirectSupers().add( superType );
}
@Override
public void visit( OWLDataMaxCardinalityRestriction value )
{
getRestrictable( getPropertyUri( value.getProperty() ) )
.setMaxCardinality( value.getCardinality() );
}
@Override
public void visit( OWLDataMinCardinalityRestriction value )
{
getRestrictable( getPropertyUri( value.getProperty() ) )
.setMinCardinality( value.getCardinality() );
}
@Override
public void visit( OWLDataExactCardinalityRestriction value )
{
MetaModelRestrictable restrictable =
getRestrictable( getPropertyUri( value.getProperty() ) );
restrictable.setMaxCardinality( value.getCardinality() );
restrictable.setMinCardinality( value.getCardinality() );
}
@Override
public void visit( OWLDataAllRestriction value )
{
handleUnsupported( value );
}
@Override
public void visit( OWLDataSomeRestriction value )
{
handleUnsupported( value );
}
@Override
public void visit( OWLDataValueRestriction value )
{
handleUnsupported( value );
}
@Override
public void visit( OWLDataPropertyRangeAxiom value )
{
OWLDataRange range = value.getRange();
String propertyUri = getPropertyUri( value.getProperty() );
Object rangeValue = null;
String datatypeUri = null;
if ( range instanceof OWLDataType )
{
datatypeUri = ( ( OWLDataType ) range ).getURI().toString();
rangeValue = RdfUtil.getDatatypeClass( datatypeUri );
}
else if ( range instanceof OWLDataOneOf )
{
OWLDataOneOf oneOf = ( OWLDataOneOf ) range;
Set<Serializable> values = new HashSet<Serializable>();
for ( OWLConstant aValue : oneOf.getValues() )
{
String stringValue = aValue.getLiteral();
Serializable realValue = null;
if ( aValue.isTyped() )
{
datatypeUri = aValue.asOWLTypedConstant().
getDataType().getURI().toString();
try
{
realValue = ( Serializable ) RdfUtil.getRealValue(
datatypeUri, stringValue );
}
catch ( ParseException e )
{
throw new RuntimeException( e );
}
}
else
{
realValue = stringValue;
}
values.add( realValue );
}
rangeValue = values;
}
// TODO complementOf, intersectionOf?
else
{
throw new RuntimeException( "Unknown range type " + range +
":" + range.getClass().getName() );
}
if ( rangeValue instanceof Collection<?> )
{
getRestrictable( propertyUri ).setRange(
new DataRange( datatypeUri, ( ( Collection<?> )
rangeValue ).toArray() ) );
}
else if ( datatypeUri != null )
{
getRestrictable( propertyUri ).setRange(
new RdfDatatypeRange( datatypeUri ) );
}
}
@Override
public void visit( OWLFunctionalDataPropertyAxiom value )
{
addPropertyType( getPropertyUri( value.getProperty() ),
OWLXMLVocabulary.FUNCTIONAL_DATA_PROPERTY.getURI().toString() );
}
@Override
public void visit( OWLDataPropertyDomainAxiom value )
{
visitPropertyDomain( getPropertyUri( value.getProperty() ),
value.getDomain() );
}
@Override
public void visit( OWLDataSubPropertyAxiom value )
{
visitSubPropertyOf( getPropertyUri( value.getSuperProperty() ),
getPropertyUri( value.getSubProperty() ) );
}
@Override
public void visit( OWLObjectAllRestriction value )
{
visitAllRestriction( getPropertyUri( value.getProperty() ),
value.getFiller() );
}
@Override
public void visit( OWLObjectComplementOf value )
{
handleUnsupported( value );
}
@Override
public void visit( OWLObjectIntersectionOf value )
{
handleUnsupported( value );
}
@Override
public void visit( OWLObjectOneOf value )
{
handleUnsupported( value );
}
@Override
public void visit( OWLObjectSomeRestriction value )
{
visitAllRestriction( getPropertyUri( value.getProperty() ),
value.getFiller() );
}
@Override
public void visit( OWLObjectUnionOf value )
{
handleUnsupported( value );
}
@Override
public void visit( OWLObjectValueRestriction value )
{
// This represents an object
getRestrictable( getPropertyUri( value.getProperty() ) )
.setRange( new ResourceRange(
value.getValue().getURI().toString() ) );
}
@Override
public void visit( OWLObjectMaxCardinalityRestriction value )
{
getRestrictable( getPropertyUri( value.getProperty() ) )
.setMaxCardinality( value.getCardinality() );
}
@Override
public void visit( OWLObjectMinCardinalityRestriction value )
{
getRestrictable( getPropertyUri( value.getProperty() ) )
.setMinCardinality( value.getCardinality() );
}
@Override
public void visit( OWLObjectExactCardinalityRestriction value )
{
MetaModelRestrictable restrictable =
getRestrictable( getPropertyUri( value.getProperty() ) );
restrictable.setMaxCardinality( value.getCardinality() );
restrictable.setMinCardinality( value.getCardinality() );
}
@Override
public void visit( OWLFunctionalObjectPropertyAxiom value )
{
addPropertyType( getPropertyUri( value.getProperty() ),
OWLXMLVocabulary.FUNCTIONAL_OBJECT_PROPERTY.getURI().
toString() );
}
@Override
public void visit( OWLObjectPropertyDomainAxiom value )
{
visitPropertyDomain( getPropertyUri( value.getProperty() ),
value.getDomain() );
}
@Override
public void visit( OWLObjectPropertyRangeAxiom value )
{
OWLDescription range = value.getRange();
MetaModelClass rangeValue = getNodeTypeForClassOrUnion( range );
String propertyUri = getPropertyUri( value.getProperty() );
getRestrictable( propertyUri ).setRange(
new ClassRange( rangeValue ) );
}
@Override
public void visit( OWLObjectSelfRestriction value )
{
handleUnsupported( value );
}
@Override
public void visit( OWLAntiSymmetricObjectPropertyAxiom value )
{
handleUnsupported( value );
}
@Override
public void visit( OWLAxiomAnnotationAxiom value )
{
handleUnsupported( value );
}
@Override
public void visit( OWLClassAssertionAxiom value )
{
handleUnsupported( value );
}
@Override
public void visit( OWLConstantAnnotation value )
{
handleUnsupported( value );
}
@Override
public void visit( OWLDataComplementOf value )
{
handleUnsupported( value );
}
@Override
public void visit( OWLDataOneOf value )
{
handleUnsupported( value );
}
@Override
public void visit( OWLDataProperty value )
{
handleUnsupported( value );
}
@Override
public void visit( OWLDataPropertyAssertionAxiom value )
{
handleUnsupported( value );
}
@Override
public void visit( OWLDataRangeFacetRestriction value )
{
handleUnsupported( value );
}
@Override
public void visit( OWLDataRangeRestriction value )
{
handleUnsupported( value );
}
@Override
public void visit( OWLDeclarationAxiom value )
{
handleUnsupported( value );
}
@Override
public void visit( OWLDifferentIndividualsAxiom value )
{
handleUnsupported( value );
}
@Override
public void visit( OWLDisjointClassesAxiom value )
{
handleUnsupported( value );
}
@Override
public void visit( OWLDisjointDataPropertiesAxiom value )
{
handleUnsupported( value );
}
@Override
public void visit( OWLDisjointObjectPropertiesAxiom value )
{
handleUnsupported( value );
}
@Override
public void visit( OWLDisjointUnionAxiom value )
{
handleUnsupported( value );
}
@Override
public void visit( OWLEntityAnnotationAxiom value )
{
handleUnsupported( value );
}
@Override
public void visit( OWLEquivalentClassesAxiom value )
{
handleUnsupported( value );
}
@Override
public void visit( OWLEquivalentDataPropertiesAxiom value )
{
// for ( OWLDataPropertyExpression p : value.getProperties() )
// {
// OWLDataProperty property = ( OWLDataProperty ) p;
// String uri = property.getURI().toString();
// if ( !uri.equals( modelProperty.getRdfAbout() ) )
// {
// modelProperty.equivalentThing().set(
// getModelProperty( uri ) );
// }
// }
handleUnsupported( value );
}
@Override
public void visit( OWLEquivalentObjectPropertiesAxiom value )
{
handleUnsupported( value );
}
@Override
public void visit( OWLImportsDeclaration value )
{
handleUnsupported( value );
}
@Override
public void visit( OWLInverseFunctionalObjectPropertyAxiom value )
{
handleUnsupported( value );
}
@Override
public void visit( OWLInverseObjectPropertiesAxiom value )
{
MetaModelProperty property1 =
getModelProperty( getPropertyUri( value.getFirstProperty() ) );
MetaModelProperty property2 =
getModelProperty( getPropertyUri( value.getSecondProperty() ) );
property1.setInverseOf( property2 );
}
@Override
public void visit( OWLIrreflexiveObjectPropertyAxiom value )
{
handleUnsupported( value );
}
@Override
public void visit( OWLNegativeDataPropertyAssertionAxiom value )
{
handleUnsupported( value );
}
@Override
public void visit( OWLNegativeObjectPropertyAssertionAxiom value )
{
handleUnsupported( value );
}
@Override
public void visit( OWLObjectAnnotation value )
{
handleUnsupported( value );
}
@Override
public void visit( OWLObjectProperty value )
{
handleUnsupported( value );
}
@Override
public void visit( OWLObjectPropertyAssertionAxiom value )
{
handleUnsupported( value );
}
@Override
public void visit( OWLObjectPropertyChainSubPropertyAxiom value )
{
handleUnsupported( value );
}
@Override
public void visit( OWLObjectPropertyInverse value )
{
handleUnsupported( value );
}
@Override
public void visit( OWLObjectSubPropertyAxiom value )
{
visitSubPropertyOf( getPropertyUri( value.getSuperProperty() ),
getPropertyUri( value.getSubProperty() ) );
}
@Override
public void visit( OWLOntologyAnnotationAxiom value )
{
handleUnsupported( value );
}
@Override
public void visit( OWLReflexiveObjectPropertyAxiom value )
{
handleUnsupported( value );
}
@Override
public void visit( OWLSameIndividualsAxiom value )
{
handleUnsupported( value );
}
@Override
public void visit( OWLSubClassAxiom value )
{
value.getSuperClass().accept( this );
}
@Override
public void visit( OWLSymmetricObjectPropertyAxiom value )
{
addPropertyType( getPropertyUri( value.getProperty() ),
OWLXMLVocabulary.SYMMETRIC_OBJECT_PROPERTY.getURI().
toString() );
}
@Override
public void visit( OWLTransitiveObjectPropertyAxiom value )
{
addPropertyType( getPropertyUri( value.getProperty() ),
OWLXMLVocabulary.TRANSITIVE_OBJECT_PROPERTY.getURI().
toString() );
}
@Override
public void visit( OWLDataType value )
{
handleUnsupported( value );
}
@Override
public void visit( OWLIndividual value )
{
handleUnsupported( value );
}
@Override
public void visit( OWLOntology value )
{
handleUnsupported( value );
}
@Override
public void visit( OWLTypedConstant value )
{
handleUnsupported( value );
}
@Override
public void visit( OWLUntypedConstant value )
{
handleUnsupported( value );
}
@Override
public void visit( SWRLAtomConstantObject value )
{
handleUnsupported( value );
}
@Override
public void visit( SWRLAtomDVariable value )
{
handleUnsupported( value );
}
@Override
public void visit( SWRLAtomIndividualObject value )
{
handleUnsupported( value );
}
@Override
public void visit( SWRLAtomIVariable value )
{
handleUnsupported( value );
}
@Override
public void visit( SWRLBuiltInAtom value )
{
handleUnsupported( value );
}
@Override
public void visit( SWRLClassAtom value )
{
handleUnsupported( value );
}
@Override
public void visit( SWRLDataRangeAtom value )
{
handleUnsupported( value );
}
@Override
public void visit( SWRLDataValuedPropertyAtom value )
{
handleUnsupported( value );
}
@Override
public void visit( SWRLDifferentFromAtom value )
{
handleUnsupported( value );
}
@Override
public void visit( SWRLObjectPropertyAtom value )
{
handleUnsupported( value );
}
@Override
public void visit( SWRLRule value )
{
handleUnsupported( value );
}
@Override
public void visit( SWRLSameAsAtom value )
{
handleUnsupported( value );
}
}
}