diff --git a/src/main/java/fr/inrialpes/exmo/linkkey/CandidateLinkkey.java b/src/main/java/fr/inrialpes/exmo/linkkey/CandidateLinkkey.java index 9d2658ecdb50026335013ea864a9acdfd3da0136..703db8999d85f643054713e0a9a02ae3a5d013a5 100644 --- a/src/main/java/fr/inrialpes/exmo/linkkey/CandidateLinkkey.java +++ b/src/main/java/fr/inrialpes/exmo/linkkey/CandidateLinkkey.java @@ -529,8 +529,8 @@ public class CandidateLinkkey implements EvaluableRule { public boolean moreSpecificThan(CandidateLinkkey o) { if (o.eqPairs.isEmpty()&&o.inPairs.isEmpty()) return true; return this.eqPairs.containsAll(o.eqPairs) && this.inPairs.containsAll(o.inPairs) - && ClassExpressions.contains(o.classes1, this.classes1) && - ClassExpressions.contains(o.classes2, this.classes2); + && ClassExpressions.contains(o.classes1, this.classes1) && + ClassExpressions.contains(o.classes2, this.classes2); } public boolean moreGeneralThan(CandidateLinkkey o) { @@ -545,10 +545,10 @@ public class CandidateLinkkey implements EvaluableRule { public boolean isContained(LongSet eqPairs, LongSet inPairs, Set<IntSet> classes1, Set<IntSet> classes2) { if (this.eqPairs.isEmpty() && this.inPairs.isEmpty()) return true; - return eqPairs.containsAll(this.eqPairs) && - inPairs.containsAll(this.inPairs) && - ClassExpressions.contains(this.classes1, classes1) && - ClassExpressions.contains(this.classes2, classes2); + return eqPairs.containsAll(this.eqPairs) + && inPairs.containsAll(this.inPairs) + && ClassExpressions.contains(this.classes1, classes1) + && ClassExpressions.contains(this.classes2, classes2); } @@ -577,7 +577,8 @@ public class CandidateLinkkey implements EvaluableRule { } /* - returns the generator of a given pair of sets of eq and in property pairs + returns a generator of a given pair of sets of eq and in property pairs + a generator is a most general subsumee of the given intent This is used by addIntent algorithm */ public CandidateLinkkey getMaximal(LongSet eqPairs, LongSet inPairs, Set<IntSet> classes1, Set<IntSet> classes2) { @@ -586,6 +587,8 @@ public class CandidateLinkkey implements EvaluableRule { while (parentIsMaximal) { parentIsMaximal = false; for (CandidateLinkkey p : generator.parents) { + // if parent is more specific or equals to the given intent + // then p becomes generator and continue if (p.contains(eqPairs, inPairs, classes1, classes2)) { generator = p; parentIsMaximal = true; diff --git a/src/main/java/fr/inrialpes/exmo/linkkey/LinkKeyRenderer.java b/src/main/java/fr/inrialpes/exmo/linkkey/LinkKeyRenderer.java index 8e95bdf87a0884828095ae6e0c428d52c17b24b8..dde0ec69b7f39b704ddd3e60db10260ae6719ed6 100644 --- a/src/main/java/fr/inrialpes/exmo/linkkey/LinkKeyRenderer.java +++ b/src/main/java/fr/inrialpes/exmo/linkkey/LinkKeyRenderer.java @@ -1,5 +1,5 @@ /* - * Copyright (C) 2014-2018 Jerome David <jerome.david@univ-grenoble-alpes.fr> + * Copyright (C) 2014-2020 Jerome David <jerome.david@univ-grenoble-alpes.fr> * * This file is part of Linkex. * @@ -167,6 +167,7 @@ public class LinkKeyRenderer { LongSet inPairs = new LongOpenHashSet(c.getInPairs()); LongSet eqPairs = new LongOpenHashSet(c.getEqPairs()); + // \emptyset -> \u2205 String resIn = "\\\u2205"; if (!inPairs.isEmpty()) { inPairs.removeAll(c.getEqPairs()); diff --git a/src/main/java/fr/inrialpes/exmo/linkkey/LinkkeyDiscoveryAlgorithm.java b/src/main/java/fr/inrialpes/exmo/linkkey/LinkkeyDiscoveryAlgorithm.java index ada93407422b3316e9e64f64fbd4e43e00c930ea..9b929354866cc8b1e6260ebcabc4fd66609801a5 100644 --- a/src/main/java/fr/inrialpes/exmo/linkkey/LinkkeyDiscoveryAlgorithm.java +++ b/src/main/java/fr/inrialpes/exmo/linkkey/LinkkeyDiscoveryAlgorithm.java @@ -1020,15 +1020,16 @@ public class LinkkeyDiscoveryAlgorithm { public CandidateLinkkey addIntent(LongSet eqPairs, LongSet inPairs, Set<IntSet> classes1, Set<IntSet> classes2, CandidateLinkkey generator) { generator = generator.getMaximal(eqPairs, inPairs, classes1, classes2); - if (generator.equals(eqPairs,inPairs)) { //, classes1, classes2)) {// - generator.classes1=ClassExpressions.union(generator.getClasses1(), classes1); - generator.classes2=ClassExpressions.union(generator.getClasses2(), classes2); + if (generator.equals(eqPairs,inPairs, classes1, classes2)) { return generator; } Set<CandidateLinkkey> newParents = new HashSet<>(); + // search for the candidates to be the parent of the concept to be created for (CandidateLinkkey p : generator.getParents()) { //if (!p.isContained(eqPairs, inPairs) || p.equals(eqPairs, inPairs)) { - if (!p.isContained(eqPairs, inPairs, classes1, classes2) || p.equals(eqPairs, inPairs, classes1, classes2)) { + // if a parent the generator is not a subsumer of intent + // then search a subsumer within the hiearchy + if (!p.isContained(eqPairs, inPairs, classes1, classes2)) {// || p.equals(eqPairs, inPairs, classes1, classes2)) { LongSet meetEqPairs = new LongOpenHashSet(eqPairs); LongSet meetInPairs = new LongOpenHashSet(inPairs); meetEqPairs.retainAll(p.getEqPairs()); @@ -1060,6 +1061,11 @@ public class LinkkeyDiscoveryAlgorithm { generator.removeParent(np); newCandidate.addParent(np); } + // union of classes to root + CandidateLinkkey root = newCandidate.getTop(); + root.classes1=ClassExpressions.union(root.getClasses1(), classes1); + root.classes2=ClassExpressions.union(root.getClasses2(), classes2); + generator.addParent(newCandidate); return newCandidate;