diff --git a/pom.xml b/pom.xml index 22721b9..01d6273 100644 --- a/pom.xml +++ b/pom.xml @@ -453,7 +453,7 @@ net.sourceforge.owlapi owlapi-distribution - 5.1.1 + 5.5.1 diff --git a/src/main/java/de/uni_stuttgart/vis/vowl/owl2vowl/converter/AbstractConverter.java b/src/main/java/de/uni_stuttgart/vis/vowl/owl2vowl/converter/AbstractConverter.java index 590e79b..999aa2c 100644 --- a/src/main/java/de/uni_stuttgart/vis/vowl/owl2vowl/converter/AbstractConverter.java +++ b/src/main/java/de/uni_stuttgart/vis/vowl/owl2vowl/converter/AbstractConverter.java @@ -343,6 +343,7 @@ private void setCorrectType(Collection entities) { } private void postParsing(OWLOntology loadedOntology, VowlData vowlData, OWLOntologyManager manager) { + vowlData.fixProperties(); setCorrectType(vowlData.getEntityMap().values()); parseAnnotations(vowlData, manager); fillDomainRanges(vowlData); diff --git a/src/main/java/de/uni_stuttgart/vis/vowl/owl2vowl/export/JsonGeneratorVisitorImpl.java b/src/main/java/de/uni_stuttgart/vis/vowl/owl2vowl/export/JsonGeneratorVisitorImpl.java index 7695217..1118621 100644 --- a/src/main/java/de/uni_stuttgart/vis/vowl/owl2vowl/export/JsonGeneratorVisitorImpl.java +++ b/src/main/java/de/uni_stuttgart/vis/vowl/owl2vowl/export/JsonGeneratorVisitorImpl.java @@ -90,6 +90,7 @@ public void visit(VowlThing vowlThing) { Map attributes = new HashMap<>(); addCommonFields(vowlThing, object, attributes); + attributes.remove("baseIri"); attributes.put("iri", VowlThing.GENERIC_THING_IRI.toString()); _class.add(object); @@ -171,14 +172,17 @@ public void visit(VowlDatatype vowlDatatype) { AbstractDatatype reference = vowlData.getDatatypeForIri(((DatatypeReference) vowlDatatype).getReferencedIri()); Map object = new HashMap<>(); Map attributes = new HashMap<>(); + String iri = reference.getIri().toString(); object.put("id", vowlData.getIdForEntity(vowlDatatype)); object.put("type", reference.getType()); attributes.put("id", vowlData.getIdForEntity(vowlDatatype)); attributes.put("label", getLabelsFromAnnotations(reference.getAnnotations().getLabels())); - attributes.put("iri", reference.getIri().toString()); - attributes.put("baseIri", reference.getBaseIri().toString()); + attributes.put("iri", iri); + + if(!iri.equals(VowlLiteral.LITERAL_IRI)) + attributes.put("baseIri", reference.getBaseIri().toString()); _class.add(object); classAttribute.add(attributes); diff --git a/src/main/java/de/uni_stuttgart/vis/vowl/owl2vowl/export/types/JsonGenerator.java b/src/main/java/de/uni_stuttgart/vis/vowl/owl2vowl/export/types/JsonGenerator.java index bc20202..804cb15 100644 --- a/src/main/java/de/uni_stuttgart/vis/vowl/owl2vowl/export/types/JsonGenerator.java +++ b/src/main/java/de/uni_stuttgart/vis/vowl/owl2vowl/export/types/JsonGenerator.java @@ -20,6 +20,7 @@ import java.util.*; import java.util.stream.Collectors; +import java.util.stream.Stream; /** * @@ -72,6 +73,8 @@ public void export(Exporter exporter) throws Exception { } protected void processHeader(VowlData vowlData) { + Set ignoreOther = Stream.of("title", "versionInfo", "creator") + .collect(Collectors.toCollection(HashSet::new)); OntologyInformation ontologyInformation = vowlData.getOntologyInformation(); header.put("languages", vowlData.getLanguages()); header.put("baseIris", vowlData.getBaseIris().stream().map(IRI::toString).collect(Collectors.toSet())); @@ -83,14 +86,17 @@ protected void processHeader(VowlData vowlData) { header.put("description", JsonGeneratorVisitorImpl.getLabelsFromAnnotations(ontologyInformation.getAnnotations().getDescription())); header.put("labels", JsonGeneratorVisitorImpl.getLabelsFromAnnotations(ontologyInformation.getAnnotations().getLabels())); header.put("comments", JsonGeneratorVisitorImpl.getLabelsFromAnnotations(ontologyInformation.getAnnotations().getComments())); - header.put("other", ontologyInformation.getAnnotations().getIdentifierToAnnotation()); + header.put("other", ontologyInformation.getAnnotations().getIdentifierToAnnotation().entrySet().stream() + .filter(x -> !ignoreOther.contains(x.getKey())) + .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue))); Map map = vowlData.getPrefixMap(); // adding prefix list to that thing; for (Map.Entry entry : map.entrySet()) { - String pr=entry.getKey(); - pr= pr.substring(0, pr.length() - 1); - prefixList.put(pr,entry.getValue()); + String pr=entry.getKey(); + pr= pr.substring(0, pr.length() - 1); + if(!pr.isEmpty()) + prefixList.put(pr,entry.getValue()); } } diff --git a/src/main/java/de/uni_stuttgart/vis/vowl/owl2vowl/model/data/VowlData.java b/src/main/java/de/uni_stuttgart/vis/vowl/owl2vowl/model/data/VowlData.java index b02e366..6413201 100644 --- a/src/main/java/de/uni_stuttgart/vis/vowl/owl2vowl/model/data/VowlData.java +++ b/src/main/java/de/uni_stuttgart/vis/vowl/owl2vowl/model/data/VowlData.java @@ -365,6 +365,37 @@ public IRI generate() { return IRI.create(iriPrefix + generations++); } } + + /** + * owlapi creates both ObjectProperty and DatatypeProperty from Properties + * with only type DatatypeProperty and InverseFunctionalProperty. + * The resulting file is different depending on the type that is + * created first (not deterministic). + * Check if an ObjectProperty has no range and if a DatatypeProperty with the same iri + * exists, reinsert it to force it into the EntityMap. + */ + public void fixProperties() { + Iterator> it = objectPropertyMap.entrySet().iterator(); + while (it.hasNext()) { + Entry pair = it.next(); + VowlObjectProperty P = pair.getValue(); + Set R = P.getRanges(); + VowlDatatypeProperty D = null; + if(R.size() == 0) { + try { + D = getDatatypePropertyForIri(pair.getKey()); + if(D != null) { + for(IRI domain : P.getDomains()) + D.addDomain(domain); + addDatatypeProperty(D); + it.remove(); + } + } catch (Exception e) { + + } + } + } + } } class AllEntityMap extends HashMap { diff --git a/src/main/java/de/uni_stuttgart/vis/vowl/owl2vowl/parser/vowl/AnnotationParser.java b/src/main/java/de/uni_stuttgart/vis/vowl/owl2vowl/parser/vowl/AnnotationParser.java index 5f14be8..dc34660 100644 --- a/src/main/java/de/uni_stuttgart/vis/vowl/owl2vowl/parser/vowl/AnnotationParser.java +++ b/src/main/java/de/uni_stuttgart/vis/vowl/owl2vowl/parser/vowl/AnnotationParser.java @@ -4,6 +4,7 @@ import de.uni_stuttgart.vis.vowl.owl2vowl.model.AbstractVowlObject; import de.uni_stuttgart.vis.vowl.owl2vowl.model.annotation.Annotation; import de.uni_stuttgart.vis.vowl.owl2vowl.model.data.VowlData; +import de.uni_stuttgart.vis.vowl.owl2vowl.model.entities.nodes.datatypes.VowlLiteral; import de.uni_stuttgart.vis.vowl.owl2vowl.parser.helper.IriFormatText; import org.semanticweb.owlapi.model.OWLOntologyManager; @@ -30,9 +31,12 @@ public void parse(AbstractVowlObject vowlObject) { protected void parseForEntity(AbstractVowlObject entity) { entity.accept(new AnnotationVisitor(vowlData, manager)); - String iriLabel = IriFormatText.cutQuote(IriFormatText.extractNameFromIRI(entity.getIri().toString())); - Annotation iriAnnotationLabel = new Annotation("label", iriLabel); - iriAnnotationLabel.setLanguage(Vowl_Lang.LANG_DEFAULT); - entity.getAnnotations().addLabel(iriAnnotationLabel); + String iri = entity.getIri().toString(); + if(!iri.equals(VowlLiteral.LITERAL_IRI)) { + String iriLabel = IriFormatText.cutQuote(IriFormatText.extractNameFromIRI(iri)); + Annotation iriAnnotationLabel = new Annotation("label", iriLabel); + iriAnnotationLabel.setLanguage(Vowl_Lang.LANG_DEFAULT); + entity.getAnnotations().addLabel(iriAnnotationLabel); + } } } diff --git a/src/main/java/de/uni_stuttgart/vis/vowl/owl2vowl/parser/vowl/property/DomainRangeFiller.java b/src/main/java/de/uni_stuttgart/vis/vowl/owl2vowl/parser/vowl/property/DomainRangeFiller.java index 2a3d58b..fe870e3 100644 --- a/src/main/java/de/uni_stuttgart/vis/vowl/owl2vowl/parser/vowl/property/DomainRangeFiller.java +++ b/src/main/java/de/uni_stuttgart/vis/vowl/owl2vowl/parser/vowl/property/DomainRangeFiller.java @@ -149,7 +149,7 @@ public void visit(TypeOfProperty typeOfProperty) { private void classBehaviour(AbstractProperty property) { if (property.getDomains().isEmpty() && property.getRanges().isEmpty()) { - if (!property.getReferencedIris().isEmpty()) { + if (!property.getReferencedIris().isEmpty() && property.getInverse() == null) { property.setExportToJson(false); return; } diff --git a/src/main/java/de/uni_stuttgart/vis/vowl/owl2vowl/parser/vowl/property/ObjectPropertyVisitor.java b/src/main/java/de/uni_stuttgart/vis/vowl/owl2vowl/parser/vowl/property/ObjectPropertyVisitor.java index 620ec09..3485f29 100644 --- a/src/main/java/de/uni_stuttgart/vis/vowl/owl2vowl/parser/vowl/property/ObjectPropertyVisitor.java +++ b/src/main/java/de/uni_stuttgart/vis/vowl/owl2vowl/parser/vowl/property/ObjectPropertyVisitor.java @@ -113,7 +113,9 @@ public void visit(OWLInverseObjectPropertiesAxiom axiom) { OWLObjectProperty baseProperty = secondProperty.asOWLObjectProperty(); AbstractProperty inverseVowlProp = vowlData.getPropertyForIri(inverseProperty.getIRI()); + AbstractProperty baseVowlProp = vowlData.getPropertyForIri(baseProperty.getIRI()); inverseVowlProp.addInverse(baseProperty.getIRI()); + baseVowlProp.addInverse(inverseProperty.getIRI()); } @Override