From 89049b50484d7f9047cc0fd44c9353a0adec4834 Mon Sep 17 00:00:00 2001 From: neon12345 <784389+neon12345@users.noreply.github.com> Date: Mon, 16 Jun 2025 12:42:39 +0200 Subject: [PATCH 01/12] Update AbstractConverter.java fix owlapi handling of DatatypeProperty with InverseFunctionalProperty --- .../owl2vowl/converter/AbstractConverter.java | 24 +++++++++++++++++++ 1 file changed, 24 insertions(+) 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..36005d8 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,30 @@ private void setCorrectType(Collection entities) { } private void postParsing(OWLOntology loadedOntology, VowlData vowlData, OWLOntologyManager manager) { + /* + 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. + */ + Iterator> it = vowlData.getObjectPropertyMap().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 = vowlData.getDatatypePropertyForIri(pair.getKey()); + if(D != null) + vowlData.addDatatypeProperty(D); + } catch (Exception e) { + + } + } + } setCorrectType(vowlData.getEntityMap().values()); parseAnnotations(vowlData, manager); fillDomainRanges(vowlData); From ce73bc9a433cd6859c6a92cb2a7a24c929ef3cf3 Mon Sep 17 00:00:00 2001 From: neon12345 <784389+neon12345@users.noreply.github.com> Date: Mon, 16 Jun 2025 13:06:06 +0200 Subject: [PATCH 02/12] Update AbstractConverter.java fix domain --- .../vis/vowl/owl2vowl/converter/AbstractConverter.java | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) 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 36005d8..6dce381 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 @@ -360,10 +360,13 @@ created first (not deterministic). if(R.size() == 0) { try { D = vowlData.getDatatypePropertyForIri(pair.getKey()); - if(D != null) + if(D != null) { + for(IRI domain : P.getDomains()) + D.addDomain(domain); vowlData.addDatatypeProperty(D); + } } catch (Exception e) { - + } } } From 7d06ca2efb72a2aa63605a7be3a96545e9836172 Mon Sep 17 00:00:00 2001 From: neon12345 <784389+neon12345@users.noreply.github.com> Date: Mon, 16 Jun 2025 16:33:21 +0200 Subject: [PATCH 03/12] Update VowlData.java move property fix to VowlData.java --- .../vowl/owl2vowl/model/data/VowlData.java | 23 +++++++++++++++++++ 1 file changed, 23 insertions(+) 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..cfeaf9f 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,29 @@ public IRI generate() { return IRI.create(iriPrefix + generations++); } } + + 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 { From f78833021903cece3bd43d84593209c0516c8bad Mon Sep 17 00:00:00 2001 From: neon12345 <784389+neon12345@users.noreply.github.com> Date: Mon, 16 Jun 2025 16:35:26 +0200 Subject: [PATCH 04/12] Update AbstractConverter.java call property fix --- .../owl2vowl/converter/AbstractConverter.java | 28 +------------------ 1 file changed, 1 insertion(+), 27 deletions(-) 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 6dce381..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,33 +343,7 @@ private void setCorrectType(Collection entities) { } private void postParsing(OWLOntology loadedOntology, VowlData vowlData, OWLOntologyManager manager) { - /* - 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. - */ - Iterator> it = vowlData.getObjectPropertyMap().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 = vowlData.getDatatypePropertyForIri(pair.getKey()); - if(D != null) { - for(IRI domain : P.getDomains()) - D.addDomain(domain); - vowlData.addDatatypeProperty(D); - } - } catch (Exception e) { - - } - } - } + vowlData.fixProperties(); setCorrectType(vowlData.getEntityMap().values()); parseAnnotations(vowlData, manager); fillDomainRanges(vowlData); From 3d9f2c47f08aa698f5f1df541c9354036e30f57a Mon Sep 17 00:00:00 2001 From: neon12345 <784389+neon12345@users.noreply.github.com> Date: Mon, 16 Jun 2025 16:37:24 +0200 Subject: [PATCH 05/12] Update VowlData.java add comment for fixProperties --- .../vis/vowl/owl2vowl/model/data/VowlData.java | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) 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 cfeaf9f..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,7 +365,15 @@ 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()) { From 9e4f1f9e196a242289f0c276dad93dfe50afa2f2 Mon Sep 17 00:00:00 2001 From: neon12345 <784389+neon12345@users.noreply.github.com> Date: Mon, 16 Jun 2025 23:48:06 +0200 Subject: [PATCH 06/12] Update JsonGeneratorVisitorImpl.java consitently have no baseIri on rdfs:Literal --- .../vis/vowl/owl2vowl/export/JsonGeneratorVisitorImpl.java | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) 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..2d4f9d4 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 @@ -171,14 +171,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); From 5f5e94bae917a73d36a539a1ee235211a92f00ee Mon Sep 17 00:00:00 2001 From: neon12345 <784389+neon12345@users.noreply.github.com> Date: Mon, 16 Jun 2025 23:59:54 +0200 Subject: [PATCH 07/12] Update JsonGeneratorVisitorImpl.java have no baseIri on owl:Thing --- .../vis/vowl/owl2vowl/export/JsonGeneratorVisitorImpl.java | 1 + 1 file changed, 1 insertion(+) 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 2d4f9d4..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); From 45f5c305dd26a9c2c998780ec8b20834609c2420 Mon Sep 17 00:00:00 2001 From: neon12345 <784389+neon12345@users.noreply.github.com> Date: Tue, 17 Jun 2025 00:34:36 +0200 Subject: [PATCH 08/12] Update AnnotationParser.java no default lang label for rdfs:Literal --- .../vowl/owl2vowl/parser/vowl/AnnotationParser.java | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) 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); + } } } From 3ca96a6c5fe9db97cff8bc11ff6d44d210f9ae48 Mon Sep 17 00:00:00 2001 From: neon12345 <784389+neon12345@users.noreply.github.com> Date: Tue, 17 Jun 2025 23:26:44 +0200 Subject: [PATCH 09/12] Update JsonGenerator.java ignore title for other header data --- .../vis/vowl/owl2vowl/export/types/JsonGenerator.java | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) 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..30dcc6c 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 @@ -83,7 +83,10 @@ 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 -> !x.getKey().equals("title")) + .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue))); Map map = vowlData.getPrefixMap(); // adding prefix list to that thing; From 3598f7a2089cc5ca10142a69715efc63c59eaef2 Mon Sep 17 00:00:00 2001 From: neon12345 <784389+neon12345@users.noreply.github.com> Date: Fri, 20 Jun 2025 15:36:31 +0200 Subject: [PATCH 10/12] Update JsonGenerator.java ignore empty prefix --- .../vis/vowl/owl2vowl/export/types/JsonGenerator.java | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) 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 30dcc6c..21da55d 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 @@ -91,9 +91,10 @@ protected void processHeader(VowlData vowlData) { 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()); } } From e4a681ec5a7bd74488adc7d2288ab238fdfe6851 Mon Sep 17 00:00:00 2001 From: neon12345 <784389+neon12345@users.noreply.github.com> Date: Fri, 20 Jun 2025 19:07:20 +0200 Subject: [PATCH 11/12] Update JsonGenerator.java ignore title, versionInfo, creator for other in header --- .../vis/vowl/owl2vowl/export/types/JsonGenerator.java | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) 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 21da55d..e6a1098 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 @@ -72,6 +72,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,9 +85,8 @@ 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().entrySet() - .stream() - .filter(x -> !x.getKey().equals("title")) + 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(); From afdb2f553b556ed9cf80294e4dc23d1222a8374e Mon Sep 17 00:00:00 2001 From: neon12345 <784389+neon12345@users.noreply.github.com> Date: Tue, 1 Jul 2025 17:19:46 +0200 Subject: [PATCH 12/12] fix missing inverse --- pom.xml | 2 +- .../vis/vowl/owl2vowl/export/types/JsonGenerator.java | 1 + .../vowl/owl2vowl/parser/vowl/property/DomainRangeFiller.java | 2 +- .../owl2vowl/parser/vowl/property/ObjectPropertyVisitor.java | 2 ++ 4 files changed, 5 insertions(+), 2 deletions(-) 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/export/types/JsonGenerator.java b/src/main/java/de/uni_stuttgart/vis/vowl/owl2vowl/export/types/JsonGenerator.java index e6a1098..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; /** * 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