Compare commits

...

4 commits

Author SHA1 Message Date
Tony Anjorin dbd19e4ad8
Update README.md 2023-10-01 09:29:29 +02:00
Tony Anjorin b2f21e24e4
Merge pull request #314 from dwolters/master
Added interface for reporting inconsistencies
2023-10-01 09:21:12 +02:00
dwolt 75ef3db2bb Added class for defining composite termination conditions 2023-04-26 13:07:48 +02:00
dwolt e74bd3a328 Added interface for reporting inconsistencies. 2023-04-26 12:29:18 +02:00
9 changed files with 139 additions and 5 deletions

View file

@ -18,3 +18,4 @@ A Neo4j-based implementation of eMoflon
- Start a runtime Eclipse workspace (choose any project and click "Run As/Eclipse Application")
- In your runtime workspace import projectSetRuntime.psf or use the direct URL https://github.com/eMoflon/emoflon-neo/raw/master/projectSetRuntime.psf
- Set up the connection to Neo4j via -> Window -> Preferences -> eMoflon::Neo -> Neo4J Preferences by entering the copied Connection URI and User and the assigned Password.
- If you need to dump models stored in Neo4j back to eMSL, you can use https://github.com/dwolters/emsl-model-dumper

View file

@ -23,6 +23,7 @@ import org.emoflon.neo.engine.api.constraints.IConstraint;
import org.emoflon.neo.engine.api.patterns.IMatch;
import org.emoflon.neo.engine.api.rules.IRule;
import org.emoflon.neo.engine.generator.MatchContainer;
import org.emoflon.neo.engine.generator.modules.IInconsistencyReporter;
import org.emoflon.neo.engine.generator.modules.IMonitor;
import org.emoflon.neo.engine.generator.modules.IUpdatePolicy;
import org.emoflon.neo.engine.ilp.BinaryILPProblem;
@ -59,9 +60,11 @@ public abstract class ILPBasedOperationalStrategy implements IUpdatePolicy<NeoMa
protected String sourceModel;
protected String targetModel;
protected IInconsistencyReporter inconsistencyReporter;
protected SupportedILPSolver solver;
public ILPBasedOperationalStrategy(//
SupportedILPSolver solver, //
Collection<NeoRule> genRules, //
@ -69,7 +72,20 @@ public abstract class ILPBasedOperationalStrategy implements IUpdatePolicy<NeoMa
Collection<IConstraint> negativeConstraints, //
NeoCoreBuilder builder, //
String sourceModel, //
String targetModel//
String targetModel //
) {
this(solver, genRules, opRules, negativeConstraints, null, builder, sourceModel, targetModel);
}
public ILPBasedOperationalStrategy(//
SupportedILPSolver solver, //
Collection<NeoRule> genRules, //
Collection<NeoRule> opRules, //
Collection<IConstraint> negativeConstraints, //
IInconsistencyReporter inconsistencyReporter, //
NeoCoreBuilder builder, //
String sourceModel, //
String targetModel //
) {
this.sourceModel = sourceModel;
this.targetModel = targetModel;
@ -81,6 +97,8 @@ public abstract class ILPBasedOperationalStrategy implements IUpdatePolicy<NeoMa
elementToDependentMatches = new HashMap<>();
this.solver = solver;
this.inconsistencyReporter = inconsistencyReporter;
this.genRules = new HashMap<>();
genRules.forEach(tr -> this.genRules.put(tr.getName(), tr));
@ -565,6 +583,11 @@ public abstract class ILPBasedOperationalStrategy implements IUpdatePolicy<NeoMa
var inconsistentElements = determineInconsistentElements();
logger.info(inconsistentElements.size() + " elements of your triple are inconsistent!");
logger.debug("Inconsistent element IDs: " + inconsistentElements);
if (inconsistencyReporter != null) {
Collection<Long> inconsistentNodeIds = inconsistentElements.stream().filter(x -> x >= 0).toList();
Collection<Long> inconsistentRelationshipIds = inconsistentElements.stream().filter(x -> x < 0).map(x -> x*-1).toList();
inconsistencyReporter.reportInconsistencies(inconsistentNodeIds, inconsistentRelationshipIds);
}
}
} catch (Exception e) {
e.printStackTrace();

View file

@ -0,0 +1,33 @@
package org.emoflon.neo.engine.modules.terminationcondition;
import java.util.ArrayList;
import java.util.List;
import org.emoflon.neo.cypher.patterns.NeoMatch;
import org.emoflon.neo.cypher.rules.NeoCoMatch;
import org.emoflon.neo.engine.generator.MatchContainer;
import org.emoflon.neo.engine.generator.modules.ITerminationCondition;
public class CompositeTerminationCondition implements ITerminationCondition<NeoMatch, NeoCoMatch> {
private List<ITerminationCondition<NeoMatch, NeoCoMatch>> terminationConditions;
public CompositeTerminationCondition() {
this.terminationConditions = new ArrayList<>();
}
public boolean add(ITerminationCondition<NeoMatch, NeoCoMatch> e) {
return terminationConditions.add(e);
}
@Override
public boolean isReached(MatchContainer<NeoMatch, NeoCoMatch> matchContainer) {
if(terminationConditions.isEmpty())
return true;
for(ITerminationCondition<NeoMatch, NeoCoMatch> terminationCondition : terminationConditions) {
if(terminationCondition.isReached(matchContainer))
return true;
}
return false;
}
}

View file

@ -5,6 +5,7 @@ import org.emoflon.neo.cypher.models.NeoCoreBuilder;
import org.emoflon.neo.cypher.rules.NeoRule;
import org.emoflon.neo.engine.api.constraints.IConstraint;
import org.emoflon.neo.engine.generator.modules.ICleanupModule;
import org.emoflon.neo.engine.generator.modules.IInconsistencyReporter;
import org.emoflon.neo.engine.modules.ilp.ILPBasedOperationalStrategy;
import org.emoflon.neo.engine.modules.ilp.ILPFactory.SupportedILPSolver;
@ -21,6 +22,19 @@ public class BackwardTransformationOperationalStrategy extends ILPBasedOperation
) {
super(solver, genRules, opRules, negativeConstraints, builder, sourceModel, targetModel);
}
public BackwardTransformationOperationalStrategy(//
SupportedILPSolver solver, //
NeoCoreBuilder builder, //
Collection<NeoRule> genRules, //
Collection<NeoRule> opRules, //
Collection<IConstraint> negativeConstraints, //
IInconsistencyReporter inconsistencyReporter, //
String sourceModel, //
String targetModel//
) {
super(solver, genRules, opRules, negativeConstraints, inconsistencyReporter, builder, sourceModel, targetModel);
}
@Override
public String description() {

View file

@ -12,6 +12,7 @@ import org.emoflon.neo.engine.api.constraints.IConstraint;
import org.emoflon.neo.engine.api.rules.IRule;
import org.emoflon.neo.engine.generator.MatchContainer;
import org.emoflon.neo.engine.generator.modules.ICleanupModule;
import org.emoflon.neo.engine.generator.modules.IInconsistencyReporter;
import org.emoflon.neo.engine.generator.modules.IMonitor;
import org.emoflon.neo.engine.modules.ilp.ILPBasedOperationalStrategy;
import org.emoflon.neo.engine.modules.ilp.ILPFactory.SupportedILPSolver;
@ -24,11 +25,24 @@ public class CheckOnlyOperationalStrategy extends ILPBasedOperationalStrategy im
Collection<NeoRule> genRules, //
Collection<NeoRule> opRules, //
Collection<IConstraint> negativeConstraints, //
IInconsistencyReporter inconsistencyReporter,
NeoCoreBuilder builder, //
String sourceModel, //
String targetModel//
) {
super(solver, genRules, opRules, negativeConstraints, builder, sourceModel, targetModel);
super(solver, genRules, opRules, negativeConstraints, inconsistencyReporter, builder, sourceModel, targetModel);
}
public CheckOnlyOperationalStrategy(//
SupportedILPSolver solver, //
Collection<NeoRule> genRules, //
Collection<NeoRule> opRules, //
Collection<IConstraint> negativeConstraints, //
NeoCoreBuilder builder, //
String sourceModel, //
String targetModel//
) {
super(solver, genRules, opRules, negativeConstraints, null, builder, sourceModel, targetModel);
}
@Override

