From a2d307e8aae141f0735200cbfc70a80876a3fad7 Mon Sep 17 00:00:00 2001 From: Maged Elaasar Date: Thu, 5 Nov 2020 16:53:13 -0800 Subject: [PATCH] Upgrade to OML 0.8.0 --- owl-adapter/.project => .project | 0 .../org.eclipse.buildship.core.prefs | 0 .travis.yml | 3 - owl-adapter/build.gradle => build.gradle | 10 +- .../gradle.properties => gradle.properties | 0 .../gradle => gradle}/maven-deployment.gradle | 0 .../gradle => gradle}/source-layout.gradle | 6 - .../wrapper/gradle-wrapper.jar | Bin .../wrapper/gradle-wrapper.properties | 0 owl-adapter/gradlew => gradlew | 0 owl-adapter/gradlew.bat => gradlew.bat | 0 .../.classpath | 2 +- .../.project | 0 .../org.eclipse.buildship.core.prefs | 0 .../.settings/org.eclipse.jdt.core.prefs | 0 .../README.md | 0 .../build.gradle | 0 .../io/opencaesar/oml2owl/Oml2OwlTask.java | 0 oml2owl-gradle/src/main/resources/version.txt | 1 + {owl-adapter/oml2owl => oml2owl}/.classpath | 8 +- {owl-adapter/oml2owl => oml2owl}/.project | 0 .../org.eclipse.buildship.core.prefs | 0 .../.settings/org.eclipse.jdt.core.prefs | 0 {owl-adapter/oml2owl => oml2owl}/README.md | 0 {owl-adapter/oml2owl => oml2owl}/build.gradle | 1 + .../oml2owl/CloseDescriptionBundle.java | 17 +- .../oml2owl/CloseVocabularyBundle.java | 0 .../java/io/opencaesar/oml2owl/Oml2Owl.java | 935 ++++++++++++++++++ .../io/opencaesar/oml2owl/Oml2OwlApp.java | 282 ++++++ .../io/opencaesar/oml2owl/OmlConstants.java | 44 + .../java/io/opencaesar/oml2owl/OwlApi.java | 580 +++++++++++ oml2owl/src/main/resources/version.txt | 1 + .../src/main/resources/version.txt | 1 - .../java/io/opencaesar/oml2owl/Oml2Owl.xtend | 649 ------------ .../io/opencaesar/oml2owl/Oml2OwlApp.xtend | 277 ------ .../io/opencaesar/oml2owl/OmlConstants.xtend | 48 - .../java/io/opencaesar/oml2owl/OwlApi.xtend | 507 ---------- .../oml2owl/src/main/resources/version.txt | 1 - .../settings.gradle => settings.gradle | 0 39 files changed, 1862 insertions(+), 1511 deletions(-) rename owl-adapter/.project => .project (100%) rename {owl-adapter/.settings => .settings}/org.eclipse.buildship.core.prefs (100%) rename owl-adapter/build.gradle => build.gradle (88%) rename owl-adapter/gradle.properties => gradle.properties (100%) rename {owl-adapter/gradle => gradle}/maven-deployment.gradle (100%) rename {owl-adapter/gradle => gradle}/source-layout.gradle (81%) rename {owl-adapter/gradle => gradle}/wrapper/gradle-wrapper.jar (100%) rename {owl-adapter/gradle => gradle}/wrapper/gradle-wrapper.properties (100%) rename owl-adapter/gradlew => gradlew (100%) rename owl-adapter/gradlew.bat => gradlew.bat (100%) rename {owl-adapter/oml2owl-gradle => oml2owl-gradle}/.classpath (87%) rename {owl-adapter/oml2owl-gradle => oml2owl-gradle}/.project (100%) rename {owl-adapter/oml2owl-gradle => oml2owl-gradle}/.settings/org.eclipse.buildship.core.prefs (100%) rename {owl-adapter/oml2owl-gradle => oml2owl-gradle}/.settings/org.eclipse.jdt.core.prefs (100%) rename {owl-adapter/oml2owl-gradle => oml2owl-gradle}/README.md (100%) rename {owl-adapter/oml2owl-gradle => oml2owl-gradle}/build.gradle (100%) rename {owl-adapter/oml2owl-gradle => oml2owl-gradle}/src/main/java/io/opencaesar/oml2owl/Oml2OwlTask.java (100%) create mode 100755 oml2owl-gradle/src/main/resources/version.txt rename {owl-adapter/oml2owl => oml2owl}/.classpath (68%) rename {owl-adapter/oml2owl => oml2owl}/.project (100%) rename {owl-adapter/oml2owl => oml2owl}/.settings/org.eclipse.buildship.core.prefs (100%) rename {owl-adapter/oml2owl => oml2owl}/.settings/org.eclipse.jdt.core.prefs (100%) rename {owl-adapter/oml2owl => oml2owl}/README.md (100%) rename {owl-adapter/oml2owl => oml2owl}/build.gradle (86%) rename {owl-adapter/oml2owl => oml2owl}/src/main/java/io/opencaesar/oml2owl/CloseDescriptionBundle.java (98%) rename {owl-adapter/oml2owl => oml2owl}/src/main/java/io/opencaesar/oml2owl/CloseVocabularyBundle.java (100%) create mode 100644 oml2owl/src/main/java/io/opencaesar/oml2owl/Oml2Owl.java create mode 100644 oml2owl/src/main/java/io/opencaesar/oml2owl/Oml2OwlApp.java create mode 100644 oml2owl/src/main/java/io/opencaesar/oml2owl/OmlConstants.java create mode 100644 oml2owl/src/main/java/io/opencaesar/oml2owl/OwlApi.java create mode 100644 oml2owl/src/main/resources/version.txt delete mode 100755 owl-adapter/oml2owl-gradle/src/main/resources/version.txt delete mode 100644 owl-adapter/oml2owl/src/main/java/io/opencaesar/oml2owl/Oml2Owl.xtend delete mode 100644 owl-adapter/oml2owl/src/main/java/io/opencaesar/oml2owl/Oml2OwlApp.xtend delete mode 100644 owl-adapter/oml2owl/src/main/java/io/opencaesar/oml2owl/OmlConstants.xtend delete mode 100644 owl-adapter/oml2owl/src/main/java/io/opencaesar/oml2owl/OwlApi.xtend delete mode 100644 owl-adapter/oml2owl/src/main/resources/version.txt rename owl-adapter/settings.gradle => settings.gradle (100%) diff --git a/owl-adapter/.project b/.project similarity index 100% rename from owl-adapter/.project rename to .project diff --git a/owl-adapter/.settings/org.eclipse.buildship.core.prefs b/.settings/org.eclipse.buildship.core.prefs similarity index 100% rename from owl-adapter/.settings/org.eclipse.buildship.core.prefs rename to .settings/org.eclipse.buildship.core.prefs diff --git a/.travis.yml b/.travis.yml index 8d8673e..e102a63 100644 --- a/.travis.yml +++ b/.travis.yml @@ -4,9 +4,6 @@ install: true jdk: - openjdk11 -before_script: -- cd owl-adapter - script: - ./gradlew build diff --git a/owl-adapter/build.gradle b/build.gradle similarity index 88% rename from owl-adapter/build.gradle rename to build.gradle index 4cacdaf..dedb766 100644 --- a/owl-adapter/build.gradle +++ b/build.gradle @@ -11,13 +11,14 @@ buildscript { } subprojects { - group = 'io.opencaesar.owl' - version = '0.7.11' + group = 'io.opencaesar.adapters' + version = '0.8.0' ext.versions = [ - oml: '0.7.+', + oml: '0.8.+', + oml_tools: '0.8.+', owl: '5.1.+', - owl_tools: '0.7.+', + owl_tools: '+', jcommander: '1.72', log4j: '1.2.17', slf4j: '1.7.30', @@ -27,6 +28,7 @@ subprojects { repositories { mavenLocal() + maven { url 'https://dl.bintray.com/opencaesar/oml-tools' } maven { url 'https://dl.bintray.com/opencaesar/owl-tools' } maven { url 'https://dl.bintray.com/opencaesar/oml' } mavenCentral() diff --git a/owl-adapter/gradle.properties b/gradle.properties similarity index 100% rename from owl-adapter/gradle.properties rename to gradle.properties diff --git a/owl-adapter/gradle/maven-deployment.gradle b/gradle/maven-deployment.gradle similarity index 100% rename from owl-adapter/gradle/maven-deployment.gradle rename to gradle/maven-deployment.gradle diff --git a/owl-adapter/gradle/source-layout.gradle b/gradle/source-layout.gradle similarity index 81% rename from owl-adapter/gradle/source-layout.gradle rename to gradle/source-layout.gradle index abe4f5c..644c475 100644 --- a/owl-adapter/gradle/source-layout.gradle +++ b/gradle/source-layout.gradle @@ -2,19 +2,13 @@ sourceSets { main { java.srcDirs = ['src/main/java'] resources.srcDirs = ['src/main/resources'] - xtendOutputDir = 'src/main/xtend-gen' } test { java.srcDirs = ['src/test/java'] resources.srcDirs = ['src/test/resources'] - xtendOutputDir = 'src/test/xtend-gen' } } -sourceSets.all { - resources.exclude '**/*.xtend', '**/*._trace' -} - task sourcesJar(type: Jar, dependsOn: classes) { classifier = 'sources' from sourceSets.main.allSource diff --git a/owl-adapter/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar similarity index 100% rename from owl-adapter/gradle/wrapper/gradle-wrapper.jar rename to gradle/wrapper/gradle-wrapper.jar diff --git a/owl-adapter/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties similarity index 100% rename from owl-adapter/gradle/wrapper/gradle-wrapper.properties rename to gradle/wrapper/gradle-wrapper.properties diff --git a/owl-adapter/gradlew b/gradlew similarity index 100% rename from owl-adapter/gradlew rename to gradlew diff --git a/owl-adapter/gradlew.bat b/gradlew.bat similarity index 100% rename from owl-adapter/gradlew.bat rename to gradlew.bat diff --git a/owl-adapter/oml2owl-gradle/.classpath b/oml2owl-gradle/.classpath similarity index 87% rename from owl-adapter/oml2owl-gradle/.classpath rename to oml2owl-gradle/.classpath index b82b006..6d924d7 100755 --- a/owl-adapter/oml2owl-gradle/.classpath +++ b/oml2owl-gradle/.classpath @@ -6,7 +6,7 @@ - + diff --git a/owl-adapter/oml2owl-gradle/.project b/oml2owl-gradle/.project similarity index 100% rename from owl-adapter/oml2owl-gradle/.project rename to oml2owl-gradle/.project diff --git a/owl-adapter/oml2owl-gradle/.settings/org.eclipse.buildship.core.prefs b/oml2owl-gradle/.settings/org.eclipse.buildship.core.prefs similarity index 100% rename from owl-adapter/oml2owl-gradle/.settings/org.eclipse.buildship.core.prefs rename to oml2owl-gradle/.settings/org.eclipse.buildship.core.prefs diff --git a/owl-adapter/oml2owl-gradle/.settings/org.eclipse.jdt.core.prefs b/oml2owl-gradle/.settings/org.eclipse.jdt.core.prefs similarity index 100% rename from owl-adapter/oml2owl-gradle/.settings/org.eclipse.jdt.core.prefs rename to oml2owl-gradle/.settings/org.eclipse.jdt.core.prefs diff --git a/owl-adapter/oml2owl-gradle/README.md b/oml2owl-gradle/README.md similarity index 100% rename from owl-adapter/oml2owl-gradle/README.md rename to oml2owl-gradle/README.md diff --git a/owl-adapter/oml2owl-gradle/build.gradle b/oml2owl-gradle/build.gradle similarity index 100% rename from owl-adapter/oml2owl-gradle/build.gradle rename to oml2owl-gradle/build.gradle diff --git a/owl-adapter/oml2owl-gradle/src/main/java/io/opencaesar/oml2owl/Oml2OwlTask.java b/oml2owl-gradle/src/main/java/io/opencaesar/oml2owl/Oml2OwlTask.java similarity index 100% rename from owl-adapter/oml2owl-gradle/src/main/java/io/opencaesar/oml2owl/Oml2OwlTask.java rename to oml2owl-gradle/src/main/java/io/opencaesar/oml2owl/Oml2OwlTask.java diff --git a/oml2owl-gradle/src/main/resources/version.txt b/oml2owl-gradle/src/main/resources/version.txt new file mode 100755 index 0000000..8adc70f --- /dev/null +++ b/oml2owl-gradle/src/main/resources/version.txt @@ -0,0 +1 @@ +0.8.0 \ No newline at end of file diff --git a/owl-adapter/oml2owl/.classpath b/oml2owl/.classpath similarity index 68% rename from owl-adapter/oml2owl/.classpath rename to oml2owl/.classpath index 1eafd61..6d924d7 100644 --- a/owl-adapter/oml2owl/.classpath +++ b/oml2owl/.classpath @@ -6,13 +6,7 @@ - - - - - - - + diff --git a/owl-adapter/oml2owl/.project b/oml2owl/.project similarity index 100% rename from owl-adapter/oml2owl/.project rename to oml2owl/.project diff --git a/owl-adapter/oml2owl/.settings/org.eclipse.buildship.core.prefs b/oml2owl/.settings/org.eclipse.buildship.core.prefs similarity index 100% rename from owl-adapter/oml2owl/.settings/org.eclipse.buildship.core.prefs rename to oml2owl/.settings/org.eclipse.buildship.core.prefs diff --git a/owl-adapter/oml2owl/.settings/org.eclipse.jdt.core.prefs b/oml2owl/.settings/org.eclipse.jdt.core.prefs similarity index 100% rename from owl-adapter/oml2owl/.settings/org.eclipse.jdt.core.prefs rename to oml2owl/.settings/org.eclipse.jdt.core.prefs diff --git a/owl-adapter/oml2owl/README.md b/oml2owl/README.md similarity index 100% rename from owl-adapter/oml2owl/README.md rename to oml2owl/README.md diff --git a/owl-adapter/oml2owl/build.gradle b/oml2owl/build.gradle similarity index 86% rename from owl-adapter/oml2owl/build.gradle rename to oml2owl/build.gradle index d0c596c..b21c49f 100644 --- a/owl-adapter/oml2owl/build.gradle +++ b/oml2owl/build.gradle @@ -7,6 +7,7 @@ applicationName = 'oml2owl' dependencies { implementation "io.opencaesar.oml:io.opencaesar.oml.dsl:${versions.oml}" + implementation "io.opencaesar.oml:oml-validate:${versions.oml_tools}" implementation "io.opencaesar.owl:owl-close-world:${versions.owl_tools}" implementation "net.sourceforge.owlapi:owlapi-distribution:${versions.owl}" implementation "org.jgrapht:jgrapht-core:${versions.jgrapht}" diff --git a/owl-adapter/oml2owl/src/main/java/io/opencaesar/oml2owl/CloseDescriptionBundle.java b/oml2owl/src/main/java/io/opencaesar/oml2owl/CloseDescriptionBundle.java similarity index 98% rename from owl-adapter/oml2owl/src/main/java/io/opencaesar/oml2owl/CloseDescriptionBundle.java rename to oml2owl/src/main/java/io/opencaesar/oml2owl/CloseDescriptionBundle.java index 67607c2..5a1d793 100644 --- a/owl-adapter/oml2owl/src/main/java/io/opencaesar/oml2owl/CloseDescriptionBundle.java +++ b/oml2owl/src/main/java/io/opencaesar/oml2owl/CloseDescriptionBundle.java @@ -286,18 +286,21 @@ private final static HashMap> getRelation toStream(allOntologies.iterator()).forEach(g -> { toStream(g.eAllContents()).filter(e -> e instanceof RelationEntity).map(e -> (RelationEntity) e) .forEach(re -> { - final Relation f = re.getForward(); - final Relation r = re.getReverse(); - graph.addVertex(f); + final Relation f = re.getForwardRelation(); + final Relation r = re.getReverseRelation(); + if (Objects.nonNull(f)) + graph.addVertex(f); if (Objects.nonNull(r)) graph.addVertex(r); OmlRead.getSpecializedTerms(re).forEach(s -> { if (s instanceof RelationEntity) { final RelationEntity sre = (RelationEntity) s; - final Relation sf = sre.getForward(); - final Relation sr = sre.getReverse(); - graph.addVertex(sf); - graph.addEdge(sf, f); + final Relation sf = sre.getForwardRelation(); + final Relation sr = sre.getReverseRelation(); + if (Objects.nonNull(f) && Objects.nonNull(sf)) { + graph.addVertex(sf); + graph.addEdge(sf, f); + } if (Objects.nonNull(r) && Objects.nonNull(sr)) { graph.addVertex(sr); graph.addEdge(sr, r); diff --git a/owl-adapter/oml2owl/src/main/java/io/opencaesar/oml2owl/CloseVocabularyBundle.java b/oml2owl/src/main/java/io/opencaesar/oml2owl/CloseVocabularyBundle.java similarity index 100% rename from owl-adapter/oml2owl/src/main/java/io/opencaesar/oml2owl/CloseVocabularyBundle.java rename to oml2owl/src/main/java/io/opencaesar/oml2owl/CloseVocabularyBundle.java diff --git a/oml2owl/src/main/java/io/opencaesar/oml2owl/Oml2Owl.java b/oml2owl/src/main/java/io/opencaesar/oml2owl/Oml2Owl.java new file mode 100644 index 0000000..c3a98a9 --- /dev/null +++ b/oml2owl/src/main/java/io/opencaesar/oml2owl/Oml2Owl.java @@ -0,0 +1,935 @@ +package io.opencaesar.oml2owl; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collections; +import java.util.List; +import java.util.stream.Collectors; +import java.util.stream.StreamSupport; + +import org.eclipse.emf.ecore.EObject; +import org.eclipse.emf.ecore.resource.Resource; +import org.eclipse.rdf4j.model.vocabulary.RDFS; +import org.semanticweb.owlapi.model.OWLAnnotation; +import org.semanticweb.owlapi.model.OWLAnonymousIndividual; +import org.semanticweb.owlapi.model.OWLFacetRestriction; +import org.semanticweb.owlapi.model.OWLIndividual; +import org.semanticweb.owlapi.model.OWLLiteral; +import org.semanticweb.owlapi.model.OWLNamedIndividual; +import org.semanticweb.owlapi.model.OWLOntology; +import org.semanticweb.owlapi.model.SWRLAtom; +import org.semanticweb.owlapi.model.SWRLObjectPropertyAtom; +import org.semanticweb.owlapi.vocab.OWLFacet; + +import io.opencaesar.oml.Annotation; +import io.opencaesar.oml.AnnotationProperty; +import io.opencaesar.oml.Aspect; +import io.opencaesar.oml.Assertion; +import io.opencaesar.oml.BooleanLiteral; +import io.opencaesar.oml.CardinalityRestrictionKind; +import io.opencaesar.oml.Concept; +import io.opencaesar.oml.ConceptInstance; +import io.opencaesar.oml.ConceptInstanceReference; +import io.opencaesar.oml.ConceptTypeAssertion; +import io.opencaesar.oml.DecimalLiteral; +import io.opencaesar.oml.Description; +import io.opencaesar.oml.DescriptionBundle; +import io.opencaesar.oml.DifferentFromPredicate; +import io.opencaesar.oml.DoubleLiteral; +import io.opencaesar.oml.Element; +import io.opencaesar.oml.EntityPredicate; +import io.opencaesar.oml.EnumeratedScalar; +import io.opencaesar.oml.FacetedScalar; +import io.opencaesar.oml.ForwardRelation; +import io.opencaesar.oml.Import; +import io.opencaesar.oml.IntegerLiteral; +import io.opencaesar.oml.KeyAxiom; +import io.opencaesar.oml.LinkAssertion; +import io.opencaesar.oml.Literal; +import io.opencaesar.oml.Member; +import io.opencaesar.oml.Ontology; +import io.opencaesar.oml.Predicate; +import io.opencaesar.oml.QuotedLiteral; +import io.opencaesar.oml.RangeRestrictionKind; +import io.opencaesar.oml.Reference; +import io.opencaesar.oml.RelationCardinalityRestrictionAxiom; +import io.opencaesar.oml.RelationEntity; +import io.opencaesar.oml.RelationEntityPredicate; +import io.opencaesar.oml.RelationInstance; +import io.opencaesar.oml.RelationInstanceReference; +import io.opencaesar.oml.RelationPredicate; +import io.opencaesar.oml.RelationRangeRestrictionAxiom; +import io.opencaesar.oml.RelationTargetRestrictionAxiom; +import io.opencaesar.oml.RelationTypeAssertion; +import io.opencaesar.oml.ReverseRelation; +import io.opencaesar.oml.Rule; +import io.opencaesar.oml.SameAsPredicate; +import io.opencaesar.oml.ScalarProperty; +import io.opencaesar.oml.ScalarPropertyCardinalityRestrictionAxiom; +import io.opencaesar.oml.ScalarPropertyRangeRestrictionAxiom; +import io.opencaesar.oml.ScalarPropertyValueAssertion; +import io.opencaesar.oml.ScalarPropertyValueRestrictionAxiom; +import io.opencaesar.oml.SpecializationAxiom; +import io.opencaesar.oml.Structure; +import io.opencaesar.oml.StructureInstance; +import io.opencaesar.oml.StructuredProperty; +import io.opencaesar.oml.StructuredPropertyCardinalityRestrictionAxiom; +import io.opencaesar.oml.StructuredPropertyRangeRestrictionAxiom; +import io.opencaesar.oml.StructuredPropertyValueAssertion; +import io.opencaesar.oml.StructuredPropertyValueRestrictionAxiom; +import io.opencaesar.oml.Term; +import io.opencaesar.oml.Vocabulary; +import io.opencaesar.oml.VocabularyBundle; +import io.opencaesar.oml.util.OmlRead; +import io.opencaesar.oml.util.OmlVisitor; + +public class Oml2Owl extends OmlVisitor { + + public static final List BUILT_IN_ONTOLOGIES = Arrays.asList(new String[] { + "http://www.w3.org/2001/XMLSchema", + "http://www.w3.org/1999/02/22-rdf-syntax-ns", + "http://www.w3.org/2000/01/rdf-schema", + "http://www.w3.org/2002/07/owl"}); + + private final Resource inputResource; + private final OwlApi owl; + private OWLOntology ontology; + + public Oml2Owl(final Resource inputResource, final OwlApi owl2) { + this.inputResource = inputResource; + owl = owl2; + } + + public OWLOntology run() { + Iterable iterable = () -> inputResource.getAllContents(); + StreamSupport.stream(iterable.spliterator(), false).forEach(i -> doSwitch(i)); + return ontology; + } + + @Override + public Void caseAnnotation(final Annotation annotation) { + addsAnnotation(OmlRead.getAnnotatedElement(annotation), annotation); + return null; + } + + @Override + public Void caseVocabulary(final Vocabulary vocabulary) { + ontology = owl.createOntology(vocabulary.getIri()); + owl.addOntologyAnnotation(ontology, owl.getAnnotation(OmlConstants.ontologyType, owl.createIri(OmlConstants.Vocabulary))); + return null; + } + + @Override + public Void caseVocabularyBundle(final VocabularyBundle bundle) { + ontology = owl.createOntology(bundle.getIri()); + owl.addOntologyAnnotation(ontology, owl.getAnnotation(OmlConstants.ontologyType, owl.createIri(OmlConstants.VocabularyBundle))); + return null; + } + + @Override + public Void caseDescription(final Description description) { + ontology = owl.createOntology(description.getIri()); + owl.addOntologyAnnotation(ontology, owl.getAnnotation(OmlConstants.ontologyType, owl.createIri(OmlConstants.Description))); + return null; + } + + @Override + public Void caseDescriptionBundle(final DescriptionBundle bundle) { + ontology = owl.createOntology(bundle.getIri()); + owl.addOntologyAnnotation(ontology, owl.getAnnotation(OmlConstants.ontologyType, owl.createIri(OmlConstants.DescriptionBundle))); + return null; + } + + @Override + public Void caseAspect(final Aspect aspect) { + owl.addClass(ontology, OmlRead.getIri(aspect)); + owl.addSubClassOf(ontology, OmlRead.getIri(aspect), OmlConstants.Aspect); + return null; + } + + @Override + public Void caseConcept(final Concept concept) { + owl.addClass(ontology, OmlRead.getIri(concept)); + owl.addSubClassOf(ontology, OmlRead.getIri(concept), OmlConstants.Concept); + return null; + } + + @Override + public Void caseRelationEntity(final RelationEntity entity) { + owl.addClass(ontology, OmlRead.getIri(entity)); + owl.addSubClassOf(ontology, OmlRead.getIri(entity), OmlConstants.RelationEntity); + + // source relation + final String sourceRelationIri = getSourceIri(entity); + owl.addObjectProperty(ontology, sourceRelationIri); + owl.addSubObjectPropertyOf(ontology, sourceRelationIri, OmlConstants.sourceRelation); + owl.addObjectPropertyDomain(ontology, sourceRelationIri, OmlRead.getIri(entity)); + owl.addObjectPropertyRange(ontology, sourceRelationIri, OmlRead.getIri(entity.getSource())); + owl.addFunctionalObjectProperty(ontology, sourceRelationIri); + if (entity.isFunctional()) { + owl.addInverseFunctionalObjectProperty(ontology, sourceRelationIri); + } + if (entity.isInverseFunctional()) { + owl.addFunctionalObjectProperty(ontology, sourceRelationIri); + } + + // inverse source relation + final String inverseSourceRelationIri = getInverseSourceIri(entity); + if (inverseSourceRelationIri != null) { + owl.addObjectProperty(ontology, inverseSourceRelationIri); + owl.addSubObjectPropertyOf(ontology, inverseSourceRelationIri, OmlConstants.inverseSourceRelation); + owl.addInverseProperties(ontology, inverseSourceRelationIri, sourceRelationIri); + } + + // target relation + final String targetRelationIri = getTargetIri(entity); + owl.addObjectProperty(ontology, targetRelationIri); + owl.addSubObjectPropertyOf(ontology, targetRelationIri, OmlConstants.targetRelation); + owl.addObjectPropertyDomain(ontology, targetRelationIri, OmlRead.getIri(entity)); + owl.addObjectPropertyRange(ontology, targetRelationIri, OmlRead.getIri(entity.getTarget())); + owl.addFunctionalObjectProperty(ontology, targetRelationIri); + if (entity.isFunctional()) { + owl.addFunctionalObjectProperty(ontology, targetRelationIri); + } + if (entity.isInverseFunctional()) { + owl.addInverseFunctionalObjectProperty(ontology, targetRelationIri); + } + + // inverse target relation + final String inverseTargetRelationIri = getInverseTargetIri(entity); + if (inverseTargetRelationIri != null) { + owl.addObjectProperty(ontology, inverseTargetRelationIri); + owl.addSubObjectPropertyOf(ontology, inverseTargetRelationIri, OmlConstants.inverseTargetRelation); + owl.addInverseProperties(ontology, inverseTargetRelationIri, targetRelationIri); + } + + return null; + } + + @Override + public Void caseStructure(final Structure structure) { + owl.addClass(ontology, OmlRead.getIri(structure)); + owl.addSubClassOf(ontology, OmlRead.getIri(structure), OmlConstants.Structure); + return null; + } + + @Override + public Void caseFacetedScalar(final FacetedScalar scalar) { + owl.addDatatype(ontology, OmlRead.getIri(scalar)); + return null; + } + + @Override + public Void caseEnumeratedScalar(final EnumeratedScalar scalar) { + owl.addDataOneOf(ontology, OmlRead.getIri(scalar), scalar.getLiterals().stream().map(i -> getLiteral(i)).toArray(OWLLiteral[]::new)); + return null; + } + + @Override + public Void caseAnnotationProperty(final AnnotationProperty property) { + owl.addAnnotationProperty(ontology, OmlRead.getIri(property)); + return null; + } + + @Override + public Void caseScalarProperty(final ScalarProperty property) { + final String propertyIri = OmlRead.getIri(property); + owl.addDataProperty(ontology, propertyIri); + owl.addSubDataPropertyOf(ontology, propertyIri, OmlConstants.scalarProperty); + owl.addDataPropertyDomain(ontology, propertyIri, OmlRead.getIri(property.getDomain())); + owl.addDataPropertyRange(ontology, propertyIri, OmlRead.getIri(property.getRange())); + if (property.isFunctional()) { + owl.addFunctionalDataProperty(ontology, propertyIri); + } + return null; + } + + @Override + public Void caseStructuredProperty(final StructuredProperty property) { + final String propertyIri = OmlRead.getIri(property); + owl.addObjectProperty(ontology, propertyIri); + owl.addSubObjectPropertyOf(ontology, propertyIri, OmlConstants.structuredProperty); + owl.addObjectPropertyDomain(ontology, propertyIri, OmlRead.getIri(property.getDomain())); + owl.addObjectPropertyRange(ontology, propertyIri, OmlRead.getIri(property.getRange())); + if (property.isFunctional()) { + owl.addFunctionalObjectProperty(ontology, propertyIri); + } + return null; + } + + @Override + public Void caseForwardRelation(final ForwardRelation forward) { + final RelationEntity entity = forward.getRelationEntity(); + + // forward relation + final String forwardIri = OmlRead.getIri(forward); + owl.addObjectProperty(ontology, forwardIri); + owl.addSubObjectPropertyOf(ontology, forwardIri, OmlConstants.forwardRelation); + owl.addObjectPropertyDomain(ontology, forwardIri, OmlRead.getIri(forward.getDomain())); + owl.addObjectPropertyRange(ontology, forwardIri, OmlRead.getIri(forward.getRange())); + if (entity.isFunctional()) { + owl.addFunctionalObjectProperty(ontology, forwardIri); + } + if (entity.isInverseFunctional()) { + owl.addInverseFunctionalObjectProperty(ontology, forwardIri); + } + if (entity.isSymmetric()) { + owl.addSymmetricObjectProperty(ontology, forwardIri); + } + if (entity.isAsymmetric()) { + owl.addAsymmetricObjectProperty(ontology, forwardIri); + } + if (entity.isReflexive()) { + owl.addReflexiveObjectProperty(ontology, forwardIri); + } + if (entity.isIrreflexive()) { + owl.addIrreflexiveObjectProperty(ontology, forwardIri); + } + if (entity.isTransitive()) { + owl.addTransitiveObjectProperty(ontology, forwardIri); + } + + // derivation rule for forward relation + final ArrayList antedecents = new ArrayList(); + antedecents.add(owl.getObjectPropertyAtom(getSourceIri(entity), getSwrlIri("r"), getSwrlIri("s"))); + antedecents.add(owl.getObjectPropertyAtom(getTargetIri(entity), getSwrlIri("r"), getSwrlIri("t"))); + final SWRLObjectPropertyAtom consequent = owl.getObjectPropertyAtom(forwardIri, getSwrlIri("s"), getSwrlIri("t")); + final OWLAnnotation annotation = owl.getAnnotation(RDFS.LABEL.toString(), owl.getLiteral(forward.getName()+" derivation")); + owl.addRule(ontology, Collections.singletonList(consequent), antedecents, annotation); + return null; + } + + @Override + public Void caseReverseRelation(final ReverseRelation reverse) { + // reverse relation + final String reverseIri = OmlRead.getIri(reverse); + owl.addObjectProperty(ontology, reverseIri); + owl.addSubObjectPropertyOf(ontology, reverseIri, OmlConstants.reverseRelation); + owl.addInverseProperties(ontology, reverseIri, OmlRead.getIri(reverse.getInverse())); + return null; + } + + @Override + public Void caseRule(final Rule rule) { + List annotations = rule.getOwnedAnnotations().stream().map(it -> createAnnotation(it)).collect(Collectors.toList()); + if (annotations.stream().filter(a -> a.getProperty().getIRI().toString().equals(RDFS.LABEL.toString())).count() == 0) { + annotations = Collections.singletonList(owl.getAnnotation(RDFS.LABEL.toString(), owl.getLiteral(rule.getName()))); + } + owl.addRule(ontology, + rule.getConsequent().stream().flatMap(p -> getAtom(p).stream()).collect(Collectors.toList()), + rule.getAntecedent().stream().flatMap(p -> getAtom(p).stream()).collect(Collectors.toList()), + toArray(annotations)); + return null; + } + + @Override + public Void caseConceptInstance(final ConceptInstance instance) { + final String instanceIri = OmlRead.getIri(instance); + final OWLIndividual individual = owl.addNamedIndividual(ontology, instanceIri); + instance.getOwnedPropertyValues().forEach(it -> appliesTo(it, individual)); + instance.getOwnedLinks().forEach(it -> appliesTo(it, individual)); + return null; + } + + @Override + public Void caseConceptInstanceReference(final ConceptInstanceReference reference) { + final String instanceIri = OmlRead.getIri(OmlRead.resolve(reference)); + final OWLNamedIndividual individual = owl.getNamedIndividual(instanceIri); + reference.getOwnedPropertyValues().forEach(it -> appliesTo(it, individual)); + reference.getOwnedLinks().forEach(it -> appliesTo(it, individual)); + return null; + } + + @Override + public Void caseRelationInstance(final RelationInstance instance) { + final String instanceIri = OmlRead.getIri(instance); + final OWLNamedIndividual individual = owl.addNamedIndividual(ontology, instanceIri); + instance.getOwnedPropertyValues().forEach(it -> appliesTo(it, individual)); + instance.getOwnedLinks().forEach(it -> appliesTo(it, individual)); + return null; + } + + @Override + public Void caseRelationInstanceReference(final RelationInstanceReference reference) { + final String instanceIri = OmlRead.getIri(OmlRead.resolve(reference)); + final OWLNamedIndividual individual = owl.getNamedIndividual(instanceIri); + reference.getOwnedPropertyValues().forEach(it -> appliesTo(it, individual)); + reference.getOwnedLinks().forEach(it -> appliesTo(it, individual)); + return null; + } + + @Override + public Void caseImport(final Import import_) { + Ontology importedOntology = OmlRead.getImportedOntology(import_); + if (importedOntology != null) { + final String iri = importedOntology.getIri(); + if (Oml2Owl.isBuiltInOntology(iri)) { + final List indirectImports = OmlRead.closure(import_, it -> OmlRead.getImportsWithSource(OmlRead.getImportedOntology(it))); + indirectImports.forEach(i2 -> { + final String iri2 = OmlRead.getImportedOntology(i2).getIri(); + if (!Oml2Owl.isBuiltInOntology(iri2)) { + owl.addImportsDeclaration(ontology, iri2); + } + }); + } else { + owl.addImportsDeclaration(ontology, iri); + } + } else { + throw new RuntimeException("Could not resolve IRI '"+ import_.getUri()+ "'"); + } + return null; + } + + @Override + public Void caseSpecializationAxiom(final SpecializationAxiom axiom) { + final List annotations = axiom.getOwnedAnnotations().stream().map(it -> createAnnotation(it)).collect(Collectors.toList()); + specializes(OmlRead.getSpecializingTerm(axiom), axiom.getSpecializedTerm(), axiom.getOwningReference(), toArray(annotations)); + return null; + } + + @Override + public Void caseScalarPropertyRangeRestrictionAxiom(final ScalarPropertyRangeRestrictionAxiom axiom) { + final List annotations = axiom.getOwnedAnnotations().stream().map(it -> createAnnotation(it)).collect(Collectors.toList()); + if (axiom.getKind() == RangeRestrictionKind.ALL) { + owl.addDataAllValuesFrom(ontology, OmlRead.getIri(OmlRead.getRestrictingType(axiom)), + OmlRead.getIri(axiom.getProperty()), OmlRead.getIri(axiom.getRange()), + toArray(annotations)); + } else { + owl.addDataSomeValuesFrom(ontology, OmlRead.getIri(OmlRead.getRestrictingType(axiom)), + OmlRead.getIri(axiom.getProperty()), OmlRead.getIri(axiom.getRange()), + toArray(annotations)); + } + return null; + } + + @Override + public Void caseScalarPropertyValueRestrictionAxiom(final ScalarPropertyValueRestrictionAxiom axiom) { + final List annotations = axiom.getOwnedAnnotations().stream().map(it -> createAnnotation(it)).collect(Collectors.toList()); + owl.addDataHasValue(ontology, OmlRead.getIri(OmlRead.getRestrictingType(axiom)), + OmlRead.getIri(axiom.getProperty()), getLiteral(axiom.getValue()), + toArray(annotations)); + return null; + } + + @Override + public Void caseScalarPropertyCardinalityRestrictionAxiom(final ScalarPropertyCardinalityRestrictionAxiom axiom) { + final List annotations = axiom.getOwnedAnnotations().stream().map(it -> createAnnotation(it)).collect(Collectors.toList()); + if (axiom.getKind() == CardinalityRestrictionKind.MIN) { + owl.addDataMinCardinality(ontology, + OmlRead.getIri(OmlRead.getRestrictingType(axiom)), + OmlRead.getIri(axiom.getProperty()), (int) axiom.getCardinality(), + (axiom.getRange() != null) ? OmlRead.getIri(axiom.getRange()) : null, + toArray(annotations)); + } else if (axiom.getKind() == CardinalityRestrictionKind.MAX) { + owl.addDataMaxCardinality(ontology, + OmlRead.getIri(OmlRead.getRestrictingType(axiom)), + OmlRead.getIri(axiom.getProperty()), (int) axiom.getCardinality(), + (axiom.getRange() != null) ? OmlRead.getIri(axiom.getRange()) : null, + toArray(annotations)); + } else { + owl.addDataExactCardinality(ontology, + OmlRead.getIri(OmlRead.getRestrictingType(axiom)), + OmlRead.getIri(axiom.getProperty()), (int) axiom.getCardinality(), + (axiom.getRange() != null) ? OmlRead.getIri(axiom.getRange()) : null, + toArray(annotations)); + } + return null; + } + + @Override + public Void caseStructuredPropertyRangeRestrictionAxiom(final StructuredPropertyRangeRestrictionAxiom axiom) { + final List annotations = axiom.getOwnedAnnotations().stream().map(it -> createAnnotation(it)).collect(Collectors.toList()); + if (axiom.getKind() == RangeRestrictionKind.ALL) { + owl.addObjectAllValuesFrom(ontology, + OmlRead.getIri(OmlRead.getRestrictingType(axiom)), + OmlRead.getIri(axiom.getProperty()), + OmlRead.getIri(axiom.getRange()), + toArray(annotations)); + } else { + owl.addObjectSomeValuesFrom(ontology, + OmlRead.getIri(OmlRead.getRestrictingType(axiom)), + OmlRead.getIri(axiom.getProperty()), + OmlRead.getIri(axiom.getRange()), + toArray(annotations)); + } + return null; + } + + @Override + public Void caseStructuredPropertyValueRestrictionAxiom(final StructuredPropertyValueRestrictionAxiom axiom) { + final List annotations = axiom.getOwnedAnnotations().stream().map(it -> createAnnotation(it)).collect(Collectors.toList()); + owl.addObjectHasValue(ontology, + OmlRead.getIri(OmlRead.getRestrictingType(axiom)), + OmlRead.getIri(axiom.getProperty()), + createIndividual(axiom.getValue()), + toArray(annotations)); + return null; + } + + @Override + public Void caseStructuredPropertyCardinalityRestrictionAxiom(final StructuredPropertyCardinalityRestrictionAxiom axiom) { + final List annotations = axiom.getOwnedAnnotations().stream().map(it -> createAnnotation(it)).collect(Collectors.toList()); + if (axiom.getKind() == CardinalityRestrictionKind.MIN) { + owl.addObjectMinCardinality(ontology, + OmlRead.getIri(OmlRead.getRestrictingType(axiom)), + OmlRead.getIri(axiom.getProperty()), (int) axiom.getCardinality(), + (axiom.getRange() != null) ? OmlRead.getIri(axiom.getRange()) : null, + toArray(annotations)); + } else if (axiom.getKind() == CardinalityRestrictionKind.MAX) { + owl.addObjectMaxCardinality(ontology, + OmlRead.getIri(OmlRead.getRestrictingType(axiom)), + OmlRead.getIri(axiom.getProperty()), (int) axiom.getCardinality(), + (axiom.getRange() != null) ? OmlRead.getIri(axiom.getRange()) : null, + toArray(annotations)); + } else { + owl.addObjectExactCardinality(ontology, + OmlRead.getIri(OmlRead.getRestrictingType(axiom)), + OmlRead.getIri(axiom.getProperty()), (int) axiom.getCardinality(), + (axiom.getRange() != null) ? OmlRead.getIri(axiom.getRange()) : null, + toArray(annotations)); + } + return null; + } + + @Override + public Void caseRelationRangeRestrictionAxiom(final RelationRangeRestrictionAxiom axiom) { + final List annotations = axiom.getOwnedAnnotations().stream().map(it -> createAnnotation(it)).collect(Collectors.toList()); + if (axiom.getKind() == RangeRestrictionKind.ALL) { + owl.addObjectAllValuesFrom(ontology, + OmlRead.getIri(OmlRead.getRestrictingType(axiom)), + OmlRead.getIri(axiom.getRelation()), + OmlRead.getIri(axiom.getRange()), + toArray(annotations)); + } else { + owl.addObjectSomeValuesFrom(ontology, + OmlRead.getIri(OmlRead.getRestrictingType(axiom)), + OmlRead.getIri(axiom.getRelation()), + OmlRead.getIri(axiom.getRange()), + toArray(annotations)); + } + return null; + } + + @Override + public Void caseRelationTargetRestrictionAxiom(final RelationTargetRestrictionAxiom axiom) { + final List annotations = axiom.getOwnedAnnotations().stream().map(it -> createAnnotation(it)).collect(Collectors.toList()); + owl.addObjectHasValue(ontology, + OmlRead.getIri(OmlRead.getRestrictingType(axiom)), + OmlRead.getIri(axiom.getRelation()), + OmlRead.getIri(axiom.getTarget()), + toArray(annotations)); + return null; + } + + @Override + public Void caseRelationCardinalityRestrictionAxiom(final RelationCardinalityRestrictionAxiom axiom) { + final List annotations = axiom.getOwnedAnnotations().stream().map(it -> createAnnotation(it)).collect(Collectors.toList()); + if (axiom.getKind() == CardinalityRestrictionKind.MIN) { + owl.addObjectMinCardinality(ontology, + OmlRead.getIri(OmlRead.getRestrictingType(axiom)), + OmlRead.getIri(axiom.getRelation()), + (int) axiom.getCardinality(), + (axiom.getRange() != null) ? OmlRead.getIri(axiom.getRange()) : null, + toArray(annotations)); + } else if (axiom.getKind() == CardinalityRestrictionKind.MAX) { + owl.addObjectMaxCardinality(ontology, + OmlRead.getIri(OmlRead.getRestrictingType(axiom)), + OmlRead.getIri(axiom.getRelation()), + (int) axiom.getCardinality(), + (axiom.getRange() != null) ? OmlRead.getIri(axiom.getRange()) : null, + toArray(annotations)); + } else { + owl.addObjectExactCardinality(ontology, + OmlRead.getIri(OmlRead.getRestrictingType(axiom)), + OmlRead.getIri(axiom.getRelation()), + (int) axiom.getCardinality(), + (axiom.getRange() != null) ? OmlRead.getIri(axiom.getRange()) : null, + toArray(annotations)); + } + return null; + } + + @Override + public Void caseKeyAxiom(final KeyAxiom axiom) { + final List annotations = axiom.getOwnedAnnotations().stream().map(it -> createAnnotation(it)).collect(Collectors.toList()); + owl.addHasKey(ontology, + OmlRead.getIri(OmlRead.getRestrictingType(axiom)), + axiom.getProperties().stream().map(i -> OmlRead.getIri(i)).collect(Collectors.toList()), + toArray(annotations)); + return null; + } + + @Override + public Void caseConceptTypeAssertion(final ConceptTypeAssertion assertion) { + final List annotations = assertion.getOwnedAnnotations().stream().map(it -> createAnnotation(it)).collect(Collectors.toList()); + owl.addClassAssertion(ontology, + OmlRead.getIri(OmlRead.getConceptInstance(assertion)), + OmlRead.getIri(assertion.getType()), + toArray(annotations)); + return null; + } + + @Override + public Void caseRelationTypeAssertion(final RelationTypeAssertion assertion) { + final List annotations = assertion.getOwnedAnnotations().stream().map(it -> createAnnotation(it)).collect(Collectors.toList()); + final RelationInstance instance = OmlRead.getRelationInstance(assertion); + final String instanceIri = OmlRead.getIri(instance); + owl.addClassAssertion(ontology, + instanceIri, + OmlRead.getIri(assertion.getType()), + toArray(annotations)); + instance.getSources().forEach(s -> + owl.addObjectPropertyAssertion(ontology, + instanceIri, + getSourceIri(assertion.getType()), + OmlRead.getIri(s))); + instance.getTargets().forEach(t -> + owl.addObjectPropertyAssertion(ontology, + instanceIri, + getTargetIri(assertion.getType()), + OmlRead.getIri(t))); + return null; + } + + protected OWLAnnotation createAnnotation(final Annotation annotation) { + final OWLLiteral literal; + if (annotation.getValue() != null) { + literal = getLiteral(annotation.getValue()); + } else { + literal = owl.getLiteral("true"); + } + return owl.getAnnotation(OmlRead.getIri(annotation.getProperty()), literal); + } + + protected void addsAnnotation(final Element element, final Annotation annotation) { + if (element instanceof Ontology) { + owl.addOntologyAnnotation(ontology, createAnnotation(annotation)); + } else if (element instanceof Member) { + owl.addAnnotationAssertion(ontology, OmlRead.getIri((Member)element), createAnnotation(annotation)); + } else if (element instanceof Reference) { + addsAnnotation(OmlRead.resolve((Reference)element), annotation); + } + } + + protected void specializes(final Term specific, final Term general, final Reference owningReference, final OWLAnnotation[] annotations) { + if (specific instanceof Aspect && general instanceof Aspect) { + specializes((Aspect) specific, (Aspect) general, owningReference, annotations); + return; + } else if (specific instanceof Concept && general instanceof Aspect) { + specializes((Concept) specific, (Aspect) general, owningReference, annotations); + return; + } else if (specific instanceof Concept && general instanceof Concept) { + specializes((Concept) specific, (Concept) general, owningReference, annotations); + return; + } else if (specific instanceof RelationEntity && general instanceof Aspect) { + specializes((RelationEntity) specific, (Aspect) general, owningReference, annotations); + return; + } else if (specific instanceof RelationEntity && general instanceof RelationEntity) { + specializes((RelationEntity) specific, (RelationEntity) general, owningReference, annotations); + return; + } else if (specific instanceof EnumeratedScalar && general instanceof EnumeratedScalar) { + specializes((EnumeratedScalar) specific, (EnumeratedScalar) general, owningReference, annotations); + return; + } else if (specific instanceof FacetedScalar && general instanceof FacetedScalar) { + specializes((FacetedScalar) specific, (FacetedScalar) general, owningReference, annotations); + return; + } else if (specific instanceof ScalarProperty && general instanceof ScalarProperty) { + specializes((ScalarProperty) specific, (ScalarProperty) general, owningReference, annotations); + return; + } else if (specific instanceof Structure && general instanceof Structure) { + specializes((Structure) specific, (Structure) general, owningReference, annotations); + return; + } else if (specific instanceof StructuredProperty && general instanceof StructuredProperty) { + specializes((StructuredProperty) specific, (StructuredProperty) general, owningReference, annotations); + return; + } + } + + protected void specializes(final Concept specific, final Concept general, final Reference owningReference, final OWLAnnotation... annotations) { + owl.addSubClassOf(ontology, OmlRead.getIri(specific), OmlRead.getIri(general), annotations); + } + + protected void specializes(final Concept specific, final Aspect general, final Reference owningReference, final OWLAnnotation... annotations) { + owl.addSubClassOf(ontology, OmlRead.getIri(specific), OmlRead.getIri(general), annotations); + } + + protected void specializes(final Aspect specific, final Aspect general, final Reference owningReference, final OWLAnnotation... annotations) { + owl.addSubClassOf(ontology, OmlRead.getIri(specific), OmlRead.getIri(general), annotations); + } + + protected void specializes(final RelationEntity specific, final RelationEntity general, final Reference owningReference, final OWLAnnotation... annotations) { + owl.addSubClassOf(ontology, OmlRead.getIri(specific), OmlRead.getIri(general), annotations); + owl.addSubObjectPropertyOf(ontology, getSourceIri(specific), getSourceIri(general), annotations); + owl.addSubObjectPropertyOf(ontology, getTargetIri(specific), getTargetIri(general), annotations); + } + + protected void specializes(final RelationEntity specific, final Aspect general, final Reference owningReference, final OWLAnnotation... annotations) { + owl.addSubClassOf(ontology, OmlRead.getIri(specific), OmlRead.getIri(general), annotations); + } + + protected void specializes(final Structure specific, final Structure general, final Reference owningReference, final OWLAnnotation... annotations) { + owl.addSubClassOf(ontology, OmlRead.getIri(specific), OmlRead.getIri(general), annotations); + } + + protected void specializes(final EnumeratedScalar specific, final EnumeratedScalar general, final Reference owningReference, final OWLAnnotation... annotations) { + owl.addDatatypeDefinition(ontology, OmlRead.getIri(specific), OmlRead.getIri(general), annotations); + } + + protected void specializes(final FacetedScalar specific, final FacetedScalar general, final Reference owningReference, final OWLAnnotation... annotations) { + if ((owningReference != null)) { + owl.addDatatypeDefinition(ontology, OmlRead.getIri(specific), OmlRead.getIri(general), annotations); + } else { + final ArrayList restrictions = new ArrayList<>(); + if (specific.getLength() != null) { + restrictions.add(owl.getFacetRestriction(OWLFacet.LENGTH, owl.getLiteral((specific.getLength()).longValue()))); + } + if (specific.getMaxLength() != null) { + restrictions.add(owl.getFacetRestriction(OWLFacet.MAX_LENGTH, owl.getLiteral((specific.getLength()).longValue()))); + } + if (specific.getMinLength() != null) { + restrictions.add(owl.getFacetRestriction(OWLFacet.MIN_LENGTH, owl.getLiteral((specific.getLength()).longValue()))); + } + if (specific.getPattern() != null) { + restrictions.add(owl.getFacetRestriction(OWLFacet.PATTERN, owl.getLiteral(specific.getPattern()))); + } + if (specific.getLanguage() != null) { + restrictions.add(owl.getFacetRestriction(OWLFacet.LANG_RANGE, owl.getLiteral(specific.getLanguage()))); + } + if (specific.getMinInclusive() != null) { + restrictions.add(owl.getFacetRestriction(OWLFacet.MIN_INCLUSIVE, getLiteral(specific.getMinInclusive()))); + } + if (specific.getMaxInclusive() != null) { + restrictions.add(owl.getFacetRestriction(OWLFacet.MAX_INCLUSIVE, getLiteral(specific.getMaxInclusive()))); + } + if (specific.getMinExclusive() != null) { + restrictions.add(owl.getFacetRestriction(OWLFacet.MIN_EXCLUSIVE, getLiteral(specific.getMinExclusive()))); + } + if (specific.getMaxExclusive() != null) { + restrictions.add(owl.getFacetRestriction(OWLFacet.MAX_EXCLUSIVE, getLiteral(specific.getMaxExclusive()))); + } + if (!restrictions.isEmpty()) { + owl.addDatatypeDefinition(ontology, + OmlRead.getIri(specific), + OmlRead.getIri(general), + restrictions.toArray(new OWLFacetRestriction[0]), + annotations); + } else { + owl.addDatatypeDefinition(ontology, + OmlRead.getIri(specific), + OmlRead.getIri(general), + annotations); + } + } + } + + protected void specializes(final ScalarProperty specific, final ScalarProperty general, final Reference owningReference, final OWLAnnotation... annotations) { + owl.addSubDataPropertyOf(ontology, OmlRead.getIri(specific), OmlRead.getIri(general), annotations); + } + + protected void specializes(final StructuredProperty specific, final StructuredProperty general, final Reference owningReference, final OWLAnnotation... annotations) { + owl.addSubObjectPropertyOf(ontology, OmlRead.getIri(specific), OmlRead.getIri(general), annotations); + } + + protected void appliesTo(final Assertion assertion, final OWLIndividual individual) { + if (assertion instanceof ScalarPropertyValueAssertion && individual != null) { + appliesTo((ScalarPropertyValueAssertion) assertion, individual); + } else if (assertion instanceof StructuredPropertyValueAssertion && individual != null) { + appliesTo((StructuredPropertyValueAssertion) assertion, individual); + } else if (assertion instanceof LinkAssertion && individual instanceof OWLNamedIndividual) { + appliesTo((LinkAssertion) assertion, (OWLNamedIndividual) individual); + } + } + + protected void appliesTo(final ScalarPropertyValueAssertion assertion, final OWLIndividual individual) { + final List annotations = assertion.getOwnedAnnotations().stream().map(it -> createAnnotation(it)).collect(Collectors.toList()); + owl.addDataPropertyAssertion(ontology, + individual, + OmlRead.getIri(assertion.getProperty()), + getLiteral(assertion.getValue()), + toArray(annotations)); + } + + protected void appliesTo(final StructuredPropertyValueAssertion assertion, final OWLIndividual individual) { + final List annotations = assertion.getOwnedAnnotations().stream().map(it -> createAnnotation(it)).collect(Collectors.toList()); + owl.addObjectPropertyAssertion(ontology, + individual, + OmlRead.getIri(assertion.getProperty()), + createIndividual(assertion.getValue()), + toArray(annotations)); + } + + protected void appliesTo(final LinkAssertion assertion, final OWLNamedIndividual individual) { + final List annotations = assertion.getOwnedAnnotations().stream().map(it -> createAnnotation(it)).collect(Collectors.toList()); + owl.addObjectPropertyAssertion(ontology, + individual.getIRI().getIRIString(), + OmlRead.getIri(assertion.getRelation()), + OmlRead.getIri(assertion.getTarget()), + toArray(annotations)); + } + + protected List getAtom(final Predicate predicate) { + if (predicate instanceof DifferentFromPredicate) { + return getAtom((DifferentFromPredicate) predicate); + } else if (predicate instanceof EntityPredicate) { + return getAtom((EntityPredicate) predicate); + } else if (predicate instanceof RelationEntityPredicate) { + return getAtom((RelationEntityPredicate) predicate); + } else if (predicate instanceof RelationPredicate) { + return getAtom((RelationPredicate) predicate); + } else if (predicate instanceof SameAsPredicate) { + return getAtom((SameAsPredicate) predicate); + } + return Collections.emptyList(); + } + + protected List getAtom(final EntityPredicate predicate) { + final List atoms = new ArrayList<>(); + atoms.add(owl.getClassAtom(OmlRead.getIri(predicate.getEntity()), getSwrlIri(predicate.getVariable()))); + return atoms; + } + + protected List getAtom(final RelationEntityPredicate predicate) { + final List atoms = new ArrayList<>(); + atoms.add(owl.getObjectPropertyAtom(getSourceIri(predicate.getEntity()), getSwrlIri(predicate.getEntityVariable()), getSwrlIri(predicate.getVariable1()))); + atoms.add(owl.getObjectPropertyAtom(getTargetIri(predicate.getEntity()), getSwrlIri(predicate.getEntityVariable()), getSwrlIri(predicate.getVariable2()))); + return atoms; + } + + protected List getAtom(final RelationPredicate predicate) { + final List atoms = new ArrayList<>(); + atoms.add(owl.getObjectPropertyAtom(OmlRead.getIri(predicate.getRelation()), getSwrlIri(predicate.getVariable1()), getSwrlIri(predicate.getVariable2()))); + return atoms; + } + + protected List getAtom(final SameAsPredicate predicate) { + final List atoms = new ArrayList<>(); + atoms.add(owl.getSameIndividualAtom(getSwrlIri(predicate.getVariable1()), getSwrlIri(predicate.getVariable2()))); + return atoms; + } + + protected List getAtom(final DifferentFromPredicate predicate) { + final List atoms = new ArrayList<>(); + atoms.add(owl.getDifferentIndividualsAtom(getSwrlIri(predicate.getVariable1()), getSwrlIri(predicate.getVariable2()))); + return atoms; + } + + protected OWLLiteral getLiteral(final Literal literal) { + if (literal instanceof BooleanLiteral) { + return getLiteral((BooleanLiteral) literal); + } else if (literal instanceof DecimalLiteral) { + return getLiteral((DecimalLiteral) literal); + } else if (literal instanceof DoubleLiteral) { + return getLiteral((DoubleLiteral) literal); + } else if (literal instanceof IntegerLiteral) { + return getLiteral((IntegerLiteral) literal); + } else if (literal instanceof QuotedLiteral) { + return getLiteral((QuotedLiteral) literal); + } + return null; + } + + protected OWLLiteral getLiteral(final QuotedLiteral literal) { + if (literal.getType() != null) { + return owl.getLiteralWithDatatype(literal.getValue().toString(), OmlRead.getIri(literal.getType())); + } else if (literal.getLangTag() != null) { + return owl.getLiteralWithLangTag(literal.getValue().toString(), literal.getLangTag()); + } else { + return owl.getLiteral(literal.getValue()); + } + } + + protected OWLLiteral getLiteral(final BooleanLiteral literal) { + if (literal.getType() != null) { + return owl.getLiteralWithDatatype(String.valueOf(literal.isValue()), OmlRead.getIri(literal.getType())); + } else { + return owl.getLiteral(literal.isValue()); + } + } + + protected OWLLiteral getLiteral(final IntegerLiteral literal) { + if (literal.getType() != null) { + return owl.getLiteralWithDatatype(String.valueOf(literal.getValue()), OmlRead.getIri(literal.getType())); + } else { + return owl.getLiteral(literal.getValue()); + } + } + + protected OWLLiteral getLiteral(final DecimalLiteral literal) { + if (literal.getType() != null) { + return owl.getLiteralWithDatatype(literal.getValue().toString(), OmlRead.getIri(literal.getType())); + } else { + return owl.getLiteral(literal.getValue()); + } + } + + protected OWLLiteral getLiteral(final DoubleLiteral literal) { + if (literal.getType() != null) { + return owl.getLiteralWithDatatype(String.valueOf(literal.getValue()), OmlRead.getIri(literal.getType())); + } else { + return owl.getLiteral(literal.getValue()); + } + } + + protected OWLAnonymousIndividual createIndividual(final StructureInstance instance) { + final OWLAnonymousIndividual individual = owl.getAnonymousIndividual(OmlRead.getId(instance)); + instance.getOwnedPropertyValues().forEach(it -> appliesTo(it, individual)); + return individual; + } + + protected String getSourceIri(final RelationEntity entity) { + if (entity.getSourceRelation() != null) { + return OmlRead.getIri(entity.getSourceRelation()); + } else { + String namespace = OmlRead.getNamespace(OmlRead.getOntology(entity)); + String name = toFirstUpper(entity.getName()); + return namespace+"has"+name+"Source"; + } + } + + protected String getTargetIri(final RelationEntity entity) { + if (entity.getTargetRelation() != null) { + return OmlRead.getIri(entity.getTargetRelation()); + } else { + String namespace = OmlRead.getNamespace(OmlRead.getOntology(entity)); + String name = toFirstUpper(entity.getName()); + return namespace+"has"+name+"Target"; + } + } + + protected String getInverseSourceIri(final RelationEntity entity) { + if (entity.getInverseSourceRelation() != null) { + return OmlRead.getIri(entity.getInverseSourceRelation()); + } + return null; + } + + protected String getInverseTargetIri(final RelationEntity entity) { + if (entity.getInverseTargetRelation() != null) { + return OmlRead.getIri(entity.getInverseTargetRelation()); + } + return null; + } + + protected String getSwrlIri(final String variableName) { + return "urn:swrl#" + variableName; + } + + static boolean isBuiltInOntology(final String iri) { + return Oml2Owl.BUILT_IN_ONTOLOGIES.contains(iri); + } + + private static String toFirstUpper(String s) { + if (s == null || s.length() == 0) + return s; + if (Character.isUpperCase(s.charAt(0))) + return s; + if (s.length() == 1) + return s.toUpperCase(); + return s.substring(0, 1).toUpperCase() + s.substring(1); + } + + private OWLAnnotation[] toArray(List annotations) { + return annotations.toArray(new OWLAnnotation[0]); + } + +} diff --git a/oml2owl/src/main/java/io/opencaesar/oml2owl/Oml2OwlApp.java b/oml2owl/src/main/java/io/opencaesar/oml2owl/Oml2OwlApp.java new file mode 100644 index 0000000..5ed7a1d --- /dev/null +++ b/oml2owl/src/main/java/io/opencaesar/oml2owl/Oml2OwlApp.java @@ -0,0 +1,282 @@ +package io.opencaesar.oml2owl; + +import java.io.File; +import java.io.IOException; +import java.io.InputStream; +import java.io.InputStreamReader; +import java.net.URL; +import java.nio.file.Files; +import java.nio.file.Paths; +import java.nio.file.StandardCopyOption; +import java.util.ArrayList; +import java.util.Collection; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; +import java.util.concurrent.Callable; +import java.util.concurrent.ForkJoinPool; + +import org.apache.log4j.Appender; +import org.apache.log4j.AppenderSkeleton; +import org.apache.log4j.Level; +import org.apache.log4j.LogManager; +import org.apache.log4j.Logger; +import org.eclipse.emf.common.util.URI; +import org.eclipse.emf.ecore.resource.Resource; +import org.eclipse.xtext.resource.XtextResourceSet; +import org.semanticweb.owlapi.apibinding.OWLManager; +import org.semanticweb.owlapi.model.IRI; +import org.semanticweb.owlapi.model.OWLOntology; +import org.semanticweb.owlapi.model.OWLOntologyManager; + +import com.beust.jcommander.IParameterValidator; +import com.beust.jcommander.JCommander; +import com.beust.jcommander.Parameter; +import com.beust.jcommander.ParameterException; +import com.google.common.io.CharStreams; + +import io.opencaesar.oml.DescriptionBundle; +import io.opencaesar.oml.VocabularyBundle; +import io.opencaesar.oml.dsl.OmlStandaloneSetup; +import io.opencaesar.oml.util.OmlCatalog; +import io.opencaesar.oml.util.OmlRead; +import io.opencaesar.oml.util.OmlXMIResourceFactory; +import io.opencaesar.oml.validate.OmlValidator; +import io.opencaesar.oml2owl.CloseDescriptionBundle.CloseDescriptionBundleToOwl; +import io.opencaesar.oml2owl.CloseVocabularyBundle.CloseVocabularyBundleToOwl; + +public class Oml2OwlApp { + + static final String OML = "oml"; + static final String OMLXMI = "omlxmi"; + + @Parameter( + names = { "--input-catalog-path", "-i" }, + description = "Path of the input OML catalog (Required)", + validateWith = Oml2OwlApp.InputCatalogPath.class, + required = true, + order = 1) + private String inputCatalogPath; + + @Parameter( + names = { "--output-catalog-path", "-o" }, + description = "Path of the output OWL catalog (Required)", + validateWith = Oml2OwlApp.OutputCatalogPath.class, + required = true, + order = 2) + private String outputCatalogPath; + + @Parameter( + names = { "--disjoint-unions", "-u" }, + description = "Create disjoint union axioms", + order = 3) + private boolean disjointUnions = false; + + @Parameter( + names = { "--annotations-on-axioms", "-a" }, + description = "Emit annotations on axioms", + order = 4) + private boolean annotationsOnAxioms = false; + + @Parameter( + names = { "--debug", "-d" }, + description = "Shows debug logging statements", + order = 5) + private boolean debug; + + @Parameter( + names = { "--help", "-h" }, + description = "Displays summary of options", + help = true, + order = 6) + private boolean help; + + private final Logger LOGGER = LogManager.getLogger(Oml2OwlApp.class); + + public static void main(final String... args) throws Exception { + final Oml2OwlApp app = new Oml2OwlApp(); + final JCommander builder = JCommander.newBuilder().addObject(app).build(); + builder.parse(args); + if (app.help) { + builder.usage(); + return; + } + if (app.debug) { + final Appender appender = LogManager.getRootLogger().getAppender("stdout"); + ((AppenderSkeleton) appender).setThreshold(Level.DEBUG); + } + app.run(); + } + + public void run() throws Exception { + LOGGER.info("================================================================="); + LOGGER.info(" S T A R T"); + LOGGER.info(" OML to Owl "+getAppVersion()); + LOGGER.info("================================================================="); + LOGGER.info("Input catalog path= " + inputCatalogPath); + LOGGER.info("Output catalog path= " + outputCatalogPath); + + OmlStandaloneSetup.doSetup(); + OmlXMIResourceFactory.register(); + final XtextResourceSet inputResourceSet = new XtextResourceSet(); + + // collect OML files + final File inputCatalogFile = new File(inputCatalogPath); + final File inputFolder = inputCatalogFile.getParentFile(); + final Collection inputFiles = collectOMLFiles(inputFolder); + + // load the OML otologies + for (final File inputFile : inputFiles) { + final URI inputURI = URI.createFileURI(inputFile.getAbsolutePath()); + LOGGER.info(("Reading: " + inputURI)); + Resource r = inputResourceSet.getResource(inputURI, true); + OmlValidator.validate(OmlRead.getOntology(r)); + } + + // create OWL manager + final OWLOntologyManager ontologyManager = OWLManager.createOWLOntologyManager(); + final OwlApi owl2api = new OwlApi(ontologyManager, annotationsOnAxioms); + final Map outputFiles = new LinkedHashMap<>(); + final Map oml2owl = new LinkedHashMap<>(); + + // get the output OWL folder + final File outputCatalogFile = new File(outputCatalogPath); + final String outputFolderPath = outputCatalogFile.getParent(); + + // create the equivalent OWL ontologies + final ArrayList> callables = new ArrayList<>(); + for (final File inputFile : inputFiles) { + final URI inputURI = URI.createFileURI(inputFile.getAbsolutePath()); + final Resource inputResource = inputResourceSet.getResource(inputURI, true); + final boolean builtin = Oml2Owl.isBuiltInOntology(OmlRead.getOntology(inputResource).getIri()); + if (inputResource != null && !builtin) { + String relativePath = outputFolderPath+File.separator+inputFolder.toURI().relativize(inputFile.toURI()).getPath(); + final File outputFile = new File(relativePath.substring(0, relativePath.lastIndexOf('.')+1)+"owl"); + callables.add(new Callable() { + @Override + public Void call() throws Exception { + LOGGER.info(("Creating: " + outputFile)); + final OWLOntology owlOntology = new Oml2Owl(inputResource, owl2api).run(); + outputFiles.put(outputFile, owlOntology); + oml2owl.put(inputResource, owlOntology); + LOGGER.info(("Created: " + outputFile)); + return null; + } + }); + } + } + + ForkJoinPool forkJoinPool = new ForkJoinPool(); + forkJoinPool.invokeAll(callables); + + // run the vocabulary bundle closure algorithm + oml2owl.entrySet().stream().filter(e -> OmlRead.getOntology(e.getKey()) instanceof VocabularyBundle).forEach(entry -> { + LOGGER.info("Closing vocabulary bundle: "+entry.getKey().getURI()); + new CloseVocabularyBundleToOwl(entry.getKey(), entry.getValue(), disjointUnions, owl2api).run(); + }); + + // run the description bundle closure algorithm + oml2owl.entrySet().stream().filter(e -> OmlRead.getOntology(e.getKey()) instanceof DescriptionBundle).forEach(entry -> { + LOGGER.info("Closing description bundle: "+entry.getKey().getURI()); + new CloseDescriptionBundleToOwl(entry.getKey(), entry.getValue(), owl2api).run(); + }); + + // save the output resources + final ArrayList> callables2 = new ArrayList<>(); + outputFiles.forEach((file, owlOntology) -> { + callables2.add(new Callable() { + @Override + public Void call() throws Exception { + LOGGER.info("Saving: "+file); + ontologyManager.saveOntology(owlOntology, /*new TurtleDocumentFormat,*/ IRI.create(file)); + return null; + } + }); + }); + forkJoinPool.invokeAll(callables2); + + // create the equivalent OWL catalog + copyCatalog(inputCatalogFile, outputCatalogFile); + + LOGGER.info("================================================================="); + LOGGER.info(" E N D"); + LOGGER.info("================================================================="); + } + + private Collection collectOMLFiles(final File directory) { + final ArrayList omlFiles = new ArrayList(); + for (final File file : directory.listFiles()) { + if (file.isFile()) { + if (OML.equals(getFileExtension(file)) || OMLXMI.equals(getFileExtension(file))) { + omlFiles.add(file); + } + } else if (file.isDirectory()) { + omlFiles.addAll(collectOMLFiles(file)); + } + } + return omlFiles; + } + + private void copyCatalog(final File inputCatalogFile, final File outputCatalogFile) throws Exception { + LOGGER.info(("Saving: " + inputCatalogFile)); + Files.copy(Paths.get(inputCatalogFile.getPath()), Paths.get(outputCatalogFile.getPath()), StandardCopyOption.REPLACE_EXISTING); + final OmlCatalog inputCatalog = OmlCatalog.create(inputCatalogFile.toURI().toURL()); + List _nestedCatalogs = inputCatalog.getNestedCatalogs(); + for (final String c : _nestedCatalogs) { + final java.net.URI uri = new URL(c).toURI(); + final File nestedInputCatalogFile = new File(uri); + String relativePath = inputCatalogFile.getParentFile().toURI().relativize(uri).getPath(); + final File nestedOutputCatalogFile = new File(outputCatalogFile.getParent()+File.separator+relativePath); + copyCatalog(nestedInputCatalogFile, nestedOutputCatalogFile); + } + } + + private String getFileExtension(final File file) { + final String fileName = file.getName(); + if(fileName.lastIndexOf(".") != -1) + return fileName.substring(fileName.lastIndexOf(".")+1); + else + return ""; + } + + /** + * Get application version id from properties file. + * + * @return version string from build.properties or UNKNOWN + */ + private String getAppVersion() { + String version = "UNKNOWN"; + try { + InputStream input = Thread.currentThread().getContextClassLoader().getResourceAsStream("version.txt"); + InputStreamReader reader = new InputStreamReader(input); + version = CharStreams.toString(reader); + } catch (IOException e) { + String errorMsg = "Could not read version.txt file." + e; + LOGGER.error(errorMsg, e); + } + return version; + } + + public static class InputCatalogPath implements IParameterValidator { + @Override + public void validate(final String name, final String value) throws ParameterException { + final File file = new File(value); + if (!file.getName().endsWith("catalog.xml")) { + throw new ParameterException((("Parameter " + name) + " should be a valid OWL catalog path")); + } + } + } + + public static class OutputCatalogPath implements IParameterValidator { + @Override + public void validate(final String name, final String value) throws ParameterException { + final File file = new File(value); + if (!file.getName().endsWith("catalog.xml")) { + throw new ParameterException((("Parameter " + name) + " should be a valid OWL catalog path")); + } + final File folder = file.getParentFile(); + folder.mkdirs(); + } + } + +} diff --git a/oml2owl/src/main/java/io/opencaesar/oml2owl/OmlConstants.java b/oml2owl/src/main/java/io/opencaesar/oml2owl/OmlConstants.java new file mode 100644 index 0000000..ea3c3df --- /dev/null +++ b/oml2owl/src/main/java/io/opencaesar/oml2owl/OmlConstants.java @@ -0,0 +1,44 @@ +package io.opencaesar.oml2owl; + +public interface OmlConstants { + + static final String omlPath = "opencaesar.io/oml"; + + static final String omlIRI = "http://" + OmlConstants.omlPath; + + static final String omlNS = OmlConstants.omlIRI + "#"; + + static final String ontologyType = OmlConstants.omlNS + "ontologyType"; + + static final String Vocabulary = OmlConstants.omlNS + "Vocabulary"; + + static final String VocabularyBundle = OmlConstants.omlNS + "VocabularyBundle"; + + static final String Description = OmlConstants.omlNS + "Description"; + + static final String DescriptionBundle = OmlConstants.omlNS + "DescriptionBundle"; + + static final String Aspect = OmlConstants.omlNS + "Aspect"; + + static final String Concept = OmlConstants.omlNS + "Concept"; + + static final String RelationEntity = OmlConstants.omlNS + "RelationEntity"; + + static final String Structure = OmlConstants.omlNS + "Structure"; + + static final String forwardRelation = OmlConstants.omlNS + "forwardRelation"; + + static final String reverseRelation = OmlConstants.omlNS + "reverseRelation"; + + static final String sourceRelation = OmlConstants.omlNS + "sourceRelation"; + + static final String targetRelation = OmlConstants.omlNS + "targetRelation"; + + static final String inverseSourceRelation = OmlConstants.omlNS + "inverseSourceRelation"; + + static final String inverseTargetRelation = OmlConstants.omlNS + "inverseTargetRelation"; + + static final String structuredProperty = OmlConstants.omlNS + "structuredProperty"; + + static final String scalarProperty = OmlConstants.omlNS + "scalarProperty"; +} diff --git a/oml2owl/src/main/java/io/opencaesar/oml2owl/OwlApi.java b/oml2owl/src/main/java/io/opencaesar/oml2owl/OwlApi.java new file mode 100644 index 0000000..51be527 --- /dev/null +++ b/oml2owl/src/main/java/io/opencaesar/oml2owl/OwlApi.java @@ -0,0 +1,580 @@ +package io.opencaesar.oml2owl; + +import java.math.BigDecimal; +import java.util.Arrays; +import java.util.Collections; +import java.util.List; +import java.util.stream.Collectors; + +import org.semanticweb.owlapi.model.AddImport; +import org.semanticweb.owlapi.model.AddOntologyAnnotation; +import org.semanticweb.owlapi.model.IRI; +import org.semanticweb.owlapi.model.OWLAnnotation; +import org.semanticweb.owlapi.model.OWLAnnotationAssertionAxiom; +import org.semanticweb.owlapi.model.OWLAnnotationProperty; +import org.semanticweb.owlapi.model.OWLAnnotationValue; +import org.semanticweb.owlapi.model.OWLAnonymousIndividual; +import org.semanticweb.owlapi.model.OWLAsymmetricObjectPropertyAxiom; +import org.semanticweb.owlapi.model.OWLClass; +import org.semanticweb.owlapi.model.OWLClassAssertionAxiom; +import org.semanticweb.owlapi.model.OWLDataAllValuesFrom; +import org.semanticweb.owlapi.model.OWLDataExactCardinality; +import org.semanticweb.owlapi.model.OWLDataHasValue; +import org.semanticweb.owlapi.model.OWLDataMaxCardinality; +import org.semanticweb.owlapi.model.OWLDataMinCardinality; +import org.semanticweb.owlapi.model.OWLDataOneOf; +import org.semanticweb.owlapi.model.OWLDataProperty; +import org.semanticweb.owlapi.model.OWLDataPropertyAssertionAxiom; +import org.semanticweb.owlapi.model.OWLDataPropertyDomainAxiom; +import org.semanticweb.owlapi.model.OWLDataPropertyRangeAxiom; +import org.semanticweb.owlapi.model.OWLDataSomeValuesFrom; +import org.semanticweb.owlapi.model.OWLDatatype; +import org.semanticweb.owlapi.model.OWLDatatypeDefinitionAxiom; +import org.semanticweb.owlapi.model.OWLDatatypeRestriction; +import org.semanticweb.owlapi.model.OWLDeclarationAxiom; +import org.semanticweb.owlapi.model.OWLFacetRestriction; +import org.semanticweb.owlapi.model.OWLFunctionalDataPropertyAxiom; +import org.semanticweb.owlapi.model.OWLFunctionalObjectPropertyAxiom; +import org.semanticweb.owlapi.model.OWLHasKeyAxiom; +import org.semanticweb.owlapi.model.OWLImportsDeclaration; +import org.semanticweb.owlapi.model.OWLIndividual; +import org.semanticweb.owlapi.model.OWLInverseFunctionalObjectPropertyAxiom; +import org.semanticweb.owlapi.model.OWLInverseObjectPropertiesAxiom; +import org.semanticweb.owlapi.model.OWLIrreflexiveObjectPropertyAxiom; +import org.semanticweb.owlapi.model.OWLLiteral; +import org.semanticweb.owlapi.model.OWLNamedIndividual; +import org.semanticweb.owlapi.model.OWLObjectAllValuesFrom; +import org.semanticweb.owlapi.model.OWLObjectExactCardinality; +import org.semanticweb.owlapi.model.OWLObjectHasValue; +import org.semanticweb.owlapi.model.OWLObjectMaxCardinality; +import org.semanticweb.owlapi.model.OWLObjectMinCardinality; +import org.semanticweb.owlapi.model.OWLObjectProperty; +import org.semanticweb.owlapi.model.OWLObjectPropertyAssertionAxiom; +import org.semanticweb.owlapi.model.OWLObjectPropertyDomainAxiom; +import org.semanticweb.owlapi.model.OWLObjectPropertyRangeAxiom; +import org.semanticweb.owlapi.model.OWLObjectSomeValuesFrom; +import org.semanticweb.owlapi.model.OWLOntology; +import org.semanticweb.owlapi.model.OWLOntologyCreationException; +import org.semanticweb.owlapi.model.OWLOntologyManager; +import org.semanticweb.owlapi.model.OWLReflexiveObjectPropertyAxiom; +import org.semanticweb.owlapi.model.OWLSubClassOfAxiom; +import org.semanticweb.owlapi.model.OWLSubDataPropertyOfAxiom; +import org.semanticweb.owlapi.model.OWLSubObjectPropertyOfAxiom; +import org.semanticweb.owlapi.model.OWLSymmetricObjectPropertyAxiom; +import org.semanticweb.owlapi.model.OWLTransitiveObjectPropertyAxiom; +import org.semanticweb.owlapi.model.SWRLAtom; +import org.semanticweb.owlapi.model.SWRLClassAtom; +import org.semanticweb.owlapi.model.SWRLDifferentIndividualsAtom; +import org.semanticweb.owlapi.model.SWRLObjectPropertyAtom; +import org.semanticweb.owlapi.model.SWRLRule; +import org.semanticweb.owlapi.model.SWRLSameIndividualAtom; +import org.semanticweb.owlapi.model.SWRLVariable; +import org.semanticweb.owlapi.vocab.OWLFacet; + +public class OwlApi extends io.opencaesar.closeworld.OwlApi { + + private final String XSD = "http://www.w3.org/2001/XMLSchema#"; + + protected final boolean annotationsOnAxioms; + + public OwlApi(final OWLOntologyManager manager, final boolean annotationsOnAxioms) { + super(manager); + this.annotationsOnAxioms = annotationsOnAxioms; + } + + public IRI createIri(final String iri) { + return IRI.create(iri); + } + + public OWLOntology createOntology(final String iri) { + try { + return manager.createOntology(IRI.create(iri)); + } catch (OWLOntologyCreationException e) { + e.printStackTrace(); + return null; + } + } + + public OWLImportsDeclaration addImportsDeclaration(final OWLOntology ontology, final String iri) { + final OWLImportsDeclaration import_ = factory.getOWLImportsDeclaration(IRI.create(iri)); + manager.applyChanges(new AddImport(ontology, import_)); + return import_; + } + + public OWLClass addClass(final OWLOntology ontology, final String iri) { + final OWLClass class_ = factory.getOWLClass(iri); + final OWLDeclarationAxiom axiom = factory.getOWLDeclarationAxiom(class_); + manager.addAxiom(ontology, axiom); + return class_; + } + + public OWLDatatype addDatatype(final OWLOntology ontology, final String iri) { + final OWLDatatype datatype = factory.getOWLDatatype(iri); + final OWLDeclarationAxiom axiom = factory.getOWLDeclarationAxiom(datatype); + manager.addAxiom(ontology, axiom); + return datatype; + } + + public OWLDatatypeDefinitionAxiom addDatatypeDefinition(final OWLOntology ontology, final String datatypeIri, final String restrictedIri, final OWLFacetRestriction[] restrictions, final OWLAnnotation... annotations) { + final OWLDatatype datatype = factory.getOWLDatatype(datatypeIri); + final OWLDatatype restrictedDatatype = factory.getOWLDatatype(restrictedIri); + final OWLDatatypeRestriction restriction = factory.getOWLDatatypeRestriction(restrictedDatatype, restrictions); + final OWLDatatypeDefinitionAxiom axiom = factory.getOWLDatatypeDefinitionAxiom(datatype, restriction, checkIfNeeded(annotations)); + manager.addAxiom(ontology, axiom); + return axiom; + } + + public OWLDatatypeDefinitionAxiom addDatatypeDefinition(final OWLOntology ontology, final String datatypeIri, final String synonymIri, final OWLAnnotation... annotations) { + final OWLDatatype datatype = factory.getOWLDatatype(datatypeIri); + final OWLDatatype synonymDatatype = factory.getOWLDatatype(synonymIri); + final OWLDatatypeDefinitionAxiom axiom = factory.getOWLDatatypeDefinitionAxiom(datatype, synonymDatatype, checkIfNeeded(annotations)); + manager.addAxiom(ontology, axiom); + return axiom; + } + + public OWLDataOneOf addDataOneOf(final OWLOntology ontology, final String subIri, final OWLLiteral... literals) { + final OWLDatatype datatype = factory.getOWLDatatype(subIri); + final OWLDataOneOf dataOneOf = factory.getOWLDataOneOf(literals); + final OWLDatatypeDefinitionAxiom axiom = factory.getOWLDatatypeDefinitionAxiom(datatype, dataOneOf); + manager.addAxiom(ontology, axiom); + return dataOneOf; + } + + public OWLObjectProperty addObjectProperty(final OWLOntology ontology, final String iri) { + final OWLObjectProperty property = factory.getOWLObjectProperty(iri); + final OWLDeclarationAxiom axiom = factory.getOWLDeclarationAxiom(property); + manager.addAxiom(ontology, axiom); + return property; + } + + public OWLObjectProperty addFunctionalObjectProperty(final OWLOntology ontology, final String iri) { + final OWLObjectProperty property = factory.getOWLObjectProperty(iri); + final OWLFunctionalObjectPropertyAxiom axiom = factory.getOWLFunctionalObjectPropertyAxiom(property); + manager.addAxiom(ontology, axiom); + return property; + } + + public OWLObjectProperty addInverseFunctionalObjectProperty(final OWLOntology ontology, final String iri) { + final OWLObjectProperty property = factory.getOWLObjectProperty(iri); + final OWLInverseFunctionalObjectPropertyAxiom axiom = factory.getOWLInverseFunctionalObjectPropertyAxiom(property); + manager.addAxiom(ontology, axiom); + return property; + } + + public OWLObjectProperty addSymmetricObjectProperty(final OWLOntology ontology, final String iri) { + final OWLObjectProperty property = factory.getOWLObjectProperty(iri); + final OWLSymmetricObjectPropertyAxiom axiom = factory.getOWLSymmetricObjectPropertyAxiom(property); + manager.addAxiom(ontology, axiom); + return property; + } + + public OWLObjectProperty addAsymmetricObjectProperty(final OWLOntology ontology, final String iri) { + final OWLObjectProperty property = factory.getOWLObjectProperty(iri); + final OWLAsymmetricObjectPropertyAxiom axiom = factory.getOWLAsymmetricObjectPropertyAxiom(property); + manager.addAxiom(ontology, axiom); + return property; + } + + public OWLObjectProperty addReflexiveObjectProperty(final OWLOntology ontology, final String iri) { + final OWLObjectProperty property = factory.getOWLObjectProperty(iri); + final OWLReflexiveObjectPropertyAxiom axiom = factory.getOWLReflexiveObjectPropertyAxiom(property); + manager.addAxiom(ontology, axiom); + return property; + } + + public OWLObjectProperty addIrreflexiveObjectProperty(final OWLOntology ontology, final String iri) { + final OWLObjectProperty property = factory.getOWLObjectProperty(iri); + final OWLIrreflexiveObjectPropertyAxiom axiom = factory.getOWLIrreflexiveObjectPropertyAxiom(property); + manager.addAxiom(ontology, axiom); + return property; + } + + public OWLObjectProperty addTransitiveObjectProperty(final OWLOntology ontology, final String iri) { + final OWLObjectProperty property = factory.getOWLObjectProperty(iri); + final OWLTransitiveObjectPropertyAxiom axiom = factory.getOWLTransitiveObjectPropertyAxiom(property); + manager.addAxiom(ontology, axiom); + return property; + } + + public OWLDataProperty addDataProperty(final OWLOntology ontology, final String iri) { + final OWLDataProperty property = factory.getOWLDataProperty(iri); + final OWLDeclarationAxiom axiom = factory.getOWLDeclarationAxiom(property); + manager.addAxiom(ontology, axiom); + return property; + } + + public OWLDataProperty addFunctionalDataProperty(final OWLOntology ontology, final String iri) { + final OWLDataProperty property = factory.getOWLDataProperty(iri); + final OWLFunctionalDataPropertyAxiom axiom = factory.getOWLFunctionalDataPropertyAxiom(property); + manager.addAxiom(ontology, axiom); + return property; + } + + public OWLAnnotationProperty addAnnotationProperty(final OWLOntology ontology, final String iri) { + final OWLAnnotationProperty property = factory.getOWLAnnotationProperty(iri); + final OWLDeclarationAxiom axiom = factory.getOWLDeclarationAxiom(property); + manager.addAxiom(ontology, axiom); + return property; + } + + public OWLNamedIndividual addNamedIndividual(final OWLOntology ontology, final String iri) { + final OWLNamedIndividual individual = factory.getOWLNamedIndividual(iri); + final OWLDeclarationAxiom axiom = factory.getOWLDeclarationAxiom(individual); + manager.addAxiom(ontology, axiom); + return individual; + } + + public OWLNamedIndividual getNamedIndividual(final String nodeId) { + return factory.getOWLNamedIndividual(nodeId); + } + + public OWLAnonymousIndividual getAnonymousIndividual(final String nodeId) { + return factory.getOWLAnonymousIndividual(nodeId); + } + + public SWRLRule addRule(final OWLOntology ontology, final List head, final List body, final OWLAnnotation... annotations) { + final SWRLRule axiom = factory.getSWRLRule(body, head, Arrays.asList(annotations)); + manager.addAxiom(ontology, axiom); + return axiom; + } + + public SWRLClassAtom getClassAtom(final String classIri, final String variableIri) { + final OWLClass class_ = factory.getOWLClass(classIri); + final SWRLVariable variable = factory.getSWRLVariable(variableIri); + return factory.getSWRLClassAtom(class_, variable); + } + + public SWRLObjectPropertyAtom getObjectPropertyAtom(final String propertyIri, final String variable1Iri, final String variable2Iri) { + final OWLObjectProperty property = factory.getOWLObjectProperty(propertyIri); + final SWRLVariable variable1 = factory.getSWRLVariable(variable1Iri); + final SWRLVariable variable2 = factory.getSWRLVariable(variable2Iri); + return factory.getSWRLObjectPropertyAtom(property, variable1, variable2); + } + + public SWRLSameIndividualAtom getSameIndividualAtom(final String variable1Iri, final String variable2Iri) { + final SWRLVariable variable1 = factory.getSWRLVariable(variable1Iri); + final SWRLVariable variable2 = factory.getSWRLVariable(variable2Iri); + return factory.getSWRLSameIndividualAtom(variable1, variable2); + } + + public SWRLDifferentIndividualsAtom getDifferentIndividualsAtom(final String variable1Iri, final String variable2Iri) { + final SWRLVariable variable1 = factory.getSWRLVariable(variable1Iri); + final SWRLVariable variable2 = factory.getSWRLVariable(variable2Iri); + return factory.getSWRLDifferentIndividualsAtom(variable1, variable2); + } + + public OWLSubClassOfAxiom addSubClassOf(final OWLOntology ontology, final String subIri, final String superIri, final OWLAnnotation... annotations) { + final OWLClass subClass = factory.getOWLClass(subIri); + final OWLClass supClass = factory.getOWLClass(superIri); + final OWLSubClassOfAxiom axiom = factory.getOWLSubClassOfAxiom(subClass, supClass, checkIfNeeded(annotations)); + manager.addAxiom(ontology, axiom); + return axiom; + } + + public OWLHasKeyAxiom addHasKey(final OWLOntology ontology, final String classIri, final List keyPropertyIris, final OWLAnnotation... annotations) { + final OWLClass aClass = factory.getOWLClass(classIri); + final List keyProperties = keyPropertyIris.stream().map(iri -> factory.getOWLDataProperty(iri)).collect(Collectors.toList()); + final OWLHasKeyAxiom axiom = factory.getOWLHasKeyAxiom(aClass, keyProperties, checkIfNeeded(annotations)); + manager.addAxiom(ontology, axiom); + return axiom; + } + + public OWLSubClassOfAxiom addObjectSomeValuesFrom(final OWLOntology ontology, final String classIri, final String propertyIri, final String typeIri, final OWLAnnotation... annotations) { + final OWLClass class_ = factory.getOWLClass(classIri); + final OWLObjectProperty property = factory.getOWLObjectProperty(propertyIri); + final OWLClass type = factory.getOWLClass(typeIri); + final OWLObjectSomeValuesFrom restriction = factory.getOWLObjectSomeValuesFrom(property, type); + final OWLSubClassOfAxiom axiom = factory.getOWLSubClassOfAxiom(class_, restriction, checkIfNeeded(annotations)); + manager.addAxiom(ontology, axiom); + return axiom; + } + + public OWLSubClassOfAxiom addObjectAllValuesFrom(final OWLOntology ontology, final String classIri, final String propertyIri, final String typeIri, final OWLAnnotation... annotations) { + final OWLClass class_ = factory.getOWLClass(classIri); + final OWLObjectProperty property = factory.getOWLObjectProperty(propertyIri); + final OWLClass type = factory.getOWLClass(typeIri); + final OWLObjectAllValuesFrom restriction = factory.getOWLObjectAllValuesFrom(property, type); + final OWLSubClassOfAxiom axiom = factory.getOWLSubClassOfAxiom(class_, restriction, checkIfNeeded(annotations)); + manager.addAxiom(ontology, axiom); + return axiom; + } + + public OWLSubClassOfAxiom addObjectHasValue(final OWLOntology ontology, final String classIri, final String propertyIri, final OWLIndividual individual, final OWLAnnotation... annotations) { + final OWLClass class_ = factory.getOWLClass(classIri); + final OWLObjectProperty property = factory.getOWLObjectProperty(propertyIri); + final OWLObjectHasValue restriction = factory.getOWLObjectHasValue(property, individual); + final OWLSubClassOfAxiom axiom = factory.getOWLSubClassOfAxiom(class_, restriction, checkIfNeeded(annotations)); + manager.addAxiom(ontology, axiom); + return axiom; + } + + public OWLSubClassOfAxiom addObjectHasValue(final OWLOntology ontology, final String classIri, final String propertyIri, final String individualIri, final OWLAnnotation... annotations) { + final OWLClass class_ = factory.getOWLClass(classIri); + final OWLObjectProperty property = factory.getOWLObjectProperty(propertyIri); + final OWLNamedIndividual individual = factory.getOWLNamedIndividual(individualIri); + final OWLObjectHasValue restriction = factory.getOWLObjectHasValue(property, individual); + final OWLSubClassOfAxiom axiom = factory.getOWLSubClassOfAxiom(class_, restriction, checkIfNeeded(annotations)); + manager.addAxiom(ontology, axiom); + return axiom; + } + + public OWLSubClassOfAxiom addObjectExactCardinality(final OWLOntology ontology, final String classIri, final String propertyIri, final int cardinality, final String rangeIri, final OWLAnnotation... annotations) { + final OWLClass class_ = factory.getOWLClass(classIri); + final OWLObjectProperty property = factory.getOWLObjectProperty(propertyIri); + final OWLObjectExactCardinality restriction; + if (rangeIri != null) { + restriction = factory.getOWLObjectExactCardinality(cardinality, property, factory.getOWLClass(rangeIri)); + } else { + restriction = factory.getOWLObjectExactCardinality(cardinality, property); + } + final OWLSubClassOfAxiom axiom = factory.getOWLSubClassOfAxiom(class_, restriction, checkIfNeeded(annotations)); + manager.addAxiom(ontology, axiom); + return axiom; + } + + public OWLSubClassOfAxiom addObjectMinCardinality(final OWLOntology ontology, final String classIri, final String propertyIri, final int cardinality, final String rangeIri, final OWLAnnotation... annotations) { + final OWLClass class_ = factory.getOWLClass(classIri); + final OWLObjectProperty property = factory.getOWLObjectProperty(propertyIri); + final OWLObjectMinCardinality restriction; + if (rangeIri != null) { + restriction = factory.getOWLObjectMinCardinality(cardinality, property, factory.getOWLClass(rangeIri)); + } else { + restriction = factory.getOWLObjectMinCardinality(cardinality, property); + } + final OWLSubClassOfAxiom axiom = factory.getOWLSubClassOfAxiom(class_, restriction, checkIfNeeded(annotations)); + manager.addAxiom(ontology, axiom); + return axiom; + } + + public OWLSubClassOfAxiom addObjectMaxCardinality(final OWLOntology ontology, final String classIri, final String propertyIri, final int cardinality, final String rangeIri, final OWLAnnotation... annotations) { + final OWLClass class_ = factory.getOWLClass(classIri); + final OWLObjectProperty property = factory.getOWLObjectProperty(propertyIri); + final OWLObjectMaxCardinality restriction; + if (rangeIri != null) { + restriction = factory.getOWLObjectMaxCardinality(cardinality, property, factory.getOWLClass(rangeIri)); + } else { + restriction = factory.getOWLObjectMaxCardinality(cardinality, property); + } + final OWLSubClassOfAxiom axiom = factory.getOWLSubClassOfAxiom(class_, restriction, checkIfNeeded(annotations)); + manager.addAxiom(ontology, axiom); + return axiom; + } + + public OWLSubClassOfAxiom addDataExactCardinality(final OWLOntology ontology, final String classIri, final String propertyIri, final int cardinality, final String rangeIri, final OWLAnnotation... annotations) { + final OWLClass class_ = factory.getOWLClass(classIri); + final OWLDataProperty property = factory.getOWLDataProperty(propertyIri); + final OWLDataExactCardinality restriction; + if (rangeIri != null) { + restriction = factory.getOWLDataExactCardinality(cardinality, property, factory.getOWLDatatype(rangeIri)); + } else { + restriction = factory.getOWLDataExactCardinality(cardinality, property); + } + final OWLSubClassOfAxiom axiom = factory.getOWLSubClassOfAxiom(class_, restriction, checkIfNeeded(annotations)); + manager.addAxiom(ontology, axiom); + return axiom; + } + + public OWLSubClassOfAxiom addDataMinCardinality(final OWLOntology ontology, final String classIri, final String propertyIri, final int cardinality, final String rangeIri, final OWLAnnotation... annotations) { + final OWLClass class_ = factory.getOWLClass(classIri); + final OWLDataProperty property = factory.getOWLDataProperty(propertyIri); + final OWLDataMinCardinality restriction; + if (rangeIri != null) { + restriction = factory.getOWLDataMinCardinality(cardinality, property, factory.getOWLDatatype(rangeIri)); + } else { + restriction = factory.getOWLDataMinCardinality(cardinality, property); + } + final OWLSubClassOfAxiom axiom = factory.getOWLSubClassOfAxiom(class_, restriction, checkIfNeeded(annotations)); + manager.addAxiom(ontology, axiom); + return axiom; + } + + public OWLSubClassOfAxiom addDataMaxCardinality(final OWLOntology ontology, final String classIri, final String propertyIri, final int cardinality, final String rangeIri, final OWLAnnotation... annotations) { + final OWLClass class_ = factory.getOWLClass(classIri); + final OWLDataProperty property = factory.getOWLDataProperty(propertyIri); + final OWLDataMaxCardinality restriction; + if (rangeIri != null) { + restriction = factory.getOWLDataMaxCardinality(cardinality, property, factory.getOWLDatatype(rangeIri)); + } else { + restriction = factory.getOWLDataMaxCardinality(cardinality, property); + } + final OWLSubClassOfAxiom axiom = factory.getOWLSubClassOfAxiom(class_, restriction, checkIfNeeded(annotations)); + manager.addAxiom(ontology, axiom); + return axiom; + } + + public OWLSubClassOfAxiom addDataSomeValuesFrom(final OWLOntology ontology, final String classIri, final String propertyIri, final String typeIri, final OWLAnnotation... annotations) { + final OWLClass class_ = factory.getOWLClass(classIri); + final OWLDataProperty property = factory.getOWLDataProperty(propertyIri); + final OWLDatatype type = factory.getOWLDatatype(typeIri); + final OWLDataSomeValuesFrom restriction = factory.getOWLDataSomeValuesFrom(property, type); + final OWLSubClassOfAxiom axiom = factory.getOWLSubClassOfAxiom(class_, restriction, checkIfNeeded(annotations)); + manager.addAxiom(ontology, axiom); + return axiom; + } + + public OWLSubClassOfAxiom addDataAllValuesFrom(final OWLOntology ontology, final String classIri, final String propertyIri, final String typeIri, final OWLAnnotation... annotations) { + final OWLClass class_ = factory.getOWLClass(classIri); + final OWLDataProperty property = factory.getOWLDataProperty(propertyIri); + final OWLDatatype type = factory.getOWLDatatype(typeIri); + final OWLDataAllValuesFrom restriction = factory.getOWLDataAllValuesFrom(property, type); + final OWLSubClassOfAxiom axiom = factory.getOWLSubClassOfAxiom(class_, restriction, checkIfNeeded(annotations)); + manager.addAxiom(ontology, axiom); + return axiom; + } + + public OWLSubClassOfAxiom addDataHasValue(final OWLOntology ontology, final String classIri, final String propertyIri, final OWLLiteral literal, final OWLAnnotation... annotations) { + final OWLClass class_ = factory.getOWLClass(classIri); + final OWLDataProperty property = factory.getOWLDataProperty(propertyIri); + final OWLDataHasValue restriction = factory.getOWLDataHasValue(property, literal); + final OWLSubClassOfAxiom axiom = factory.getOWLSubClassOfAxiom(class_, restriction, checkIfNeeded(annotations)); + manager.addAxiom(ontology, axiom); + return axiom; + } + + public OWLSubObjectPropertyOfAxiom addSubObjectPropertyOf(final OWLOntology ontology, final String subPropertyIri, final String superPropertyIri, final OWLAnnotation... annotations) { + final OWLObjectProperty subProperty = factory.getOWLObjectProperty(subPropertyIri); + final OWLObjectProperty supProperty = factory.getOWLObjectProperty(superPropertyIri); + final OWLSubObjectPropertyOfAxiom axiom = factory.getOWLSubObjectPropertyOfAxiom(subProperty, supProperty, checkIfNeeded(annotations)); + manager.addAxiom(ontology, axiom); + return axiom; + } + + public OWLObjectPropertyDomainAxiom addObjectPropertyDomain(final OWLOntology ontology, final String propertyIri, final String domainIri) { + final OWLObjectProperty property = factory.getOWLObjectProperty(propertyIri); + final OWLClass domain = factory.getOWLClass(domainIri); + final OWLObjectPropertyDomainAxiom axiom = factory.getOWLObjectPropertyDomainAxiom(property, domain); + manager.addAxiom(ontology, axiom); + return axiom; + } + + public OWLObjectPropertyRangeAxiom addObjectPropertyRange(final OWLOntology ontology, final String propertyIri, final String rangeIri) { + final OWLObjectProperty property = factory.getOWLObjectProperty(propertyIri); + final OWLClass range = factory.getOWLClass(rangeIri); + final OWLObjectPropertyRangeAxiom axiom = factory.getOWLObjectPropertyRangeAxiom(property, range); + manager.addAxiom(ontology, axiom); + return axiom; + } + + public OWLSubDataPropertyOfAxiom addSubDataPropertyOf(final OWLOntology ontology, final String subPropertyIri, final String superPropertyIri, final OWLAnnotation... annotations) { + final OWLDataProperty subProperty = factory.getOWLDataProperty(subPropertyIri); + final OWLDataProperty supProperty = factory.getOWLDataProperty(superPropertyIri); + final OWLSubDataPropertyOfAxiom axiom = factory.getOWLSubDataPropertyOfAxiom(subProperty, supProperty, checkIfNeeded(annotations)); + manager.addAxiom(ontology, axiom); + return axiom; + } + + public OWLDataPropertyDomainAxiom addDataPropertyDomain(final OWLOntology ontology, final String propertyIri, final String domainIri) { + final OWLDataProperty property = factory.getOWLDataProperty(propertyIri); + final OWLClass domain = factory.getOWLClass(domainIri); + final OWLDataPropertyDomainAxiom axiom = factory.getOWLDataPropertyDomainAxiom(property, domain); + manager.addAxiom(ontology, axiom); + return axiom; + } + + public OWLDataPropertyRangeAxiom addDataPropertyRange(final OWLOntology ontology, final String propertyIri, final String rangeIri) { + final OWLDataProperty property = factory.getOWLDataProperty(propertyIri); + final OWLDatatype range = factory.getOWLDatatype(rangeIri); + final OWLDataPropertyRangeAxiom axiom = factory.getOWLDataPropertyRangeAxiom(property, range); + manager.addAxiom(ontology, axiom); + return axiom; + } + + public OWLInverseObjectPropertiesAxiom addInverseProperties(final OWLOntology ontology, final String forwardPropertyIri, final String reversePropertyIri) { + final OWLObjectProperty forwardproperty = factory.getOWLObjectProperty(forwardPropertyIri); + final OWLObjectProperty reverseProperty = factory.getOWLObjectProperty(reversePropertyIri); + final OWLInverseObjectPropertiesAxiom axiom = factory.getOWLInverseObjectPropertiesAxiom(forwardproperty, reverseProperty); + manager.addAxiom(ontology, axiom); + return axiom; + } + + public OWLClassAssertionAxiom addClassAssertion(final OWLOntology ontology, final String individualIri, final String classIri, final OWLAnnotation... annotations) { + final OWLNamedIndividual individual = factory.getOWLNamedIndividual(individualIri); + final OWLClass class_ = factory.getOWLClass(classIri); + final OWLClassAssertionAxiom axiom = factory.getOWLClassAssertionAxiom(class_, individual, checkIfNeeded(annotations)); + manager.addAxiom(ontology, axiom); + return axiom; + } + + public OWLObjectPropertyAssertionAxiom addObjectPropertyAssertion(final OWLOntology ontology, final String individualIri, final String propertyIri, final String objectIri, final OWLAnnotation... annotations) { + final OWLNamedIndividual object = factory.getOWLNamedIndividual(objectIri); + final OWLNamedIndividual individual = factory.getOWLNamedIndividual(individualIri); + return addObjectPropertyAssertion(ontology, individual, propertyIri, object, annotations); + } + + public OWLObjectPropertyAssertionAxiom addObjectPropertyAssertion(final OWLOntology ontology, final OWLIndividual individual, final String propertyIri, final OWLIndividual object, final OWLAnnotation... annotations) { + final OWLObjectProperty property = factory.getOWLObjectProperty(propertyIri); + final OWLObjectPropertyAssertionAxiom axiom = factory.getOWLObjectPropertyAssertionAxiom(property, individual, object, checkIfNeeded(annotations)); + manager.addAxiom(ontology, axiom); + return axiom; + } + + public OWLDataPropertyAssertionAxiom addDataPropertyAssertion(final OWLOntology ontology, final String individualIri, final String propertyIri, final OWLLiteral literal, final OWLAnnotation... annotations) { + final OWLNamedIndividual individual = factory.getOWLNamedIndividual(individualIri); + return addDataPropertyAssertion(ontology, individual, propertyIri, literal, annotations); + } + + public OWLDataPropertyAssertionAxiom addDataPropertyAssertion(final OWLOntology ontology, final OWLIndividual individual, final String propertyIri, final OWLLiteral literal, final OWLAnnotation... annotations) { + final OWLDataProperty property = factory.getOWLDataProperty(propertyIri); + final OWLDataPropertyAssertionAxiom axiom = factory.getOWLDataPropertyAssertionAxiom(property, individual, literal, checkIfNeeded(annotations)); + manager.addAxiom(ontology, axiom); + return axiom; + } + + public OWLAnnotation getAnnotation(final String propertyIri, final OWLAnnotationValue value) { + final OWLAnnotationProperty property = factory.getOWLAnnotationProperty(propertyIri); + return factory.getOWLAnnotation(property, value); + } + + public OWLAnnotation addOntologyAnnotation(final OWLOntology ontology, final OWLAnnotation annotation) { + AddOntologyAnnotation _addOntologyAnnotation = new AddOntologyAnnotation(ontology, annotation); + manager.applyChange(_addOntologyAnnotation); + return annotation; + } + + public OWLAnnotationAssertionAxiom addAnnotationAssertion(final OWLOntology ontology, final String subjectIri, final OWLAnnotation annotation) { + final OWLAnnotationAssertionAxiom axiom = factory.getOWLAnnotationAssertionAxiom(IRI.create(subjectIri), annotation); + manager.addAxiom(ontology, axiom); + return axiom; + } + + public OWLFacetRestriction getFacetRestriction(final OWLFacet facet, final OWLLiteral value) { + return factory.getOWLFacetRestriction(facet, value); + } + + public OWLLiteral getLiteral(final boolean value) { + return factory.getOWLLiteral(value); + } + + public OWLLiteral getLiteral(final int value) { + return factory.getOWLLiteral(value); + } + + public OWLLiteral getLiteral(final double value) { + return factory.getOWLLiteral(value); + } + + public OWLLiteral getLiteral(final String value) { + return factory.getOWLLiteral(value); + } + + public OWLLiteral getLiteral(final BigDecimal value) { + return getLiteralWithDatatype(value.toString(), (XSD + "decimal")); + } + + public OWLLiteral getLiteralWithDatatype(final String value, final String datatypeIri) { + final OWLDatatype datatype = factory.getOWLDatatype(datatypeIri); + return factory.getOWLLiteral(value, datatype); + } + + public OWLLiteral getLiteralWithLangTag(final String value, final String langTag) { + return factory.getOWLLiteral(value, langTag); + } + + public List checkIfNeeded(final OWLAnnotation... annotations) { + if (annotationsOnAxioms) { + return Arrays.asList(annotations); + } else { + return Collections.emptyList(); + } + } +} diff --git a/oml2owl/src/main/resources/version.txt b/oml2owl/src/main/resources/version.txt new file mode 100644 index 0000000..8adc70f --- /dev/null +++ b/oml2owl/src/main/resources/version.txt @@ -0,0 +1 @@ +0.8.0 \ No newline at end of file diff --git a/owl-adapter/oml2owl-gradle/src/main/resources/version.txt b/owl-adapter/oml2owl-gradle/src/main/resources/version.txt deleted file mode 100755 index 8fd9b8c..0000000 --- a/owl-adapter/oml2owl-gradle/src/main/resources/version.txt +++ /dev/null @@ -1 +0,0 @@ -0.7.11 \ No newline at end of file diff --git a/owl-adapter/oml2owl/src/main/java/io/opencaesar/oml2owl/Oml2Owl.xtend b/owl-adapter/oml2owl/src/main/java/io/opencaesar/oml2owl/Oml2Owl.xtend deleted file mode 100644 index 8d5d39d..0000000 --- a/owl-adapter/oml2owl/src/main/java/io/opencaesar/oml2owl/Oml2Owl.xtend +++ /dev/null @@ -1,649 +0,0 @@ -package io.opencaesar.oml2owl - -import io.opencaesar.oml.AnnotatedElement -import io.opencaesar.oml.Annotation -import io.opencaesar.oml.AnnotationProperty -import io.opencaesar.oml.Aspect -import io.opencaesar.oml.BooleanLiteral -import io.opencaesar.oml.CardinalityRestrictionKind -import io.opencaesar.oml.Concept -import io.opencaesar.oml.ConceptInstance -import io.opencaesar.oml.ConceptInstanceReference -import io.opencaesar.oml.ConceptTypeAssertion -import io.opencaesar.oml.DecimalLiteral -import io.opencaesar.oml.Description -import io.opencaesar.oml.DescriptionBundle -import io.opencaesar.oml.DifferentFromPredicate -import io.opencaesar.oml.DoubleLiteral -import io.opencaesar.oml.EntityPredicate -import io.opencaesar.oml.EnumeratedScalar -import io.opencaesar.oml.FacetedScalar -import io.opencaesar.oml.ForwardRelation -import io.opencaesar.oml.Import -import io.opencaesar.oml.IntegerLiteral -import io.opencaesar.oml.KeyAxiom -import io.opencaesar.oml.LinkAssertion -import io.opencaesar.oml.Member -import io.opencaesar.oml.Ontology -import io.opencaesar.oml.QuotedLiteral -import io.opencaesar.oml.RangeRestrictionKind -import io.opencaesar.oml.Reference -import io.opencaesar.oml.RelationCardinalityRestrictionAxiom -import io.opencaesar.oml.RelationEntity -import io.opencaesar.oml.RelationEntityPredicate -import io.opencaesar.oml.RelationInstance -import io.opencaesar.oml.RelationInstanceReference -import io.opencaesar.oml.RelationPredicate -import io.opencaesar.oml.RelationRangeRestrictionAxiom -import io.opencaesar.oml.RelationTargetRestrictionAxiom -import io.opencaesar.oml.RelationTypeAssertion -import io.opencaesar.oml.ReverseRelation -import io.opencaesar.oml.Rule -import io.opencaesar.oml.SameAsPredicate -import io.opencaesar.oml.ScalarProperty -import io.opencaesar.oml.ScalarPropertyCardinalityRestrictionAxiom -import io.opencaesar.oml.ScalarPropertyRangeRestrictionAxiom -import io.opencaesar.oml.ScalarPropertyValueAssertion -import io.opencaesar.oml.ScalarPropertyValueRestrictionAxiom -import io.opencaesar.oml.SpecializationAxiom -import io.opencaesar.oml.Structure -import io.opencaesar.oml.StructureInstance -import io.opencaesar.oml.StructuredProperty -import io.opencaesar.oml.StructuredPropertyCardinalityRestrictionAxiom -import io.opencaesar.oml.StructuredPropertyRangeRestrictionAxiom -import io.opencaesar.oml.StructuredPropertyValueAssertion -import io.opencaesar.oml.StructuredPropertyValueRestrictionAxiom -import io.opencaesar.oml.Term -import io.opencaesar.oml.Vocabulary -import io.opencaesar.oml.VocabularyBundle -import io.opencaesar.oml.util.OmlVisitor -import java.util.ArrayList -import org.eclipse.emf.ecore.resource.Resource -import org.eclipse.rdf4j.model.vocabulary.RDFS -import org.semanticweb.owlapi.model.OWLAnnotation -import org.semanticweb.owlapi.model.OWLIndividual -import org.semanticweb.owlapi.model.OWLNamedIndividual -import org.semanticweb.owlapi.model.OWLOntology -import org.semanticweb.owlapi.model.SWRLAtom -import org.semanticweb.owlapi.vocab.OWLFacet - -import static extension io.opencaesar.oml.util.OmlRead.* - -class Oml2Owl extends OmlVisitor { - - public static val BUILT_IN_ONTOLOGIES = #[ - 'http://www.w3.org/2001/XMLSchema', - 'http://www.w3.org/1999/02/22-rdf-syntax-ns', - 'http://www.w3.org/2000/01/rdf-schema', - 'http://www.w3.org/2002/07/owl' - ] - - val Resource inputResource - val OwlApi owl - var OWLOntology ontology - - new(Resource inputResource, OwlApi owl2) { - this.inputResource = inputResource - this.owl = owl2 - } - - def OWLOntology run() { - inputResource.allContents.forEach[doSwitch] - return ontology - } - - override caseAnnotation(Annotation annotation) { - annotation.annotatedElement.addsAnnotation(annotation) - return null - } - - override caseVocabulary(Vocabulary vocabulary) { - ontology = owl.createOntology(vocabulary.iri) - owl.addOntologyAnnotation(ontology, owl.getAnnotation(OmlConstants.ontologyType, owl.createIri(OmlConstants.Vocabulary))) - return null - } - - override caseVocabularyBundle(VocabularyBundle bundle) { - ontology = owl.createOntology(bundle.iri) - owl.addOntologyAnnotation(ontology, owl.getAnnotation(OmlConstants.ontologyType, owl.createIri(OmlConstants.VocabularyBundle))) - return null - } - - override caseDescription(Description description) { - ontology = owl.createOntology(description.iri) - owl.addOntologyAnnotation(ontology, owl.getAnnotation(OmlConstants.ontologyType, owl.createIri(OmlConstants.Description))) - return null - } - - override caseDescriptionBundle(DescriptionBundle bundle) { - ontology = owl.createOntology(bundle.iri) - owl.addOntologyAnnotation(ontology, owl.getAnnotation(OmlConstants.ontologyType, owl.createIri(OmlConstants.DescriptionBundle))) - return null - } - - override caseAspect(Aspect aspect) { - owl.addClass(ontology, aspect.iri) - owl.addSubClassOf(ontology, aspect.iri, OmlConstants.Aspect) - return null - } - - override caseConcept(Concept concept) { - owl.addClass(ontology, concept.iri) - owl.addSubClassOf(ontology, concept.iri, OmlConstants.Concept) - return null - } - - override caseRelationEntity(RelationEntity entity) { - owl.addClass(ontology, entity.iri) - owl.addSubClassOf(ontology, entity.iri, OmlConstants.RelationEntity) - - // source relation - val sourceIri = entity.sourceIri - owl.addObjectProperty(ontology, sourceIri) - owl.addSubObjectPropertyOf(ontology, sourceIri, OmlConstants.sourceRelation) - owl.addObjectPropertyDomain(ontology, sourceIri, entity.iri) - owl.addObjectPropertyRange(ontology, sourceIri, entity.source.iri) - owl.addFunctionalObjectProperty(ontology, sourceIri) - if (entity.functional) { - owl.addInverseFunctionalObjectProperty(ontology, sourceIri) - } - - // target relation - val targetIri = entity.targetIri - owl.addObjectProperty(ontology, targetIri) - owl.addSubObjectPropertyOf(ontology, targetIri, OmlConstants.targetRelation) - owl.addObjectPropertyDomain(ontology, targetIri, entity.iri) - owl.addObjectPropertyRange(ontology, targetIri, entity.target.iri) - owl.addFunctionalObjectProperty(ontology, targetIri) - if (entity.inverseFunctional) { - owl.addInverseFunctionalObjectProperty(ontology, targetIri) - } - - return null - } - - override caseStructure(Structure structure) { - owl.addClass(ontology, structure.iri) - owl.addSubClassOf(ontology, structure.iri, OmlConstants.Structure) - return null - } - - override caseFacetedScalar(FacetedScalar scalar) { - owl.addDatatype(ontology, scalar.iri) - return null - } - - override caseEnumeratedScalar(EnumeratedScalar scalar) { - owl.addDataOneOf(ontology, scalar.iri, scalar.literals.map[literal]) - return null - } - - override caseAnnotationProperty(AnnotationProperty property) { - owl.addAnnotationProperty(ontology, property.iri) - return null - } - - override caseScalarProperty(ScalarProperty property) { - val propertyIri = property.iri - owl.addDataProperty(ontology, propertyIri) - owl.addSubDataPropertyOf(ontology, propertyIri, OmlConstants.scalarProperty) - owl.addDataPropertyDomain(ontology, propertyIri, property.domain.iri) - owl.addDataPropertyRange(ontology, propertyIri, property.range.iri) - if (property.functional) { - owl.addFunctionalDataProperty(ontology, propertyIri) - } - return null - } - - override caseStructuredProperty(StructuredProperty property) { - val propertyIri = property.iri - owl.addObjectProperty(ontology, propertyIri) - owl.addSubObjectPropertyOf(ontology, propertyIri, OmlConstants.structuredProperty) - owl.addObjectPropertyDomain(ontology, propertyIri, property.domain.iri) - owl.addObjectPropertyRange(ontology, propertyIri, property.range.iri) - if (property.functional) { - owl.addFunctionalObjectProperty(ontology, propertyIri) - } - return null - } - - override caseForwardRelation(ForwardRelation forward) { - val entity = forward.entity - - // forward relation - val forwardIri = forward.iri - owl.addObjectProperty(ontology, forwardIri) - owl.addSubObjectPropertyOf(ontology, forwardIri, OmlConstants.forwardRelation) - owl.addObjectPropertyDomain(ontology, forwardIri, forward.domain.iri) - owl.addObjectPropertyRange(ontology, forwardIri, forward.range.iri) - if (entity.functional) { - owl.addFunctionalObjectProperty(ontology, forwardIri) - } - if (entity.inverseFunctional) { - owl.addInverseFunctionalObjectProperty(ontology, forwardIri) - } - if (entity.symmetric) { - owl.addSymmetricObjectProperty(ontology, forwardIri) - } - if (entity.asymmetric) { - owl.addAsymmetricObjectProperty(ontology, forwardIri) - } - if (entity.reflexive) { - owl.addReflexiveObjectProperty(ontology, forwardIri) - } - if (entity.irreflexive) { - owl.addIrreflexiveObjectProperty(ontology, forwardIri) - } - if (entity.transitive) { - owl.addTransitiveObjectProperty(ontology, forwardIri) - } - - // derivation rule for forward relation - val antedecents = new ArrayList - antedecents += owl.getObjectPropertyAtom(entity.sourceIri, 'r'.swrlIri, 's'.swrlIri) - antedecents += owl.getObjectPropertyAtom(entity.targetIri, 'r'.swrlIri, 't'.swrlIri) - val consequent = owl.getObjectPropertyAtom(forwardIri, 's'.swrlIri, 't'.swrlIri) - val annotation = owl.getAnnotation(RDFS.LABEL.toString, owl.getLiteral(forward.name+' derivation')) - owl.addNRule(ontology, #[consequent], antedecents, annotation) - return null - } - - override caseReverseRelation(ReverseRelation reverse) { - // reverse relation - val reverseIri = reverse.iri - owl.addObjectProperty(ontology, reverseIri) - owl.addSubObjectPropertyOf(ontology, reverseIri, OmlConstants.reverseRelation) - owl.addInverseProperties(ontology, reverseIri, reverse.inverse.iri) - return null - } - - override caseRule(Rule rule) { - var annotations = rule.ownedAnnotations.map[createAnnotation(it)] - if (annotations.filter[property.getIRI == RDFS.LABEL].isEmpty) { - annotations = new ArrayList(annotations) - annotations += owl.getAnnotation(RDFS.LABEL.toString, owl.getLiteral(rule.name)) - } - owl.addNRule(ontology, rule.consequent.flatMap[atom], rule.antecedent.flatMap[atom], annotations) - return null - } - - protected def createIndividual(StructureInstance instance) { - val individual = owl.getAnonymousIndividual(instance.getId) - instance.ownedPropertyValues.forEach[it.appliesTo(individual)] - individual - } - - override caseConceptInstance(ConceptInstance instance) { - val instanceIri = instance.iri - val individual = owl.addNamedIndividual(ontology, instanceIri) - instance.ownedPropertyValues.forEach[it.appliesTo(individual)] - instance.ownedLinks.forEach[it.appliesTo(individual)] - return null - } - - override caseConceptInstanceReference(ConceptInstanceReference reference) { - val instanceIri = reference.resolve.iri - val individual = owl.getNamedIndividual(instanceIri) - reference.ownedPropertyValues.forEach[it.appliesTo(individual)] - reference.ownedLinks.forEach[it.appliesTo(individual)] - return null - } - - override caseRelationInstance(RelationInstance instance) { - val instanceIri = instance.iri - val individual = owl.addNamedIndividual(ontology, instanceIri) - instance.ownedPropertyValues.forEach[it.appliesTo(individual)] - instance.ownedLinks.forEach[it.appliesTo(individual)] - return null - } - - override caseRelationInstanceReference(RelationInstanceReference reference) { - val instanceIri = reference.resolve.iri - val individual = owl.getNamedIndividual(instanceIri) - reference.ownedPropertyValues.forEach[it.appliesTo(individual)] - reference.ownedLinks.forEach[it.appliesTo(individual)] - return null - } - - override caseImport(Import ^import) { - val iri = ^import.importedOntology.iri - if (isBuiltInOntology(iri)) { - val indirectImports = ^import.closure[it.importedOntology.importsWithSource] - indirectImports.forEach[i2| - val iri2 = i2.importedOntology.iri - if (!isBuiltInOntology(iri2)) { - owl.addImportsDeclaration(ontology, iri2) - } - ] - } else { - owl.addImportsDeclaration(ontology, iri) - } - return null - } - - override caseSpecializationAxiom(SpecializationAxiom axiom) { - val annotations = axiom.ownedAnnotations.map[createAnnotation(it)] - axiom.specializingTerm.specializes(axiom.specializedTerm, axiom.owningReference, annotations) - return null - } - - override caseScalarPropertyRangeRestrictionAxiom(ScalarPropertyRangeRestrictionAxiom axiom) { - val annotations = axiom.ownedAnnotations.map[createAnnotation(it)] - if (axiom.kind == RangeRestrictionKind.ALL) { - owl.addDataAllValuesFrom(ontology, axiom.restrictingType.iri, axiom.property.iri, axiom.range.iri, annotations) - } else { - owl.addDataSomeValuesFrom(ontology, axiom.restrictingType.iri, axiom.property.iri, axiom.range.iri, annotations) - } - return null - } - - override caseScalarPropertyValueRestrictionAxiom(ScalarPropertyValueRestrictionAxiom axiom) { - val annotations = axiom.ownedAnnotations.map[createAnnotation(it)] - owl.addDataHasValue(ontology, axiom.restrictingType.iri, axiom.property.iri, axiom.value.literal, annotations) - return null - } - - override caseScalarPropertyCardinalityRestrictionAxiom(ScalarPropertyCardinalityRestrictionAxiom axiom) { - val annotations = axiom.ownedAnnotations.map[createAnnotation(it)] - if (axiom.kind == CardinalityRestrictionKind.MIN) { - owl.addDataMinCardinality(ontology, axiom.restrictingType.iri, axiom.property.iri, axiom.cardinality as int, axiom.range?.iri, annotations) - } else if (axiom.kind == CardinalityRestrictionKind.MAX) { - owl.addDataMaxCardinality(ontology, axiom.restrictingType.iri, axiom.property.iri, axiom.cardinality as int, axiom.range?.iri, annotations) - } else { - owl.addDataExactCardinality(ontology, axiom.restrictingType.iri, axiom.property.iri, axiom.cardinality as int, axiom.range?.iri, annotations) - } - return null - } - - override caseStructuredPropertyRangeRestrictionAxiom(StructuredPropertyRangeRestrictionAxiom axiom) { - val annotations = axiom.ownedAnnotations.map[createAnnotation(it)] - if (axiom.kind == RangeRestrictionKind.ALL) { - owl.addObjectAllValuesFrom(ontology, axiom.restrictingType.iri, axiom.property.iri, axiom.range.iri, annotations) - } else { - owl.addObjectSomeValuesFrom(ontology, axiom.restrictingType.iri, axiom.property.iri, axiom.range.iri, annotations) - } - return null - } - - override caseStructuredPropertyValueRestrictionAxiom(StructuredPropertyValueRestrictionAxiom axiom) { - val annotations = axiom.ownedAnnotations.map[createAnnotation(it)] - owl.addObjectHasValue(ontology, axiom.restrictingType.iri, axiom.property.iri, axiom.value.createIndividual, annotations) - return null - } - - override caseStructuredPropertyCardinalityRestrictionAxiom(StructuredPropertyCardinalityRestrictionAxiom axiom) { - val annotations = axiom.ownedAnnotations.map[createAnnotation(it)] - if (axiom.kind == CardinalityRestrictionKind.MIN) { - owl.addObjectMinCardinality(ontology, axiom.restrictingType.iri, axiom.property.iri, axiom.cardinality as int, axiom.range?.iri, annotations) - } else if (axiom.kind == CardinalityRestrictionKind.MAX) { - owl.addObjectMaxCardinality(ontology, axiom.restrictingType.iri, axiom.property.iri, axiom.cardinality as int, axiom.range?.iri, annotations) - } else { - owl.addObjectExactCardinality(ontology, axiom.restrictingType.iri, axiom.property.iri, axiom.cardinality as int, axiom.range?.iri, annotations) - } - return null - } - - override caseRelationRangeRestrictionAxiom(RelationRangeRestrictionAxiom axiom) { - val annotations = axiom.ownedAnnotations.map[createAnnotation(it)] - if (axiom.kind == RangeRestrictionKind.ALL) { - owl.addObjectAllValuesFrom(ontology, axiom.restrictingType.iri, axiom.relation.iri, axiom.range.iri, annotations) - } else { - owl.addObjectSomeValuesFrom(ontology, axiom.restrictingType.iri, axiom.relation.iri, axiom.range.iri, annotations) - } - return null - } - - override caseRelationTargetRestrictionAxiom(RelationTargetRestrictionAxiom axiom) { - val annotations = axiom.ownedAnnotations.map[createAnnotation(it)] - owl.addObjectHasValue(ontology, axiom.restrictingType.iri, axiom.relation.iri, axiom.target.iri, annotations) - return null - } - - override caseRelationCardinalityRestrictionAxiom(RelationCardinalityRestrictionAxiom axiom) { - val annotations = axiom.ownedAnnotations.map[createAnnotation(it)] - if (axiom.kind == CardinalityRestrictionKind.MIN) { - owl.addObjectMinCardinality(ontology, axiom.restrictingType.iri, axiom.relation.iri, axiom.cardinality as int, axiom.range?.iri, annotations) - } else if (axiom.kind == CardinalityRestrictionKind.MAX) { - owl.addObjectMaxCardinality(ontology, axiom.restrictingType.iri, axiom.relation.iri, axiom.cardinality as int, axiom.range?.iri, annotations) - } else { - owl.addObjectExactCardinality(ontology, axiom.restrictingType.iri, axiom.relation.iri, axiom.cardinality as int, axiom.range?.iri, annotations) - } - return null - } - - override caseKeyAxiom(KeyAxiom axiom) { - val annotations = axiom.ownedAnnotations.map[createAnnotation(it)] - owl.addHasKey(ontology, axiom.restrictingType.iri, axiom.properties.map[iri], annotations) - return null - } - - override caseConceptTypeAssertion(ConceptTypeAssertion assertion) { - val annotations = assertion.ownedAnnotations.map[createAnnotation(it)] - owl.addClassAssertion(ontology, assertion.conceptInstance.iri, assertion.type.iri, annotations) - return null - } - - override caseRelationTypeAssertion(RelationTypeAssertion assertion) { - val instance = assertion.relationInstance - val instanceIri = instance.iri - val annotations = assertion.ownedAnnotations.map[createAnnotation(it)] - owl.addClassAssertion(ontology, instanceIri, assertion.type.iri, annotations) - owl.addObjectPropertyAssertion(ontology, instanceIri, assertion.type.sourceIri, instance.source.iri) - owl.addObjectPropertyAssertion(ontology, instanceIri, assertion.type.targetIri, instance.target.iri) - return null - } - -/* ------------------------- */ - - protected def OWLAnnotation createAnnotation(Annotation annotation) { - owl.getAnnotation(annotation.property.iri, annotation.value?.literal ?: owl.getLiteral("true")) - } - - protected dispatch def void addsAnnotation(AnnotatedElement element, Annotation annotation) { - // all other cases are not mapped or mapped differently - } - - protected dispatch def void addsAnnotation(Ontology omlOntology, Annotation annotation) { - owl.addOntologyAnnotation(ontology, createAnnotation(annotation)) - } - - protected dispatch def void addsAnnotation(Member member, Annotation annotation) { - owl.addAnnotationAssertion(ontology, member.iri, createAnnotation(annotation)) - } - - protected dispatch def void addsAnnotation(Reference reference, Annotation annotation) { - reference.resolve.addsAnnotation(annotation) - } - - protected dispatch def void specializes(Term specific, Term general, Reference owningReference, OWLAnnotation...annotations) { - // all other cases are not mapped or mapped differently - } - - protected dispatch def void specializes(Concept specific, Concept general, Reference owningReference, OWLAnnotation...annotations) { - owl.addSubClassOf(ontology, specific.iri, general.iri, annotations) - } - - protected dispatch def void specializes(Concept specific, Aspect general, Reference owningReference, OWLAnnotation...annotations) { - owl.addSubClassOf(ontology, specific.iri, general.iri, annotations) - } - - protected dispatch def void specializes(Aspect specific, Aspect general, Reference owningReference, OWLAnnotation...annotations) { - owl.addSubClassOf(ontology, specific.iri, general.iri, annotations) - } - - protected dispatch def void specializes(RelationEntity specific, RelationEntity general, Reference owningReference, OWLAnnotation...annotations) { - owl.addSubClassOf(ontology, specific.iri, general.iri, annotations) - owl.addSubObjectPropertyOf(ontology, specific.sourceIri, general.sourceIri, annotations) - owl.addSubObjectPropertyOf(ontology, specific.targetIri, general.targetIri, annotations) - owl.addSubObjectPropertyOf(ontology, specific.forward.iri, general.forward.iri, annotations) - if (specific.reverse !== null && general.reverse !== null) { - owl.addSubObjectPropertyOf(ontology, specific.reverse.iri, general.reverse.iri, annotations) - } else { - // it's not obvious yet how to handle the other reverse relation cases - } - } - - protected dispatch def void specializes(RelationEntity specific, Aspect general, Reference owningReference, OWLAnnotation...annotations) { - owl.addSubClassOf(ontology, specific.iri, general.iri, annotations) - } - - protected dispatch def void specializes(Structure specific, Structure general, Reference owningReference, OWLAnnotation...annotations) { - owl.addSubClassOf(ontology, specific.iri, general.iri, annotations) - } - - protected dispatch def void specializes(EnumeratedScalar specific, EnumeratedScalar general, Reference owningReference, OWLAnnotation...annotations) { - owl.addDatatypeDefinition(ontology, specific.iri, general.iri, annotations) - } - - protected dispatch def void specializes(FacetedScalar specific, FacetedScalar general, Reference owningReference, OWLAnnotation...annotations) { - if (owningReference !== null) { - owl.addDatatypeDefinition(ontology, specific.iri, general.iri, annotations) - } else { - val restrictions = new ArrayList - if (specific.length !== null) { - restrictions += owl.getFacetRestriction(OWLFacet.LENGTH, owl.getLiteral(specific.length)) - } - if (specific.maxLength !== null) { - restrictions += owl.getFacetRestriction(OWLFacet.MAX_LENGTH, owl.getLiteral(specific.length)) - } - if (specific.minLength !== null) { - restrictions += owl.getFacetRestriction(OWLFacet.MIN_LENGTH, owl.getLiteral(specific.length)) - } - if (specific.pattern !== null) { - restrictions += owl.getFacetRestriction(OWLFacet.PATTERN, owl.getLiteral(specific.pattern)) - } - if (specific.language !== null) { - restrictions += owl.getFacetRestriction(OWLFacet.LANG_RANGE, owl.getLiteral(specific.language)) - } - if (specific.minInclusive !== null) { - restrictions += owl.getFacetRestriction(OWLFacet.MIN_INCLUSIVE, getLiteral(specific.minInclusive)) - } - if (specific.maxInclusive !== null) { - restrictions += owl.getFacetRestriction(OWLFacet.MAX_INCLUSIVE, getLiteral(specific.maxInclusive)) - } - if (specific.minExclusive !== null) { - restrictions += owl.getFacetRestriction(OWLFacet.MIN_EXCLUSIVE, getLiteral(specific.minExclusive)) - } - if (specific.maxExclusive !== null) { - restrictions += owl.getFacetRestriction(OWLFacet.MAX_EXCLUSIVE, getLiteral(specific.maxExclusive)) - } - if (!restrictions.isEmpty) { - owl.addDatatypeDefinition(ontology, specific.iri, general.iri, restrictions, annotations) - } else { - owl.addDatatypeDefinition(ontology, specific.iri, general.iri, annotations) - } - } - } - - protected dispatch def void specializes(ScalarProperty specific, ScalarProperty general, Reference owningReference, OWLAnnotation...annotations) { - owl.addSubDataPropertyOf(ontology, specific.iri, general.iri, annotations) - } - - protected dispatch def void specializes(StructuredProperty specific, StructuredProperty general, Reference owningReference, OWLAnnotation...annotations) { - owl.addSubObjectPropertyOf(ontology, specific.iri, general.iri, annotations) - } - - protected dispatch def void appliesTo(ScalarPropertyValueAssertion assertion, OWLIndividual individual) { - val annotations = assertion.ownedAnnotations.map[createAnnotation(it)] - owl.addDataPropertyAssertion(ontology, individual, assertion.property.iri, assertion.value.literal, annotations) - } - - protected dispatch def void appliesTo(StructuredPropertyValueAssertion assertion, OWLIndividual individual) { - val annotations = assertion.ownedAnnotations.map[createAnnotation(it)] - owl.addObjectPropertyAssertion(ontology, individual, assertion.property.iri, assertion.value.createIndividual, annotations) - } - - protected dispatch def void appliesTo(LinkAssertion assertion, OWLNamedIndividual individual) { - val annotations = assertion.ownedAnnotations.map[createAnnotation(it)] - owl.addObjectPropertyAssertion(ontology, individual.getIRI.IRIString, assertion.relation.iri, assertion.target.iri, annotations) - } - - protected dispatch def getAtom(EntityPredicate predicate) { - val atoms = new ArrayList - atoms += owl.getClassAtom(predicate.entity.iri, predicate.variable.swrlIri) - atoms - } - - protected dispatch def getAtom(RelationEntityPredicate predicate) { - val atoms = new ArrayList - atoms += owl.getObjectPropertyAtom(predicate.entity.sourceIri, predicate.entityVariable.swrlIri, predicate.variable1.swrlIri) - atoms += owl.getObjectPropertyAtom(predicate.entity.targetIri, predicate.entityVariable.swrlIri, predicate.variable2.swrlIri) - atoms - } - - protected dispatch def getAtom(RelationPredicate predicate) { - val atoms = new ArrayList - atoms += owl.getObjectPropertyAtom(predicate.relation.iri, predicate.variable1.swrlIri, predicate.variable2.swrlIri) - atoms - } - - protected dispatch def getAtom(SameAsPredicate predicate) { - val atoms = new ArrayList - atoms += owl.getSameIndividualAtom(predicate.variable1.swrlIri, predicate.variable2.swrlIri) - atoms - } - - protected dispatch def getAtom(DifferentFromPredicate predicate) { - val atoms = new ArrayList - atoms += owl.getDifferentIndividualsAtom(predicate.variable1.swrlIri, predicate.variable2.swrlIri) - atoms - } - - protected dispatch def getLiteral(QuotedLiteral literal) { - if (literal.type !== null) { - owl.getLiteralWithDatatype(literal.value.toString, literal.type.iri) - } else if (literal.langTag !== null) { - owl.getLiteralWithLangTag(literal.value.toString, literal.langTag) - } else { - owl.getLiteral(literal.value) - } - } - - protected dispatch def getLiteral(BooleanLiteral literal) { - if (literal.type !== null) { - owl.getLiteralWithDatatype(literal.value.toString, literal.type.iri) - } else { - owl.getLiteral(literal.value) - } - } - - protected dispatch def getLiteral(IntegerLiteral literal) { - if (literal.type !== null) { - owl.getLiteralWithDatatype(literal.value.toString, literal.type.iri) - } else { - owl.getLiteral(literal.value) - } - } - - protected dispatch def getLiteral(DecimalLiteral literal) { - if (literal.type !== null) { - owl.getLiteralWithDatatype(literal.value.toString, literal.type.iri) - } else { - owl.getLiteral(literal.value) - } - } - - protected dispatch def getLiteral(DoubleLiteral literal) { - if (literal.type !== null) { - owl.getLiteralWithDatatype(literal.value.toString, literal.type.iri) - } else { - owl.getLiteral(literal.value) - } - } - - protected def String getSourceIri(RelationEntity entity) { - entity.ontology?.namespace+'has'+entity.name.toFirstUpper+'Source' - } - - protected def String getTargetIri(RelationEntity entity) { - entity.ontology?.namespace+'has'+entity.name.toFirstUpper+'Target' - } - - protected def getSwrlIri(String variableName) { - "urn:swrl#"+variableName - } - - static def isBuiltInOntology(String iri) { - BUILT_IN_ONTOLOGIES.contains(iri) - } -} \ No newline at end of file diff --git a/owl-adapter/oml2owl/src/main/java/io/opencaesar/oml2owl/Oml2OwlApp.xtend b/owl-adapter/oml2owl/src/main/java/io/opencaesar/oml2owl/Oml2OwlApp.xtend deleted file mode 100644 index b3b0ada..0000000 --- a/owl-adapter/oml2owl/src/main/java/io/opencaesar/oml2owl/Oml2OwlApp.xtend +++ /dev/null @@ -1,277 +0,0 @@ -package io.opencaesar.oml2owl - -import com.beust.jcommander.IParameterValidator -import com.beust.jcommander.JCommander -import com.beust.jcommander.Parameter -import com.beust.jcommander.ParameterException -import com.google.common.io.CharStreams -import io.opencaesar.oml.DescriptionBundle -import io.opencaesar.oml.VocabularyBundle -import io.opencaesar.oml.dsl.OmlStandaloneSetup -import io.opencaesar.oml.util.OmlCatalog -import io.opencaesar.oml.util.OmlXMIResourceFactory -import io.opencaesar.oml2owl.CloseDescriptionBundle.CloseDescriptionBundleToOwl -import io.opencaesar.oml2owl.CloseVocabularyBundle.CloseVocabularyBundleToOwl -import java.io.File -import java.io.IOException -import java.io.InputStreamReader -import java.net.URL -import java.nio.file.Files -import java.nio.file.Paths -import java.nio.file.StandardCopyOption -import java.util.ArrayList -import java.util.Collection -import java.util.LinkedHashMap -import org.apache.log4j.AppenderSkeleton -import org.apache.log4j.Level -import org.apache.log4j.LogManager -import org.eclipse.emf.common.util.URI -import org.eclipse.emf.ecore.resource.Resource -import org.eclipse.xtext.resource.XtextResourceSet -import org.semanticweb.owlapi.apibinding.OWLManager -import org.semanticweb.owlapi.model.IRI -import org.semanticweb.owlapi.model.OWLOntology - -import static extension io.opencaesar.oml.util.OmlRead.* - -class Oml2OwlApp { - - package static val OML = 'oml' - package static val OMLXMI = "omlxmi" - - @Parameter( - names=#["--input-catalog-path","-i"], - description="Path of the input OML catalog (Required)", - validateWith=InputCatalogPath, - required=true, - order=1) - String inputCatalogPath - - @Parameter( - names=#["--output-catalog-path", "-o"], - description="Path of the output OWL catalog (Required)", - validateWith=OutputCatalogPath, - required=true, - order=2 - ) - String outputCatalogPath - - @Parameter( - names=#["--disjoint-unions", "-u"], - description="Create disjoint union axioms", - order=3 - ) - boolean disjointUnions = false - - @Parameter( - names=#["--annotations-on-axioms", "-a"], - description="Emit annotations on axioms", - order=4 - ) - boolean annotationsOnAxioms = false - - @Parameter( - names=#["--debug", "-d"], - description="Shows debug logging statements", - order=5 - ) - boolean debug - - @Parameter( - names=#["--help","-h"], - description="Displays summary of options", - help=true, - order=6) - boolean help - - val LOGGER = LogManager.getLogger(Oml2OwlApp) - - def static void main(String ... args) { - val app = new Oml2OwlApp - val builder = JCommander.newBuilder().addObject(app).build() - builder.parse(args) - if (app.help) { - builder.usage() - return - } - if (app.debug) { - val appender = LogManager.getRootLogger.getAppender("stdout") - (appender as AppenderSkeleton).setThreshold(Level.DEBUG) - } - app.run() - } - - def void run() { - LOGGER.info("=================================================================") - LOGGER.info(" S T A R T") - LOGGER.info(" OML to Owl "+getAppVersion) - LOGGER.info("=================================================================") - LOGGER.info("Input catalog path= " + inputCatalogPath) - LOGGER.info("Output catalog path= " + outputCatalogPath) - - OmlStandaloneSetup.doSetup() - OmlXMIResourceFactory.register - val inputResourceSet = new XtextResourceSet - - // collect OML files - val inputCatalogFile = new File(inputCatalogPath) - val inputFolder = inputCatalogFile.parentFile - val inputFiles = collectOMLFiles(inputFolder) - - // load the OML otologies - for (inputFile : inputFiles) { - val inputURI = URI.createFileURI(inputFile.absolutePath) - LOGGER.info("Reading: "+inputURI) - inputResourceSet.getResource(inputURI, true) - } - - // create OWL manager - val ontologyManager = OWLManager.createOWLOntologyManager() - val owl2api = new OwlApi(ontologyManager, annotationsOnAxioms) - val outputFiles = new LinkedHashMap - val oml2owl = new LinkedHashMap - - // get the output OWL folder - val outputCatalogFile = new File(outputCatalogPath); - val outputFolderPath = outputCatalogFile.parent - - // create the equivalent OWL ontologies - val throwables = new ArrayList - val threads = new ArrayList - for (inputFile : inputFiles) { - val inputURI = URI.createFileURI(inputFile.absolutePath) - val inputResource = inputResourceSet.getResource(inputURI, true) - val builtin = Oml2Owl.isBuiltInOntology(inputResource.ontology?.iri) - if (inputResource !== null && !builtin) { - var relativePath = outputFolderPath+File.separator+inputFolder.toURI().relativize(inputFile.toURI()).getPath() - val outputFile = new File(relativePath.substring(0, relativePath.lastIndexOf('.')+1)+'owl') - val thread = new Thread() { - override run() { - LOGGER.info("Creating: "+outputFile) - val owlOntology = new Oml2Owl(inputResource, owl2api).run - outputFiles.put(outputFile, owlOntology) - oml2owl.put(inputResource, owlOntology) - LOGGER.info("Created: "+outputFile) - } - } - threads.add(thread) - thread.uncaughtExceptionHandler = [th, ex | - System.out.println(ex) - throwables.add(ex) - ] - thread.start - } - } - threads.forEach[join] - if (!throwables.isEmpty) { - throw new RuntimeException("Exception(s) thrown by one or more threads") - } - - // run the vocabulary bundle closure algorithm - oml2owl.entrySet.filter[e|e.key.ontology instanceof VocabularyBundle].forEach[entry| - LOGGER.info("Closing vocabulary bundle: "+entry.key.URI) - new CloseVocabularyBundleToOwl(entry.key, entry.value, disjointUnions, owl2api).run - ] - - // run the description bundle closure algorithm - oml2owl.entrySet.filter[e|e.key.ontology instanceof DescriptionBundle].forEach[entry| - LOGGER.info("Closing description bundle: "+entry.key.URI) - new CloseDescriptionBundleToOwl(entry.key, entry.value, owl2api).run - ] - - // save the output resources - val threads2 = new ArrayList - outputFiles.forEach[file, owlOntology | - val thread = new Thread() { - override run() { - LOGGER.info("Saving: "+file) - ontologyManager.saveOntology(owlOntology, /*new TurtleDocumentFormat,*/ IRI.create(file)) - } - } - threads2.add(thread) - thread.start - ] - threads2.forEach[join] - - // create the equivalent OWL catalog - copyCatalog(inputCatalogFile, outputCatalogFile) - - LOGGER.info("=================================================================") - LOGGER.info(" E N D") - LOGGER.info("=================================================================") - } - - private def Collection collectOMLFiles(File directory) { - val omlFiles = new ArrayList - for (file : directory.listFiles()) { - if (file.isFile) { - if ((getFileExtension(file) == OML || - getFileExtension(file) == OMLXMI)) { - omlFiles.add(file) - } - } else if (file.isDirectory) { - omlFiles.addAll(collectOMLFiles(file)) - } - } - return omlFiles - } - - private def void copyCatalog(File inputCatalogFile, File outputCatalogFile) { - LOGGER.info("Saving: "+inputCatalogFile) - Files.copy(Paths.get(inputCatalogFile.path), Paths.get(outputCatalogFile.path), StandardCopyOption.REPLACE_EXISTING) - val inputCatalog = OmlCatalog.create(inputCatalogFile.toURI.toURL) - for (c : inputCatalog.nestedCatalogs) { - val uri = new URL(c).toURI - val nestedInputCatalogFile = new File(uri); - var relativePath = inputCatalogFile.parentFile.toURI().relativize(uri).getPath() - val nestedOutputCatalogFile = new File(outputCatalogFile.parent+File.separator+relativePath) - copyCatalog(nestedInputCatalogFile, nestedOutputCatalogFile) - } - } - - private def String getFileExtension(File file) { - val fileName = file.getName() - if(fileName.lastIndexOf(".") != -1) - return fileName.substring(fileName.lastIndexOf(".")+1) - else - return "" - } - - /** - * Get application version id from properties file. - * @return version string from build.properties or UNKNOWN - */ - private def String getAppVersion() { - var version = "UNKNOWN" - try { - val input = Thread.currentThread().getContextClassLoader().getResourceAsStream("version.txt") - val reader = new InputStreamReader(input) - version = CharStreams.toString(reader); - } catch (IOException e) { - val errorMsg = "Could not read version.txt file." + e - LOGGER.error(errorMsg, e) - } - version - } - - static class InputCatalogPath implements IParameterValidator { - override validate(String name, String value) throws ParameterException { - val file = new File(value) - if (!file.getName().endsWith("catalog.xml")) { - throw new ParameterException("Parameter " + name + " should be a valid OWL catalog path") - } - } - } - - static class OutputCatalogPath implements IParameterValidator { - override validate(String name, String value) throws ParameterException { - val file = new File(value) - if (!file.getName().endsWith("catalog.xml")) { - throw new ParameterException("Parameter " + name + " should be a valid OWL catalog path") - } - val folder = file.parentFile - folder.mkdirs - } - } - -} diff --git a/owl-adapter/oml2owl/src/main/java/io/opencaesar/oml2owl/OmlConstants.xtend b/owl-adapter/oml2owl/src/main/java/io/opencaesar/oml2owl/OmlConstants.xtend deleted file mode 100644 index c51e762..0000000 --- a/owl-adapter/oml2owl/src/main/java/io/opencaesar/oml2owl/OmlConstants.xtend +++ /dev/null @@ -1,48 +0,0 @@ -package io.opencaesar.oml2owl - -interface OmlConstants { - - static val omlPath = "opencaesar.io/oml" - - static val omlIRI = "http://"+omlPath - - static val omlNS = omlIRI+ '#' - - // oml:ontologyType annotation - - static val ontologyType = omlNS+'ontologyType' - - // owl:Ontology oml:ontologyType ?x - - static val Vocabulary = omlNS+'Vocabulary' - - static val VocabularyBundle = omlNS+'VocabularyBundle' - - static val Description = omlNS+'Description' - - static val DescriptionBundle = omlNS+'DescriptionBundle' - - // owl:Class rdfs:subClassOf x? - - static val Aspect = omlNS+'Aspect' - - static val Concept = omlNS+'Concept' - - static val RelationEntity = omlNS+'RelationEntity' - - static val Structure = omlNS+'Structure' - - // owl:ObjectProperty rdfs:subPropertyOf x? - - static val forwardRelation = omlNS+'forwardRelation' - - static val reverseRelation = omlNS+'reverseRelation' - - static val sourceRelation = omlNS+'sourceRelation' - - static val targetRelation = omlNS+'targetRelation' - - static val structuredProperty = omlNS+'structuredProperty' - - static val scalarProperty = omlNS+'scalarProperty' -} \ No newline at end of file diff --git a/owl-adapter/oml2owl/src/main/java/io/opencaesar/oml2owl/OwlApi.xtend b/owl-adapter/oml2owl/src/main/java/io/opencaesar/oml2owl/OwlApi.xtend deleted file mode 100644 index 023eb08..0000000 --- a/owl-adapter/oml2owl/src/main/java/io/opencaesar/oml2owl/OwlApi.xtend +++ /dev/null @@ -1,507 +0,0 @@ -package io.opencaesar.oml2owl - -import java.math.BigDecimal -import java.util.Arrays -import java.util.Collection -import java.util.Collections -import org.semanticweb.owlapi.model.AddImport -import org.semanticweb.owlapi.model.AddOntologyAnnotation -import org.semanticweb.owlapi.model.IRI -import org.semanticweb.owlapi.model.OWLAnnotation -import org.semanticweb.owlapi.model.OWLAnnotationValue -import org.semanticweb.owlapi.model.OWLFacetRestriction -import org.semanticweb.owlapi.model.OWLIndividual -import org.semanticweb.owlapi.model.OWLLiteral -import org.semanticweb.owlapi.model.OWLOntology -import org.semanticweb.owlapi.model.OWLOntologyManager -import org.semanticweb.owlapi.model.SWRLAtom -import org.semanticweb.owlapi.vocab.OWLFacet - -class OwlApi extends io.opencaesar.closeworld.OwlApi { - - val XSD = "http://www.w3.org/2001/XMLSchema#" - protected final boolean annotationsOnAxioms; - - new(OWLOntologyManager manager, boolean annotationsOnAxioms) { - super(manager) - this.annotationsOnAxioms = annotationsOnAxioms; - } - - def createIri(String iri) { - IRI.create(iri) - } - - def createOntology(String iri) { - return manager.createOntology(IRI.create(iri)) - } - - def addImportsDeclaration(OWLOntology ontology, String iri) { - val import = factory.getOWLImportsDeclaration(IRI.create(iri)) - manager.applyChanges(new AddImport(ontology, import)) - return import - } - - def addClass(OWLOntology ontology, String iri) { - val class = factory.getOWLClass(iri) - val axiom = factory.getOWLDeclarationAxiom(class) - manager.addAxiom(ontology, axiom) - return class - } - - def addDatatype(OWLOntology ontology, String iri) { - val datatype = factory.getOWLDatatype(iri) - val axiom = factory.getOWLDeclarationAxiom(datatype) - manager.addAxiom(ontology, axiom) - return datatype - } - - def addDatatypeDefinition(OWLOntology ontology, String datatypeIri, String restrictedIri, OWLFacetRestriction[] restrictions, OWLAnnotation...annotations) { - val datatype = factory.getOWLDatatype(datatypeIri) - val restrictedDatatype = factory.getOWLDatatype(restrictedIri) - val restriction = factory.getOWLDatatypeRestriction(restrictedDatatype, restrictions) - val axiom = factory.getOWLDatatypeDefinitionAxiom(datatype, restriction, annotations.checkIfNeeded) - manager.addAxiom(ontology, axiom) - return axiom - } - - def addDatatypeDefinition(OWLOntology ontology, String datatypeIri, String synonymIri, OWLAnnotation...annotations) { - val datatype = factory.getOWLDatatype(datatypeIri) - val synonymDatatype = factory.getOWLDatatype(synonymIri) - val axiom = factory.getOWLDatatypeDefinitionAxiom(datatype, synonymDatatype, annotations.checkIfNeeded) - manager.addAxiom(ontology, axiom) - return axiom - } - - def addDataOneOf(OWLOntology ontology, String subIri, OWLLiteral...literals) { - val datatype = factory.getOWLDatatype(subIri) - val dataOneOf = factory.getOWLDataOneOf(literals) - val axiom = factory.getOWLDatatypeDefinitionAxiom(datatype, dataOneOf) - manager.addAxiom(ontology, axiom) - return dataOneOf - } - - def addObjectProperty(OWLOntology ontology, String iri) { - val property = factory.getOWLObjectProperty(iri) - val axiom = factory.getOWLDeclarationAxiom(property) - manager.addAxiom(ontology, axiom) - return property - } - - def addFunctionalObjectProperty(OWLOntology ontology, String iri) { - val property = factory.getOWLObjectProperty(iri) - val axiom = factory.getOWLFunctionalObjectPropertyAxiom(property) - manager.addAxiom(ontology, axiom) - return property - } - - def addInverseFunctionalObjectProperty(OWLOntology ontology, String iri) { - val property = factory.getOWLObjectProperty(iri) - val axiom = factory.getOWLInverseFunctionalObjectPropertyAxiom(property) - manager.addAxiom(ontology, axiom) - return property - } - - def addSymmetricObjectProperty(OWLOntology ontology, String iri) { - val property = factory.getOWLObjectProperty(iri) - val axiom = factory.getOWLSymmetricObjectPropertyAxiom(property) - manager.addAxiom(ontology, axiom) - return property - } - - def addAsymmetricObjectProperty(OWLOntology ontology, String iri) { - val property = factory.getOWLObjectProperty(iri) - val axiom = factory.getOWLAsymmetricObjectPropertyAxiom(property) - manager.addAxiom(ontology, axiom) - return property - } - - def addReflexiveObjectProperty(OWLOntology ontology, String iri) { - val property = factory.getOWLObjectProperty(iri) - val axiom = factory.getOWLReflexiveObjectPropertyAxiom(property) - manager.addAxiom(ontology, axiom) - return property - } - - def addIrreflexiveObjectProperty(OWLOntology ontology, String iri) { - val property = factory.getOWLObjectProperty(iri) - val axiom = factory.getOWLIrreflexiveObjectPropertyAxiom(property) - manager.addAxiom(ontology, axiom) - return property - } - - def addTransitiveObjectProperty(OWLOntology ontology, String iri) { - val property = factory.getOWLObjectProperty(iri) - val axiom = factory.getOWLTransitiveObjectPropertyAxiom(property) - manager.addAxiom(ontology, axiom) - return property - } - - def addDataProperty(OWLOntology ontology, String iri) { - val property = factory.getOWLDataProperty(iri) - val axiom = factory.getOWLDeclarationAxiom(property) - manager.addAxiom(ontology, axiom) - return property - } - - def addFunctionalDataProperty(OWLOntology ontology, String iri) { - val property = factory.getOWLDataProperty(iri) - val axiom = factory.getOWLFunctionalDataPropertyAxiom(property) - manager.addAxiom(ontology, axiom) - return property - } - - def addAnnotationProperty(OWLOntology ontology, String iri) { - val property = factory.getOWLAnnotationProperty(iri) - val axiom = factory.getOWLDeclarationAxiom(property) - manager.addAxiom(ontology, axiom) - return property - } - - def addNamedIndividual(OWLOntology ontology, String iri) { - val individual = factory.getOWLNamedIndividual(iri) - val axiom = factory.getOWLDeclarationAxiom(individual) - manager.addAxiom(ontology, axiom) - return individual - } - - def getNamedIndividual(String nodeId) { - return factory.getOWLNamedIndividual(nodeId) - } - - def getAnonymousIndividual(String nodeId) { - return factory.getOWLAnonymousIndividual(nodeId) - } - - def addNRule(OWLOntology ontology, SWRLAtom[] head, SWRLAtom[] body, OWLAnnotation...annotations) { - val axiom = factory.getSWRLRule(body, head, annotations) - manager.addAxiom(ontology, axiom) - return axiom - } - - def getClassAtom(String classIri, String variableIri) { - val class = factory.getOWLClass(classIri) - val variable = factory.getSWRLVariable(variableIri) - return factory.getSWRLClassAtom(class, variable) - } - - def getObjectPropertyAtom(String propertyIri, String variable1Iri, String variable2Iri) { - val property = factory.getOWLObjectProperty(propertyIri) - val variable1 = factory.getSWRLVariable(variable1Iri) - val variable2 = factory.getSWRLVariable(variable2Iri) - return factory.getSWRLObjectPropertyAtom(property, variable1, variable2) - } - - def getSameIndividualAtom(String variable1Iri, String variable2Iri) { - val variable1 = factory.getSWRLVariable(variable1Iri) - val variable2 = factory.getSWRLVariable(variable2Iri) - return factory.getSWRLSameIndividualAtom(variable1, variable2) - } - - def getDifferentIndividualsAtom(String variable1Iri, String variable2Iri) { - val variable1 = factory.getSWRLVariable(variable1Iri) - val variable2 = factory.getSWRLVariable(variable2Iri) - return factory.getSWRLDifferentIndividualsAtom(variable1, variable2) - } - - def addSubClassOf(OWLOntology ontology, String subIri, String superIri, OWLAnnotation...annotations) { - val subClass = factory.getOWLClass(subIri) - val supClass = factory.getOWLClass(superIri) - val axiom = factory.getOWLSubClassOfAxiom(subClass, supClass, annotations.checkIfNeeded) - manager.addAxiom(ontology, axiom) - return axiom - } - - def addHasKey(OWLOntology ontology, String classIri, Collection keyPropertyIris, OWLAnnotation...annotations) { - val aClass = factory.getOWLClass(classIri) - val keyProperties = keyPropertyIris.map[iri|factory.getOWLDataProperty(iri)].toList - val axiom = factory.getOWLHasKeyAxiom(aClass, keyProperties, annotations.checkIfNeeded) - manager.addAxiom(ontology, axiom) - return axiom - } - - def addObjectSomeValuesFrom(OWLOntology ontology, String classIri, String propertyIri, String typeIri, OWLAnnotation...annotations) { - val class = factory.getOWLClass(classIri) - val property = factory.getOWLObjectProperty(propertyIri) - val type = factory.getOWLClass(typeIri) - val restriction = factory.getOWLObjectSomeValuesFrom(property, type) - val axiom = factory.getOWLSubClassOfAxiom(class, restriction, annotations.checkIfNeeded) - manager.addAxiom(ontology, axiom) - return axiom - } - - def addObjectAllValuesFrom(OWLOntology ontology, String classIri, String propertyIri, String typeIri, OWLAnnotation...annotations) { - val class = factory.getOWLClass(classIri) - val property = factory.getOWLObjectProperty(propertyIri) - val type = factory.getOWLClass(typeIri) - val restriction = factory.getOWLObjectAllValuesFrom(property, type) - val axiom = factory.getOWLSubClassOfAxiom(class, restriction, annotations.checkIfNeeded) - manager.addAxiom(ontology, axiom) - return axiom - } - - def addObjectHasValue(OWLOntology ontology, String classIri, String propertyIri, OWLIndividual individual, OWLAnnotation...annotations) { - val class = factory.getOWLClass(classIri) - val property = factory.getOWLObjectProperty(propertyIri) - val restriction = factory.getOWLObjectHasValue(property, individual) - val axiom = factory.getOWLSubClassOfAxiom(class, restriction, annotations.checkIfNeeded) - manager.addAxiom(ontology, axiom) - return axiom - } - - def addObjectHasValue(OWLOntology ontology, String classIri, String propertyIri, String individualIri, OWLAnnotation...annotations) { - val class = factory.getOWLClass(classIri) - val property = factory.getOWLObjectProperty(propertyIri) - val individual = factory.getOWLNamedIndividual(individualIri) - val restriction = factory.getOWLObjectHasValue(property, individual) - val axiom = factory.getOWLSubClassOfAxiom(class, restriction, annotations.checkIfNeeded) - manager.addAxiom(ontology, axiom) - return axiom - } - - def addObjectExactCardinality(OWLOntology ontology, String classIri, String propertyIri, int cardinality, String rangeIri, OWLAnnotation...annotations) { - val class = factory.getOWLClass(classIri) - val property = factory.getOWLObjectProperty(propertyIri) - val restriction = if (rangeIri !== null) - factory.getOWLObjectExactCardinality(cardinality, property, factory.getOWLClass(rangeIri)) - else - factory.getOWLObjectExactCardinality(cardinality, property) - val axiom = factory.getOWLSubClassOfAxiom(class, restriction, annotations.checkIfNeeded) - manager.addAxiom(ontology, axiom) - return axiom - } - - def addObjectMinCardinality(OWLOntology ontology, String classIri, String propertyIri, int cardinality, String rangeIri, OWLAnnotation...annotations) { - val class = factory.getOWLClass(classIri) - val property = factory.getOWLObjectProperty(propertyIri) - val restriction = if (rangeIri !== null) - factory.getOWLObjectMinCardinality(cardinality, property, factory.getOWLClass(rangeIri)) - else - factory.getOWLObjectMinCardinality(cardinality, property) - val axiom = factory.getOWLSubClassOfAxiom(class, restriction, annotations.checkIfNeeded) - manager.addAxiom(ontology, axiom) - return axiom - } - - def addObjectMaxCardinality(OWLOntology ontology, String classIri, String propertyIri, int cardinality, String rangeIri, OWLAnnotation...annotations) { - val class = factory.getOWLClass(classIri) - val property = factory.getOWLObjectProperty(propertyIri) - val restriction = if (rangeIri !== null) - factory.getOWLObjectMaxCardinality(cardinality, property, factory.getOWLClass(rangeIri)) - else - factory.getOWLObjectMaxCardinality(cardinality, property) - val axiom = factory.getOWLSubClassOfAxiom(class, restriction, annotations.checkIfNeeded) - manager.addAxiom(ontology, axiom) - return axiom - } - - def addDataExactCardinality(OWLOntology ontology, String classIri, String propertyIri, int cardinality, String rangeIri, OWLAnnotation...annotations) { - val class = factory.getOWLClass(classIri) - val property = factory.getOWLDataProperty(propertyIri) - val restriction = if (rangeIri !== null) - factory.getOWLDataExactCardinality(cardinality, property, factory.getOWLDatatype(rangeIri)) - else - factory.getOWLDataExactCardinality(cardinality, property) - val axiom = factory.getOWLSubClassOfAxiom(class, restriction, annotations.checkIfNeeded) - manager.addAxiom(ontology, axiom) - return axiom - } - - def addDataMinCardinality(OWLOntology ontology, String classIri, String propertyIri, int cardinality, String rangeIri, OWLAnnotation...annotations) { - val class = factory.getOWLClass(classIri) - val property = factory.getOWLDataProperty(propertyIri) - val restriction = if (rangeIri !== null) - factory.getOWLDataMinCardinality(cardinality, property, factory.getOWLDatatype(rangeIri)) - else - factory.getOWLDataMinCardinality(cardinality, property) - val axiom = factory.getOWLSubClassOfAxiom(class, restriction, annotations.checkIfNeeded) - manager.addAxiom(ontology, axiom) - return axiom - } - - def addDataMaxCardinality(OWLOntology ontology, String classIri, String propertyIri, int cardinality, String rangeIri, OWLAnnotation...annotations) { - val class = factory.getOWLClass(classIri) - val property = factory.getOWLDataProperty(propertyIri) - val restriction = if (rangeIri !== null) - factory.getOWLDataMaxCardinality(cardinality, property, factory.getOWLDatatype(rangeIri)) - else - factory.getOWLDataMaxCardinality(cardinality, property) - val axiom = factory.getOWLSubClassOfAxiom(class, restriction, annotations.checkIfNeeded) - manager.addAxiom(ontology, axiom) - return axiom - } - - def addDataSomeValuesFrom(OWLOntology ontology, String classIri, String propertyIri, String typeIri, OWLAnnotation...annotations) { - val class = factory.getOWLClass(classIri) - val property = factory.getOWLDataProperty(propertyIri) - val type = factory.getOWLDatatype(typeIri) - val restriction = factory.getOWLDataSomeValuesFrom(property, type) - val axiom = factory.getOWLSubClassOfAxiom(class, restriction, annotations.checkIfNeeded) - manager.addAxiom(ontology, axiom) - return axiom - } - - def addDataAllValuesFrom(OWLOntology ontology, String classIri, String propertyIri, String typeIri, OWLAnnotation...annotations) { - val class = factory.getOWLClass(classIri) - val property = factory.getOWLDataProperty(propertyIri) - val type = factory.getOWLDatatype(typeIri) - val restriction = factory.getOWLDataAllValuesFrom(property, type) - val axiom = factory.getOWLSubClassOfAxiom(class, restriction, annotations.checkIfNeeded) - manager.addAxiom(ontology, axiom) - return axiom - } - - def addDataHasValue(OWLOntology ontology, String classIri, String propertyIri, OWLLiteral literal, OWLAnnotation...annotations) { - val class = factory.getOWLClass(classIri) - val property = factory.getOWLDataProperty(propertyIri) - val restriction = factory.getOWLDataHasValue(property, literal) - val axiom = factory.getOWLSubClassOfAxiom(class, restriction, annotations.checkIfNeeded) - manager.addAxiom(ontology, axiom) - return axiom - } - - def addSubObjectPropertyOf(OWLOntology ontology, String subPropertyIri, String superPropertyIri, OWLAnnotation...annotations) { - val subProperty = factory.getOWLObjectProperty(subPropertyIri) - val supProperty = factory.getOWLObjectProperty(superPropertyIri) - val axiom = factory.getOWLSubObjectPropertyOfAxiom(subProperty, supProperty, annotations.checkIfNeeded) - manager.addAxiom(ontology, axiom) - return axiom - } - - def addObjectPropertyDomain(OWLOntology ontology, String propertyIri, String domainIri) { - val property = factory.getOWLObjectProperty(propertyIri) - val domain = factory.getOWLClass(domainIri) - val axiom = factory.getOWLObjectPropertyDomainAxiom(property, domain) - manager.addAxiom(ontology, axiom) - return axiom - } - - def addObjectPropertyRange(OWLOntology ontology, String propertyIri, String rangeIri) { - val property = factory.getOWLObjectProperty(propertyIri) - val range = factory.getOWLClass(rangeIri) - val axiom = factory.getOWLObjectPropertyRangeAxiom(property, range) - manager.addAxiom(ontology, axiom) - return axiom - } - - def addSubDataPropertyOf(OWLOntology ontology, String subPropertyIri, String superPropertyIri, OWLAnnotation...annotations) { - val subProperty = factory.getOWLDataProperty(subPropertyIri) - val supProperty = factory.getOWLDataProperty(superPropertyIri) - val axiom = factory.getOWLSubDataPropertyOfAxiom(subProperty, supProperty, annotations.checkIfNeeded) - manager.addAxiom(ontology, axiom) - return axiom - } - - def addDataPropertyDomain(OWLOntology ontology, String propertyIri, String domainIri) { - val property = factory.getOWLDataProperty(propertyIri) - val domain = factory.getOWLClass(domainIri) - val axiom = factory.getOWLDataPropertyDomainAxiom(property, domain) - manager.addAxiom(ontology, axiom) - return axiom - } - - def addDataPropertyRange(OWLOntology ontology, String propertyIri, String rangeIri) { - val property = factory.getOWLDataProperty(propertyIri) - val range = factory.getOWLDatatype(rangeIri) - val axiom = factory.getOWLDataPropertyRangeAxiom(property, range) - manager.addAxiom(ontology, axiom) - return axiom - } - - def addInverseProperties(OWLOntology ontology, String forwardPropertyIri, String reversePropertyIri) { - val forwardproperty = factory.getOWLObjectProperty(forwardPropertyIri) - val reverseProperty = factory.getOWLObjectProperty(reversePropertyIri) - val axiom = factory.getOWLInverseObjectPropertiesAxiom(forwardproperty, reverseProperty) - manager.addAxiom(ontology, axiom) - return axiom - } - - def addClassAssertion(OWLOntology ontology, String individualIri, String classIri, OWLAnnotation...annotations) { - val individual = factory.getOWLNamedIndividual(individualIri) - val class = factory.getOWLClass(classIri) - val axiom = factory.getOWLClassAssertionAxiom(class, individual, annotations.checkIfNeeded) - manager.addAxiom(ontology, axiom) - return axiom - } - - def addObjectPropertyAssertion(OWLOntology ontology, String individualIri, String propertyIri, String objectIri, OWLAnnotation...annotations) { - val object = factory.getOWLNamedIndividual(objectIri) - val individual = factory.getOWLNamedIndividual(individualIri) - return addObjectPropertyAssertion(ontology, individual, propertyIri, object, annotations.checkIfNeeded) - } - - def addObjectPropertyAssertion(OWLOntology ontology, OWLIndividual individual, String propertyIri, OWLIndividual object, OWLAnnotation...annotations) { - val property = factory.getOWLObjectProperty(propertyIri) - val axiom = factory.getOWLObjectPropertyAssertionAxiom(property, individual, object, annotations.checkIfNeeded) - manager.addAxiom(ontology, axiom) - return axiom - } - - def addDataPropertyAssertion(OWLOntology ontology, String individualIri, String propertyIri, OWLLiteral literal, OWLAnnotation...annotations) { - val individual = factory.getOWLNamedIndividual(individualIri) - return addDataPropertyAssertion(ontology, individual, propertyIri, literal, annotations.checkIfNeeded) - } - - def addDataPropertyAssertion(OWLOntology ontology, OWLIndividual individual, String propertyIri, OWLLiteral literal, OWLAnnotation...annotations) { - val property = factory.getOWLDataProperty(propertyIri) - val axiom = factory.getOWLDataPropertyAssertionAxiom(property, individual, literal, annotations.checkIfNeeded) - manager.addAxiom(ontology, axiom) - return axiom - } - - def getAnnotation(String propertyIri, OWLAnnotationValue value) { - val property = factory.getOWLAnnotationProperty(propertyIri) - return factory.getOWLAnnotation(property, value) - } - - def addOntologyAnnotation(OWLOntology ontology, OWLAnnotation annotation) { - manager.applyChange(new AddOntologyAnnotation(ontology, annotation)) - return annotation - } - - def addAnnotationAssertion(OWLOntology ontology, String subjectIri, OWLAnnotation annotation) { - val axiom = factory.getOWLAnnotationAssertionAxiom(IRI.create(subjectIri), annotation) - manager.addAxiom(ontology, axiom) - return axiom - } - - def getFacetRestriction(OWLFacet facet, OWLLiteral value) { - return factory.getOWLFacetRestriction(facet, value) - } - - def getLiteral(boolean value) { - return factory.getOWLLiteral(value) - } - - def getLiteral(int value) { - return factory.getOWLLiteral(value) - } - - def getLiteral(double value) { - return factory.getOWLLiteral(value) - } - - def getLiteral(String value) { - return factory.getOWLLiteral(value) - } - - def getLiteral(BigDecimal value) { - return getLiteralWithDatatype(value.toString, XSD+"decimal") - } - - def getLiteralWithDatatype(String value, String datatypeIri) { - val datatype = factory.getOWLDatatype(datatypeIri) - return factory.getOWLLiteral(value, datatype) - } - - def getLiteralWithLangTag(String value, String langTag) { - return factory.getOWLLiteral(value, langTag) - } - - def checkIfNeeded(OWLAnnotation...annotations) { - if (annotationsOnAxioms) { - return Arrays.asList(annotations); - } else { - return Collections.emptyList(); - } - } -} \ No newline at end of file diff --git a/owl-adapter/oml2owl/src/main/resources/version.txt b/owl-adapter/oml2owl/src/main/resources/version.txt deleted file mode 100644 index 8fd9b8c..0000000 --- a/owl-adapter/oml2owl/src/main/resources/version.txt +++ /dev/null @@ -1 +0,0 @@ -0.7.11 \ No newline at end of file diff --git a/owl-adapter/settings.gradle b/settings.gradle similarity index 100% rename from owl-adapter/settings.gradle rename to settings.gradle