View file

@ -5,6 +5,7 @@ import org.emoflon.neo.cypher.models.NeoCoreBuilder;
import org.emoflon.neo.cypher.rules.NeoRule;
import org.emoflon.neo.engine.api.constraints.IConstraint;
import org.emoflon.neo.engine.generator.modules.ICleanupModule;
import org.emoflon.neo.engine.generator.modules.IInconsistencyReporter;
import org.emoflon.neo.engine.modules.ilp.ILPBasedOperationalStrategy;
import org.emoflon.neo.engine.modules.ilp.ILPFactory.SupportedILPSolver;
@ -21,6 +22,19 @@ public class CorrCreationOperationalStrategy extends ILPBasedOperationalStrategy
) {
super(solver, genRules, opRules, negativeConstraints, builder, sourceModel, targetModel);
}
public CorrCreationOperationalStrategy(//
SupportedILPSolver solver, //
NeoCoreBuilder builder, //
Collection<NeoRule> genRules, //
Collection<NeoRule> opRules, //
Collection<IConstraint> negativeConstraints, //
IInconsistencyReporter inconsistencyReporter, //
String sourceModel, //
String targetModel//
) {
super(solver, genRules, opRules, negativeConstraints, inconsistencyReporter, builder, sourceModel, targetModel);
}
@Override
public String description() {

View file

@ -5,6 +5,7 @@ import org.emoflon.neo.cypher.models.NeoCoreBuilder;
import org.emoflon.neo.cypher.rules.NeoRule;
import org.emoflon.neo.engine.api.constraints.IConstraint;
import org.emoflon.neo.engine.generator.modules.ICleanupModule;
import org.emoflon.neo.engine.generator.modules.IInconsistencyReporter;
import org.emoflon.neo.engine.modules.ilp.ILPBasedOperationalStrategy;
import org.emoflon.neo.engine.modules.ilp.ILPFactory.SupportedILPSolver;
@ -21,6 +22,19 @@ public class ForwardTransformationOperationalStrategy extends ILPBasedOperationa
) {
super(solver, genRules, opRules, negativeConstraints, builder, sourceModel, targetModel);
}
public ForwardTransformationOperationalStrategy(//
SupportedILPSolver solver, //
NeoCoreBuilder builder, //
Collection<NeoRule> genRules, //
Collection<NeoRule> opRules, //
Collection<IConstraint> negativeConstraints, //
IInconsistencyReporter inconsistencyReporter, //
String sourceModel, //
String targetModel//
) {
super(solver, genRules, opRules, negativeConstraints, inconsistencyReporter, builder, sourceModel, targetModel);
}
@Override
public String description() {

View file

@ -15,6 +15,7 @@ import org.emoflon.neo.engine.api.constraints.IConstraint;
import org.emoflon.neo.engine.api.rules.IRule;
import org.emoflon.neo.engine.generator.MatchContainer;
import org.emoflon.neo.engine.generator.modules.ICleanupModule;
import org.emoflon.neo.engine.generator.modules.IInconsistencyReporter;
import org.emoflon.neo.engine.generator.modules.IMonitor;
import org.emoflon.neo.engine.modules.ilp.ILPBasedOperationalStrategy;
import org.emoflon.neo.engine.modules.ilp.ILPFactory.SupportedILPSolver;
@ -29,7 +30,7 @@ public class ModelIntegrationOperationalStrategy extends ILPBasedOperationalStra
private static double alpha; // delete-delta
private static double beta; // create-delta
private static double gamma; // added elements
public ModelIntegrationOperationalStrategy(//
SupportedILPSolver solver, //
NeoCoreBuilder builder, //
@ -39,7 +40,20 @@ public class ModelIntegrationOperationalStrategy extends ILPBasedOperationalStra
String sourceModel, //
String targetModel//
) {
super(solver, genRules, opRules, negativeConstraints, builder, sourceModel, targetModel);
this(solver, builder, genRules, opRules, negativeConstraints, null, sourceModel, targetModel);
}
public ModelIntegrationOperationalStrategy(//
SupportedILPSolver solver, //
NeoCoreBuilder builder, //
Collection<NeoRule> genRules, //
Collection<NeoRule> opRules, //
Collection<IConstraint> negativeConstraints, //
IInconsistencyReporter inconsistencyReporter, //
String sourceModel, //
String targetModel//
) {
super(solver, genRules, opRules, negativeConstraints, inconsistencyReporter, builder, sourceModel, targetModel);
setWeightings(builder.getAlpha(), builder.getBeta(), builder.getGamma());
opRuleNameToGenRule = new HashMap<>();

View file

@ -0,0 +1,7 @@
package org.emoflon.neo.engine.generator.modules;
import java.util.Collection;
public interface IInconsistencyReporter {
void reportInconsistencies(Collection<Long> inconsistentNodeIds, Collection<Long> inconsistentRelationshipIds);
}