diff options
| author | RncLsn <rnc.lsn@gmail.com> | 2015-05-13 11:57:06 +0100 |
|---|---|---|
| committer | RncLsn <rnc.lsn@gmail.com> | 2015-05-13 11:57:06 +0100 |
| commit | 7e0ecc07285209e65f9d4d022065d06a4997fc86 (patch) | |
| tree | 3c3faa6684e49444c7078903d2e5762fc44bb3a6 /src/uk/ac/ox | |
| parent | 0c2726db44b562cbda9bfa87e76d829927c31ec8 (diff) | |
| download | ACQuA-7e0ecc07285209e65f9d4d022065d06a4997fc86.tar.gz ACQuA-7e0ecc07285209e65f9d4d022065d06a4997fc86.zip | |
Implementing Limited Skolemisation, in particular SkolemTermsDispenser.
Diffstat (limited to 'src/uk/ac/ox')
29 files changed, 492 insertions, 579 deletions
diff --git a/src/uk/ac/ox/cs/pagoda/constraints/PredicateDependency.java b/src/uk/ac/ox/cs/pagoda/constraints/PredicateDependency.java index b201918..70f841f 100644 --- a/src/uk/ac/ox/cs/pagoda/constraints/PredicateDependency.java +++ b/src/uk/ac/ox/cs/pagoda/constraints/PredicateDependency.java | |||
| @@ -1,155 +1,135 @@ | |||
| 1 | package uk.ac.ox.cs.pagoda.constraints; | 1 | package uk.ac.ox.cs.pagoda.constraints; |
| 2 | 2 | ||
| 3 | import java.util.Collection; | 3 | import org.semanticweb.HermiT.model.*; |
| 4 | import java.util.HashMap; | 4 | import uk.ac.ox.cs.pagoda.rules.approximators.OverApproxExist; |
| 5 | import java.util.HashSet; | ||
| 6 | import java.util.LinkedList; | ||
| 7 | import java.util.Map; | ||
| 8 | import java.util.Queue; | ||
| 9 | import java.util.Set; | ||
| 10 | |||
| 11 | import org.semanticweb.HermiT.model.AnnotatedEquality; | ||
| 12 | import org.semanticweb.HermiT.model.AtLeastConcept; | ||
| 13 | import org.semanticweb.HermiT.model.AtLeastDataRange; | ||
| 14 | import org.semanticweb.HermiT.model.Atom; | ||
| 15 | import org.semanticweb.HermiT.model.AtomicConcept; | ||
| 16 | import org.semanticweb.HermiT.model.AtomicNegationConcept; | ||
| 17 | import org.semanticweb.HermiT.model.AtomicRole; | ||
| 18 | import org.semanticweb.HermiT.model.DLClause; | ||
| 19 | import org.semanticweb.HermiT.model.DLPredicate; | ||
| 20 | import org.semanticweb.HermiT.model.Equality; | ||
| 21 | import org.semanticweb.HermiT.model.Inequality; | ||
| 22 | import org.semanticweb.HermiT.model.InverseRole; | ||
| 23 | |||
| 24 | import uk.ac.ox.cs.pagoda.rules.OverApproxExist; | ||
| 25 | import uk.ac.ox.cs.pagoda.util.Namespace; | 5 | import uk.ac.ox.cs.pagoda.util.Namespace; |
| 26 | import uk.ac.ox.cs.pagoda.util.Utility; | 6 | import uk.ac.ox.cs.pagoda.util.Utility; |
| 27 | 7 | ||
| 8 | import java.util.*; | ||
| 9 | |||
| 28 | 10 | ||
| 29 | public class PredicateDependency extends DependencyGraph<DLPredicate> { | 11 | public class PredicateDependency extends DependencyGraph<DLPredicate> { |
| 30 | 12 | ||
| 31 | Collection<DLClause> m_clauses; | 13 | private static final DLPredicate equality = AtomicRole.create(Namespace.EQUALITY); |
| 32 | Map<PredicatePair, LinkedList<DLClause>> edgeLabels = new HashMap<PredicatePair, LinkedList<DLClause>>(); | 14 | private static final DLPredicate inequality = AtomicRole.create(Namespace.INEQUALITY); |
| 33 | 15 | Collection<DLClause> m_clauses; | |
| 16 | Map<PredicatePair, LinkedList<DLClause>> edgeLabels = new HashMap<PredicatePair, LinkedList<DLClause>>(); | ||
| 17 | Set<DLPredicate> reachableToBottom = null; | ||
| 18 | |||
| 34 | public PredicateDependency(Collection<DLClause> clauses) { | 19 | public PredicateDependency(Collection<DLClause> clauses) { |
| 35 | m_clauses = clauses; | 20 | m_clauses = clauses; |
| 36 | build(); | 21 | build(); |
| 37 | } | 22 | } |
| 38 | 23 | ||
| 39 | @Override | 24 | @Override |
| 40 | protected void build() { | 25 | protected void build() { |
| 41 | update(m_clauses); | 26 | update(m_clauses); |
| 42 | 27 | ||
| 43 | addLink(equality, AtomicConcept.NOTHING); | 28 | addLink(equality, AtomicConcept.NOTHING); |
| 44 | addLink(inequality, AtomicConcept.NOTHING); | 29 | addLink(inequality, AtomicConcept.NOTHING); |
| 45 | } | 30 | } |
| 46 | 31 | ||
| 47 | private void addEdgeLabel(DLPredicate body, DLPredicate head, DLClause clause) { | 32 | private void addEdgeLabel(DLPredicate body, DLPredicate head, DLClause clause) { |
| 48 | PredicatePair key = new PredicatePair(body, head); | 33 | PredicatePair key = new PredicatePair(body, head); |
| 49 | LinkedList<DLClause> value; | 34 | LinkedList<DLClause> value; |
| 50 | if ((value = edgeLabels.get(key)) == null) | 35 | if ((value = edgeLabels.get(key)) == null) |
| 51 | edgeLabels.put(key, value = new LinkedList<DLClause>()); | 36 | edgeLabels.put(key, value = new LinkedList<DLClause>()); |
| 52 | value.add(clause); | 37 | value.add(clause); |
| 53 | } | 38 | } |
| 54 | 39 | ||
| 55 | private void addLinks4Negation(AtomicConcept c, DLClause clause) { | 40 | private void addLinks4Negation(AtomicConcept c, DLClause clause) { |
| 56 | addLink(c, AtomicConcept.NOTHING); | 41 | addLink(c, AtomicConcept.NOTHING); |
| 57 | addEdgeLabel(c, AtomicConcept.NOTHING, clause); | 42 | addEdgeLabel(c, AtomicConcept.NOTHING, clause); |
| 58 | String iri = c.getIRI(); | 43 | String iri = c.getIRI(); |
| 59 | addLink(c = AtomicConcept.create(iri.substring(0, iri.length() - 4)), AtomicConcept.NOTHING); | 44 | addLink(c = AtomicConcept.create(iri.substring(0, iri.length() - 4)), AtomicConcept.NOTHING); |
| 60 | addEdgeLabel(c, AtomicConcept.NOTHING, clause); | 45 | addEdgeLabel(c, AtomicConcept.NOTHING, clause); |
| 61 | } | 46 | } |
| 62 | 47 | ||
| 63 | public Set<DLPredicate> collectPredicate(Atom[] atoms) { | 48 | public Set<DLPredicate> collectPredicate(Atom[] atoms) { |
| 64 | Set<DLPredicate> predicates = new HashSet<DLPredicate>(); | 49 | Set<DLPredicate> predicates = new HashSet<DLPredicate>(); |
| 65 | for (Atom atom: atoms) | 50 | for (Atom atom : atoms) |
| 66 | predicates.addAll(getAtomicPredicates(atom.getDLPredicate())); | 51 | predicates.addAll(getAtomicPredicates(atom.getDLPredicate())); |
| 67 | return predicates; | 52 | return predicates; |
| 68 | } | 53 | } |
| 69 | |||
| 70 | private static final DLPredicate equality = AtomicRole.create(Namespace.EQUALITY); | ||
| 71 | private static final DLPredicate inequality = AtomicRole.create(Namespace.INEQUALITY); | ||
| 72 | 54 | ||
| 73 | private Set<DLPredicate> getAtomicPredicates(DLPredicate predicate) { | 55 | private Set<DLPredicate> getAtomicPredicates(DLPredicate predicate) { |
| 74 | Set<DLPredicate> predicates = new HashSet<DLPredicate>(); | 56 | Set<DLPredicate> predicates = new HashSet<DLPredicate>(); |
| 75 | if (predicate instanceof AtLeastConcept) | 57 | if (predicate instanceof AtLeastConcept) |
| 76 | predicates.addAll(getAtomicPredicates((AtLeastConcept) predicate)); | 58 | predicates.addAll(getAtomicPredicates((AtLeastConcept) predicate)); |
| 77 | else { | 59 | else { |
| 78 | if ((predicate = getAtomicPredicate(predicate)) != null) | 60 | if ((predicate = getAtomicPredicate(predicate)) != null) |
| 79 | predicates.add(predicate); | 61 | predicates.add(predicate); |
| 80 | } | 62 | } |
| 81 | return predicates; | 63 | return predicates; |
| 82 | } | 64 | } |
| 83 | 65 | ||
| 84 | private Set<DLPredicate> getAtomicPredicates(AtLeastConcept alc) { | 66 | private Set<DLPredicate> getAtomicPredicates(AtLeastConcept alc) { |
| 85 | Set<DLPredicate> set = new HashSet<DLPredicate>(); | 67 | Set<DLPredicate> set = new HashSet<DLPredicate>(); |
| 86 | if (alc.getOnRole() instanceof AtomicRole) | 68 | if (alc.getOnRole() instanceof AtomicRole) |
| 87 | set.add((AtomicRole) alc.getOnRole()); | 69 | set.add((AtomicRole) alc.getOnRole()); |
| 88 | else | 70 | else |
| 89 | set.add(((InverseRole) alc.getOnRole()).getInverseOf()); | 71 | set.add(((InverseRole) alc.getOnRole()).getInverseOf()); |
| 90 | 72 | ||
| 91 | if (alc.getToConcept() instanceof AtomicConcept) | 73 | if (alc.getToConcept() instanceof AtomicConcept) |
| 92 | if (alc.getToConcept().equals(AtomicConcept.THING)); | 74 | if (alc.getToConcept().equals(AtomicConcept.THING)) ; |
| 93 | else set.add((AtomicConcept) alc.getToConcept()); | 75 | else set.add((AtomicConcept) alc.getToConcept()); |
| 94 | else | 76 | else |
| 95 | set.add(OverApproxExist.getNegationConcept(((AtomicNegationConcept) alc.getToConcept()).getNegatedAtomicConcept())); | 77 | set.add(OverApproxExist.getNegationConcept(((AtomicNegationConcept) alc.getToConcept()).getNegatedAtomicConcept())); |
| 96 | return set; | 78 | return set; |
| 97 | } | 79 | } |
| 98 | 80 | ||
| 99 | private DLPredicate getAtomicPredicate(DLPredicate p) { | 81 | private DLPredicate getAtomicPredicate(DLPredicate p) { |
| 100 | if (p instanceof Equality || p instanceof AnnotatedEquality) | 82 | if (p instanceof Equality || p instanceof AnnotatedEquality) |
| 101 | return equality; | 83 | return equality; |
| 102 | if (p instanceof Inequality) | 84 | if (p instanceof Inequality) |
| 103 | return inequality; | 85 | return inequality; |
| 104 | if (p instanceof AtomicConcept) | 86 | if (p instanceof AtomicConcept) |
| 105 | if (p.equals(AtomicConcept.THING)) | 87 | if (p.equals(AtomicConcept.THING)) |
| 106 | return null; | 88 | return null; |
| 107 | else return p; | 89 | else return p; |
| 108 | if (p instanceof AtomicRole) | 90 | if (p instanceof AtomicRole) |
| 109 | return p; | 91 | return p; |
| 110 | if (p instanceof AtLeastDataRange) { | 92 | if (p instanceof AtLeastDataRange) { |
| 111 | AtLeastDataRange aldr = (AtLeastDataRange) p; | 93 | AtLeastDataRange aldr = (AtLeastDataRange) p; |
| 112 | if (aldr.getOnRole() instanceof AtomicRole) | 94 | if (aldr.getOnRole() instanceof AtomicRole) |
| 113 | return (AtomicRole) aldr.getOnRole(); | 95 | return (AtomicRole) aldr.getOnRole(); |
| 114 | else | 96 | else |
| 115 | return ((InverseRole) aldr.getOnRole()).getInverseOf(); | 97 | return ((InverseRole) aldr.getOnRole()).getInverseOf(); |
| 116 | } | 98 | } |
| 117 | Utility.logDebug("Unknown DLPredicate in PredicateDependency: " + p); | 99 | Utility.logDebug("Unknown DLPredicate in PredicateDependency: " + p); |
| 118 | return null; | 100 | return null; |
| 119 | } | 101 | } |
| 120 | 102 | ||
| 121 | public Set<DLClause> pathTo(DLPredicate p) { | 103 | public Set<DLClause> pathTo(DLPredicate p) { |
| 122 | Set<DLClause> rules = new HashSet<DLClause>(); | 104 | Set<DLClause> rules = new HashSet<DLClause>(); |
| 123 | Set<DLPredicate> visited = new HashSet<DLPredicate>(); | 105 | Set<DLPredicate> visited = new HashSet<DLPredicate>(); |
| 124 | 106 | ||
| 125 | Queue<DLPredicate> queue = new LinkedList<DLPredicate>(); | 107 | Queue<DLPredicate> queue = new LinkedList<DLPredicate>(); |
| 126 | queue.add(p); | 108 | queue.add(p); |
| 127 | visited.add(p); | 109 | visited.add(p); |
| 128 | 110 | ||
| 129 | Set<DLPredicate> edge; | 111 | Set<DLPredicate> edge; |
| 130 | Collection<DLClause> clauses; | 112 | Collection<DLClause> clauses; |
| 131 | 113 | ||
| 132 | while (!queue.isEmpty()) { | 114 | while (!queue.isEmpty()) { |
| 133 | if ((edge = reverseEdges.get(p = queue.poll())) != null) { | 115 | if ((edge = reverseEdges.get(p = queue.poll())) != null) { |
| 134 | for (DLPredicate pred: edge) { | 116 | for (DLPredicate pred: edge) { |
| 135 | if (!visited.contains(pred)) { | 117 | if (!visited.contains(pred)) { |
| 136 | queue.add(pred); | 118 | queue.add(pred); |
| 137 | visited.add(pred); | 119 | visited.add(pred); |
| 138 | } | 120 | } |
| 139 | clauses = edgeLabelsBetween(pred, p); | 121 | clauses = edgeLabelsBetween(pred, p); |
| 140 | if (clauses != null) rules.addAll(clauses); | 122 | if (clauses != null) rules.addAll(clauses); |
| 141 | } | 123 | } |
| 142 | } | 124 | } |
| 143 | } | 125 | } |
| 144 | return rules; | 126 | return rules; |
| 145 | } | 127 | } |
| 146 | 128 | ||
| 147 | private LinkedList<DLClause> edgeLabelsBetween(DLPredicate p, DLPredicate q) { | 129 | private LinkedList<DLClause> edgeLabelsBetween(DLPredicate p, DLPredicate q) { |
| 148 | PredicatePair pair = new PredicatePair(p, q); | 130 | PredicatePair pair = new PredicatePair(p, q); |
| 149 | return edgeLabels.get(pair); | 131 | return edgeLabels.get(pair); |
| 150 | } | 132 | } |
| 151 | |||
| 152 | Set<DLPredicate> reachableToBottom = null; | ||
| 153 | 133 | ||
| 154 | public Set<DLClause> pathToBottom(DLPredicate p) { | 134 | public Set<DLClause> pathToBottom(DLPredicate p) { |
| 155 | if (reachableToBottom == null) { | 135 | if (reachableToBottom == null) { |
diff --git a/src/uk/ac/ox/cs/pagoda/multistage/FoldedApplication.java b/src/uk/ac/ox/cs/pagoda/multistage/FoldedApplication.java index 22f1d1d..c75083b 100644 --- a/src/uk/ac/ox/cs/pagoda/multistage/FoldedApplication.java +++ b/src/uk/ac/ox/cs/pagoda/multistage/FoldedApplication.java | |||
| @@ -1,14 +1,14 @@ | |||
| 1 | package uk.ac.ox.cs.pagoda.multistage; | 1 | package uk.ac.ox.cs.pagoda.multistage; |
| 2 | 2 | ||
| 3 | import java.util.Collection; | ||
| 4 | import java.util.LinkedList; | ||
| 5 | |||
| 6 | import org.semanticweb.HermiT.model.DLClause; | 3 | import org.semanticweb.HermiT.model.DLClause; |
| 7 | import uk.ac.ox.cs.pagoda.constraints.BottomStrategy; | 4 | import uk.ac.ox.cs.pagoda.constraints.BottomStrategy; |
| 8 | import uk.ac.ox.cs.pagoda.rules.OverApproxDisj; | ||
| 9 | import uk.ac.ox.cs.pagoda.rules.Program; | 5 | import uk.ac.ox.cs.pagoda.rules.Program; |
| 6 | import uk.ac.ox.cs.pagoda.rules.approximators.OverApproxDisj; | ||
| 10 | import uk.ac.ox.cs.pagoda.util.Timer; | 7 | import uk.ac.ox.cs.pagoda.util.Timer; |
| 11 | 8 | ||
| 9 | import java.util.Collection; | ||
| 10 | import java.util.LinkedList; | ||
| 11 | |||
| 12 | public class FoldedApplication extends MultiStageUpperProgram { | 12 | public class FoldedApplication extends MultiStageUpperProgram { |
| 13 | 13 | ||
| 14 | public FoldedApplication(Program program, BottomStrategy upperBottom) { | 14 | public FoldedApplication(Program program, BottomStrategy upperBottom) { |
diff --git a/src/uk/ac/ox/cs/pagoda/multistage/IndividualCollector.java b/src/uk/ac/ox/cs/pagoda/multistage/IndividualCollector.java index 3d78f0a..22d90c4 100644 --- a/src/uk/ac/ox/cs/pagoda/multistage/IndividualCollector.java +++ b/src/uk/ac/ox/cs/pagoda/multistage/IndividualCollector.java | |||
| @@ -1,20 +1,19 @@ | |||
| 1 | package uk.ac.ox.cs.pagoda.multistage; | 1 | package uk.ac.ox.cs.pagoda.multistage; |
| 2 | 2 | ||
| 3 | import java.util.Collection; | ||
| 4 | import java.util.HashSet; | ||
| 5 | import java.util.Set; | ||
| 6 | |||
| 7 | import org.openrdf.model.Resource; | 3 | import org.openrdf.model.Resource; |
| 8 | import org.openrdf.model.Statement; | 4 | import org.openrdf.model.Statement; |
| 9 | import org.openrdf.model.Value; | 5 | import org.openrdf.model.Value; |
| 10 | import org.openrdf.model.impl.URIImpl; | 6 | import org.openrdf.model.impl.URIImpl; |
| 11 | import org.openrdf.rio.RDFHandler; | 7 | import org.openrdf.rio.RDFHandler; |
| 12 | import org.openrdf.rio.RDFHandlerException; | 8 | import org.openrdf.rio.RDFHandlerException; |
| 13 | |||
| 14 | import uk.ac.ox.cs.JRDFox.model.Individual; | 9 | import uk.ac.ox.cs.JRDFox.model.Individual; |
| 15 | import uk.ac.ox.cs.pagoda.rules.OverApproxExist; | 10 | import uk.ac.ox.cs.pagoda.rules.approximators.OverApproxExist; |
| 16 | import uk.ac.ox.cs.pagoda.util.Namespace; | 11 | import uk.ac.ox.cs.pagoda.util.Namespace; |
| 17 | 12 | ||
| 13 | import java.util.Collection; | ||
| 14 | import java.util.HashSet; | ||
| 15 | import java.util.Set; | ||
| 16 | |||
| 18 | public class IndividualCollector implements RDFHandler { | 17 | public class IndividualCollector implements RDFHandler { |
| 19 | 18 | ||
| 20 | boolean addedSkolemised = false; | 19 | boolean addedSkolemised = false; |
| @@ -43,11 +42,11 @@ public class IndividualCollector implements RDFHandler { | |||
| 43 | public void handleStatement(Statement st) throws RDFHandlerException { | 42 | public void handleStatement(Statement st) throws RDFHandlerException { |
| 44 | Resource sub = st.getSubject(); | 43 | Resource sub = st.getSubject(); |
| 45 | if (sub instanceof URIImpl) | 44 | if (sub instanceof URIImpl) |
| 46 | individuals.add(Individual.create(((URIImpl) sub).toString())); | 45 | individuals.add(Individual.create(sub.toString())); |
| 47 | if (!st.getPredicate().toString().equals(Namespace.RDF_TYPE)) { | 46 | if (!st.getPredicate().toString().equals(Namespace.RDF_TYPE)) { |
| 48 | Value obj = st.getObject(); | 47 | Value obj = st.getObject(); |
| 49 | if (obj instanceof URIImpl) | 48 | if (obj instanceof URIImpl) |
| 50 | individuals.add(Individual.create(((URIImpl) sub).toString())); | 49 | individuals.add(Individual.create(sub.toString())); |
| 51 | } | 50 | } |
| 52 | } | 51 | } |
| 53 | 52 | ||
diff --git a/src/uk/ac/ox/cs/pagoda/multistage/LimitedSkolemisationApplication.java b/src/uk/ac/ox/cs/pagoda/multistage/LimitedSkolemisationApplication.java index 13752a3..f729158 100644 --- a/src/uk/ac/ox/cs/pagoda/multistage/LimitedSkolemisationApplication.java +++ b/src/uk/ac/ox/cs/pagoda/multistage/LimitedSkolemisationApplication.java | |||
| @@ -3,8 +3,8 @@ package uk.ac.ox.cs.pagoda.multistage; | |||
| 3 | 3 | ||
| 4 | import uk.ac.ox.cs.pagoda.constraints.BottomStrategy; | 4 | import uk.ac.ox.cs.pagoda.constraints.BottomStrategy; |
| 5 | import uk.ac.ox.cs.pagoda.rules.ExistConstantApproximator; | 5 | import uk.ac.ox.cs.pagoda.rules.ExistConstantApproximator; |
| 6 | import uk.ac.ox.cs.pagoda.rules.LimitedSkolemisationApproximator; | ||
| 7 | import uk.ac.ox.cs.pagoda.rules.Program; | 6 | import uk.ac.ox.cs.pagoda.rules.Program; |
| 7 | import uk.ac.ox.cs.pagoda.rules.approximators.LimitedSkolemisationApproximator; | ||
| 8 | 8 | ||
| 9 | public class LimitedSkolemisationApplication extends RestrictedApplication { | 9 | public class LimitedSkolemisationApplication extends RestrictedApplication { |
| 10 | 10 | ||
diff --git a/src/uk/ac/ox/cs/pagoda/multistage/MultiStageUpperProgram.java b/src/uk/ac/ox/cs/pagoda/multistage/MultiStageUpperProgram.java index acaf167..33ba345 100644 --- a/src/uk/ac/ox/cs/pagoda/multistage/MultiStageUpperProgram.java +++ b/src/uk/ac/ox/cs/pagoda/multistage/MultiStageUpperProgram.java | |||
| @@ -8,9 +8,9 @@ import uk.ac.ox.cs.pagoda.constraints.BottomStrategy; | |||
| 8 | import uk.ac.ox.cs.pagoda.hermit.RuleHelper; | 8 | import uk.ac.ox.cs.pagoda.hermit.RuleHelper; |
| 9 | import uk.ac.ox.cs.pagoda.reasoner.light.RDFoxTripleManager; | 9 | import uk.ac.ox.cs.pagoda.reasoner.light.RDFoxTripleManager; |
| 10 | import uk.ac.ox.cs.pagoda.rules.ExistConstantApproximator; | 10 | import uk.ac.ox.cs.pagoda.rules.ExistConstantApproximator; |
| 11 | import uk.ac.ox.cs.pagoda.rules.OverApproxExist; | ||
| 12 | import uk.ac.ox.cs.pagoda.rules.Program; | 11 | import uk.ac.ox.cs.pagoda.rules.Program; |
| 13 | import uk.ac.ox.cs.pagoda.rules.TupleDependentApproximator; | 12 | import uk.ac.ox.cs.pagoda.rules.approximators.OverApproxExist; |
| 13 | import uk.ac.ox.cs.pagoda.rules.approximators.TupleDependentApproximator; | ||
| 14 | import uk.ac.ox.cs.pagoda.util.Namespace; | 14 | import uk.ac.ox.cs.pagoda.util.Namespace; |
| 15 | import uk.ac.ox.cs.pagoda.util.SparqlHelper; | 15 | import uk.ac.ox.cs.pagoda.util.SparqlHelper; |
| 16 | import uk.ac.ox.cs.pagoda.util.Timer; | 16 | import uk.ac.ox.cs.pagoda.util.Timer; |
diff --git a/src/uk/ac/ox/cs/pagoda/multistage/Normalisation.java b/src/uk/ac/ox/cs/pagoda/multistage/Normalisation.java index 4667747..b31d138 100644 --- a/src/uk/ac/ox/cs/pagoda/multistage/Normalisation.java +++ b/src/uk/ac/ox/cs/pagoda/multistage/Normalisation.java | |||
| @@ -1,82 +1,92 @@ | |||
| 1 | package uk.ac.ox.cs.pagoda.multistage; | 1 | package uk.ac.ox.cs.pagoda.multistage; |
| 2 | 2 | ||
| 3 | import java.util.Collection; | 3 | import org.semanticweb.HermiT.model.*; |
| 4 | import java.util.HashMap; | 4 | import org.semanticweb.owlapi.model.*; |
| 5 | import java.util.HashSet; | ||
| 6 | import java.util.Iterator; | ||
| 7 | import java.util.LinkedList; | ||
| 8 | import java.util.Map; | ||
| 9 | import java.util.Set; | ||
| 10 | |||
| 11 | import org.semanticweb.HermiT.model.AtLeast; | ||
| 12 | import org.semanticweb.HermiT.model.AtLeastConcept; | ||
| 13 | import org.semanticweb.HermiT.model.AtLeastDataRange; | ||
| 14 | import org.semanticweb.HermiT.model.Atom; | ||
| 15 | import org.semanticweb.HermiT.model.AtomicConcept; | ||
| 16 | import org.semanticweb.HermiT.model.AtomicNegationConcept; | ||
| 17 | import org.semanticweb.HermiT.model.AtomicRole; | ||
| 18 | import org.semanticweb.HermiT.model.Constant; | ||
| 19 | import org.semanticweb.HermiT.model.ConstantEnumeration; | ||
| 20 | import org.semanticweb.HermiT.model.DLClause; | ||
| 21 | import org.semanticweb.HermiT.model.Individual; | ||
| 22 | import org.semanticweb.HermiT.model.Inequality; | ||
| 23 | import org.semanticweb.HermiT.model.InverseRole; | ||
| 24 | import org.semanticweb.HermiT.model.LiteralConcept; | ||
| 25 | import org.semanticweb.HermiT.model.Role; | ||
| 26 | import org.semanticweb.HermiT.model.Variable; | ||
| 27 | import org.semanticweb.owlapi.model.OWLClass; | ||
| 28 | import org.semanticweb.owlapi.model.OWLClassExpression; | ||
| 29 | import org.semanticweb.owlapi.model.OWLDataHasValue; | ||
| 30 | import org.semanticweb.owlapi.model.OWLDataProperty; | ||
| 31 | import org.semanticweb.owlapi.model.OWLDataPropertyExpression; | ||
| 32 | import org.semanticweb.owlapi.model.OWLLiteral; | ||
| 33 | import org.semanticweb.owlapi.model.OWLObjectHasSelf; | ||
| 34 | import org.semanticweb.owlapi.model.OWLObjectInverseOf; | ||
| 35 | import org.semanticweb.owlapi.model.OWLObjectMinCardinality; | ||
| 36 | import org.semanticweb.owlapi.model.OWLObjectProperty; | ||
| 37 | import org.semanticweb.owlapi.model.OWLObjectPropertyExpression; | ||
| 38 | import org.semanticweb.owlapi.model.OWLObjectSomeValuesFrom; | ||
| 39 | import org.semanticweb.owlapi.model.OWLOntology; | ||
| 40 | |||
| 41 | import uk.ac.ox.cs.pagoda.MyPrefixes; | 5 | import uk.ac.ox.cs.pagoda.MyPrefixes; |
| 42 | import uk.ac.ox.cs.pagoda.approx.Clause; | 6 | import uk.ac.ox.cs.pagoda.approx.Clause; |
| 43 | import uk.ac.ox.cs.pagoda.approx.Clausifier; | 7 | import uk.ac.ox.cs.pagoda.approx.Clausifier; |
| 44 | import uk.ac.ox.cs.pagoda.constraints.BottomStrategy; | 8 | import uk.ac.ox.cs.pagoda.constraints.BottomStrategy; |
| 45 | import uk.ac.ox.cs.pagoda.rules.OverApproxExist; | 9 | import uk.ac.ox.cs.pagoda.rules.approximators.OverApproxExist; |
| 46 | import uk.ac.ox.cs.pagoda.util.Namespace; | 10 | import uk.ac.ox.cs.pagoda.util.Namespace; |
| 47 | import uk.ac.ox.cs.pagoda.util.Utility; | 11 | import uk.ac.ox.cs.pagoda.util.Utility; |
| 48 | 12 | ||
| 13 | import java.util.*; | ||
| 14 | |||
| 49 | public class Normalisation { | 15 | public class Normalisation { |
| 50 | 16 | ||
| 51 | // MultiStageUpperProgram m_program; | 17 | public static final String auxiliaryConceptPrefix = Namespace.PAGODA_AUX + "concept_"; |
| 18 | private static final Variable X = Variable.create("X"), Y = Variable.create("Y"); | ||
| 19 | // MultiStageUpperProgram m_program; | ||
| 52 | OWLOntology m_ontology; | 20 | OWLOntology m_ontology; |
| 53 | BottomStrategy m_botStrategy; | 21 | BottomStrategy m_botStrategy; |
| 54 | Collection<DLClause> m_rules; | 22 | Collection<DLClause> m_rules; |
| 55 | Set<DLClause> m_normClauses = new HashSet<DLClause>(); | 23 | Set<DLClause> m_normClauses = new HashSet<DLClause>(); |
| 56 | Map<DLClause, DLClause> exist2original = new HashMap<DLClause, DLClause>(); | 24 | Map<DLClause, DLClause> exist2original = new HashMap<DLClause, DLClause>(); |
| 57 | 25 | Map<String, AtLeastConcept> rightAuxiliaryConcept = new HashMap<String, AtLeastConcept>(); | |
| 26 | private Map<AtLeastConcept, AtomicConcept> leftAuxiliaryConcept = new HashMap<AtLeastConcept, AtomicConcept>(); | ||
| 27 | private Map<AtomicConcept, AtLeastConcept> leftAuxiliaryConcept_inv = new HashMap<AtomicConcept, AtLeastConcept>(); | ||
| 28 | |||
| 29 | public Normalisation(Collection<DLClause> rules, OWLOntology ontology, BottomStrategy botStrategy) { | ||
| 30 | // m_program = program; | ||
| 31 | m_ontology = ontology; | ||
| 32 | m_rules = rules; | ||
| 33 | m_botStrategy = botStrategy; | ||
| 34 | } | ||
| 35 | |||
| 36 | public static AtLeastConcept toAtLeastConcept(AtLeast p) { | ||
| 37 | if (p instanceof AtLeastConcept) return (AtLeastConcept) p; | ||
| 38 | AtLeastDataRange aldr = (AtLeastDataRange) p; | ||
| 39 | return AtLeastConcept.create(aldr.getNumber(), aldr.getOnRole(), AtomicConcept.create(MyPrefixes.PAGOdAPrefixes.expandIRI(aldr.getToDataRange().toString()))); | ||
| 40 | } | ||
| 41 | |||
| 42 | private static String getName(String iri) { | ||
| 43 | int index = iri.lastIndexOf("#"); | ||
| 44 | if (index != -1) return iri.substring(index + 1); | ||
| 45 | index = iri.lastIndexOf("/"); | ||
| 46 | if (index != -1) return iri.substring(index + 1); | ||
| 47 | return iri; | ||
| 48 | } | ||
| 49 | |||
| 50 | public static String getAuxiliaryConcept4Disjunct(AtLeastConcept alc, Individual... individuals) { | ||
| 51 | Role r = alc.getOnRole(); | ||
| 52 | LiteralConcept c = alc.getToConcept(); | ||
| 53 | StringBuilder builder = new StringBuilder(auxiliaryConceptPrefix); | ||
| 54 | if (r instanceof AtomicRole) | ||
| 55 | builder.append(getName(((AtomicRole) r).getIRI())); | ||
| 56 | else | ||
| 57 | builder.append(getName(((InverseRole) r).getInverseOf().getIRI())).append("_inv"); | ||
| 58 | |||
| 59 | if (alc.getNumber() > 1) | ||
| 60 | builder.append("_").append(alc.getNumber()); | ||
| 61 | |||
| 62 | if (c instanceof AtomicConcept) { | ||
| 63 | if (!c.equals(AtomicConcept.THING)) | ||
| 64 | builder.append("_").append(getName(((AtomicConcept) c).getIRI())); | ||
| 65 | } else | ||
| 66 | builder.append("_").append(getName((OverApproxExist.getNegationConcept(((AtomicNegationConcept) c).getNegatedAtomicConcept()).getIRI()))); | ||
| 67 | |||
| 68 | if (individuals.length > 1) | ||
| 69 | builder.append("_").append(getName(individuals[0].getIRI())); | ||
| 70 | |||
| 71 | builder.append("_exist"); | ||
| 72 | |||
| 73 | return builder.toString(); | ||
| 74 | } | ||
| 75 | |||
| 58 | public Set<DLClause> getNormlisedClauses() { | 76 | public Set<DLClause> getNormlisedClauses() { |
| 59 | return m_normClauses; | 77 | return m_normClauses; |
| 60 | } | 78 | } |
| 61 | 79 | ||
| 62 | public Normalisation(Collection<DLClause> rules, OWLOntology ontology, BottomStrategy botStrategy) { | ||
| 63 | // m_program = program; | ||
| 64 | m_ontology = ontology; | ||
| 65 | m_rules = rules; | ||
| 66 | m_botStrategy = botStrategy; | ||
| 67 | } | ||
| 68 | |||
| 69 | public void process() { | 80 | public void process() { |
| 70 | for (DLClause clause: m_rules) | 81 | for (DLClause clause : m_rules) |
| 71 | if (m_botStrategy.isBottomRule(clause)) | 82 | if (m_botStrategy.isBottomRule(clause)) |
| 72 | processBottomRule(clause); | 83 | processBottomRule(clause); |
| 73 | else if (clause.getHeadLength() == 1) { | 84 | else if (clause.getHeadLength() == 1) { |
| 74 | if (clause.getHeadAtom(0).getDLPredicate() instanceof AtLeast) | 85 | if (clause.getHeadAtom(0).getDLPredicate() instanceof AtLeast) |
| 75 | processExistentialRule(clause); | 86 | processExistentialRule(clause); |
| 76 | else | 87 | else |
| 77 | m_normClauses.add(clause); | 88 | m_normClauses.add(clause); |
| 78 | } | 89 | } else |
| 79 | else | ||
| 80 | processDisjunctiveRule(clause); | 90 | processDisjunctiveRule(clause); |
| 81 | } | 91 | } |
| 82 | 92 | ||
| @@ -85,75 +95,68 @@ public class Normalisation { | |||
| 85 | m_normClauses.add(clause); | 95 | m_normClauses.add(clause); |
| 86 | return ; | 96 | return ; |
| 87 | } | 97 | } |
| 88 | 98 | ||
| 89 | Atom headAtom = clause.getHeadAtom(0); | 99 | Atom headAtom = clause.getHeadAtom(0); |
| 90 | if (headAtom.getDLPredicate() instanceof AtLeastDataRange) { | 100 | if (headAtom.getDLPredicate() instanceof AtLeastDataRange) { |
| 91 | m_normClauses.add(clause); | 101 | m_normClauses.add(clause); |
| 92 | return ; | 102 | return ; |
| 93 | } | 103 | } |
| 94 | AtLeastConcept alc = (AtLeastConcept) headAtom.getDLPredicate(); | 104 | AtLeastConcept alc = (AtLeastConcept) headAtom.getDLPredicate(); |
| 95 | AtomicConcept ac = getRightAuxiliaryConcept(alc, OverApproxExist.getNewIndividual(clause, 0)); | 105 | AtomicConcept ac = getRightAuxiliaryConcept(alc, OverApproxExist.getNewIndividual(clause, 0)); |
| 96 | DLClause newClause; | 106 | DLClause newClause; |
| 97 | m_normClauses.add(DLClause.create(new Atom[] {Atom.create(ac, headAtom.getArgument(0)) }, clause.getBodyAtoms())); | 107 | m_normClauses.add(DLClause.create(new Atom[] {Atom.create(ac, headAtom.getArgument(0)) }, clause.getBodyAtoms())); |
| 98 | m_normClauses.add(newClause = DLClause.create(new Atom[] {Atom.create(alc, X)}, new Atom[] {Atom.create(ac, X)})); | 108 | m_normClauses.add(newClause = DLClause.create(new Atom[] {Atom.create(alc, X)}, new Atom[] {Atom.create(ac, X)})); |
| 99 | exist2original.put(newClause, clause); | 109 | exist2original.put(newClause, clause); |
| 100 | } | ||
| 101 | |||
| 102 | public static AtLeastConcept toAtLeastConcept(AtLeast p) { | ||
| 103 | if (p instanceof AtLeastConcept) return (AtLeastConcept) p; | ||
| 104 | AtLeastDataRange aldr = (AtLeastDataRange) p; | ||
| 105 | return AtLeastConcept.create(aldr.getNumber(), aldr.getOnRole(), AtomicConcept.create(MyPrefixes.PAGOdAPrefixes.expandIRI(aldr.getToDataRange().toString()))); | ||
| 106 | } | 110 | } |
| 107 | 111 | ||
| 108 | private void processDisjunctiveRule(DLClause clause) { | 112 | private void processDisjunctiveRule(DLClause clause) { |
| 109 | boolean toNormalise = false; | 113 | boolean toNormalise = false; |
| 110 | for (Atom atom: clause.getHeadAtoms()) | 114 | for (Atom atom: clause.getHeadAtoms()) |
| 111 | if (!(atom.getDLPredicate() instanceof AtomicConcept)) { | 115 | if (!(atom.getDLPredicate() instanceof AtomicConcept)) { |
| 112 | toNormalise = true; | 116 | toNormalise = true; |
| 113 | break; | 117 | break; |
| 114 | } | 118 | } |
| 115 | 119 | ||
| 116 | if (!toNormalise) { | 120 | if (!toNormalise) { |
| 117 | m_normClauses.add(clause); | 121 | m_normClauses.add(clause); |
| 118 | return ; | 122 | return; |
| 119 | } | 123 | } |
| 120 | 124 | ||
| 121 | Atom[] newHeadAtoms = new Atom[clause.getHeadLength()]; | 125 | Atom[] newHeadAtoms = new Atom[clause.getHeadLength()]; |
| 122 | Set<Atom> additionalAtoms = new HashSet<Atom>(); | 126 | Set<Atom> additionalAtoms = new HashSet<Atom>(); |
| 123 | int index = 0; | 127 | int index = 0; |
| 124 | DLClause newClause; | 128 | DLClause newClause; |
| 125 | for (Atom headAtom: clause.getHeadAtoms()) { | 129 | for (Atom headAtom: clause.getHeadAtoms()) { |
| 126 | if (headAtom.getDLPredicate() instanceof AtLeast) { | 130 | if (headAtom.getDLPredicate() instanceof AtLeast) { |
| 127 | AtLeast al = (AtLeast) headAtom.getDLPredicate(); | 131 | AtLeast al = (AtLeast) headAtom.getDLPredicate(); |
| 128 | if (al instanceof AtLeastDataRange && ((AtLeastDataRange) al).getToDataRange() instanceof ConstantEnumeration) { | 132 | if (al instanceof AtLeastDataRange && ((AtLeastDataRange) al).getToDataRange() instanceof ConstantEnumeration) { |
| 129 | ConstantEnumeration ldr = (ConstantEnumeration) ((AtLeastDataRange) al).getToDataRange(); | 133 | ConstantEnumeration ldr = (ConstantEnumeration) ((AtLeastDataRange) al).getToDataRange(); |
| 130 | newHeadAtoms[index] = null; | 134 | newHeadAtoms[index] = null; |
| 131 | Atom newHeadAtom; | 135 | Atom newHeadAtom; |
| 132 | for (int i = 0; i < ldr.getNumberOfConstants(); ++i) { | 136 | for (int i = 0; i < ldr.getNumberOfConstants(); ++i) { |
| 133 | newHeadAtom = Atom.create(AtomicRole.create(((AtomicRole) ((AtLeastDataRange) al).getOnRole()).getIRI()), headAtom.getArgument(0), ldr.getConstant(i)); | 137 | newHeadAtom = Atom.create(AtomicRole.create(((AtomicRole) al.getOnRole()).getIRI()), headAtom.getArgument(0), ldr.getConstant(i)); |
| 134 | if (newHeadAtoms[index] == null) newHeadAtoms[index] = newHeadAtom; | 138 | if (newHeadAtoms[index] == null) newHeadAtoms[index] = newHeadAtom; |
| 135 | else additionalAtoms.add(newHeadAtom); | 139 | else additionalAtoms.add(newHeadAtom); |
| 136 | } | 140 | } |
| 137 | } else { | 141 | } else { |
| 138 | AtLeastConcept alc = toAtLeastConcept((AtLeast) headAtom.getDLPredicate()); | 142 | AtLeastConcept alc = toAtLeastConcept((AtLeast) headAtom.getDLPredicate()); |
| 139 | AtomicConcept ac = getRightAuxiliaryConcept(alc, OverApproxExist.getNewIndividual(clause, 0)); | 143 | AtomicConcept ac = getRightAuxiliaryConcept(alc, OverApproxExist.getNewIndividual(clause, 0)); |
| 140 | newHeadAtoms[index] = Atom.create(ac, headAtom.getArgument(0)); | 144 | newHeadAtoms[index] = Atom.create(ac, headAtom.getArgument(0)); |
| 141 | m_normClauses.add(newClause = DLClause.create(new Atom[] {Atom.create(alc, headAtom.getArgument(0))}, new Atom[] {newHeadAtoms[index]})); | 145 | m_normClauses.add(newClause = DLClause.create(new Atom[] {Atom.create(alc, headAtom.getArgument(0))}, new Atom[] {newHeadAtoms[index]})); |
| 142 | exist2original.put(newClause, clause); | 146 | exist2original.put(newClause, clause); |
| 143 | } | 147 | } |
| 144 | } | 148 | } else |
| 145 | else | ||
| 146 | newHeadAtoms[index] = headAtom; | 149 | newHeadAtoms[index] = headAtom; |
| 147 | ++index; | 150 | ++index; |
| 148 | } | 151 | } |
| 149 | 152 | ||
| 150 | if (!additionalAtoms.isEmpty()) { | 153 | if (!additionalAtoms.isEmpty()) { |
| 151 | Atom[] tempHeadAtoms = newHeadAtoms; | 154 | Atom[] tempHeadAtoms = newHeadAtoms; |
| 152 | newHeadAtoms = new Atom[newHeadAtoms.length + additionalAtoms.size()]; | 155 | newHeadAtoms = new Atom[newHeadAtoms.length + additionalAtoms.size()]; |
| 153 | for (int i = 0; i < tempHeadAtoms.length; ++i) | 156 | for (int i = 0; i < tempHeadAtoms.length; ++i) |
| 154 | newHeadAtoms[i] = tempHeadAtoms[i]; | 157 | newHeadAtoms[i] = tempHeadAtoms[i]; |
| 155 | int tempI = tempHeadAtoms.length; | 158 | int tempI = tempHeadAtoms.length; |
| 156 | for (Iterator<Atom> iter = additionalAtoms.iterator(); iter.hasNext(); ) | 159 | for (Iterator<Atom> iter = additionalAtoms.iterator(); iter.hasNext(); ) |
| 157 | newHeadAtoms[tempI++] = iter.next(); | 160 | newHeadAtoms[tempI++] = iter.next(); |
| 158 | additionalAtoms.clear(); | 161 | additionalAtoms.clear(); |
| 159 | } | 162 | } |
| @@ -169,202 +172,157 @@ public class Normalisation { | |||
| 169 | return ; | 172 | return ; |
| 170 | } | 173 | } |
| 171 | } | 174 | } |
| 172 | 175 | ||
| 173 | boolean toNormalise = false; | 176 | boolean toNormalise = false; |
| 174 | for (Atom atom: clause.getBodyAtoms()) | 177 | for (Atom atom: clause.getBodyAtoms()) |
| 175 | if (!(atom.getDLPredicate() instanceof AtomicConcept)) | 178 | if (!(atom.getDLPredicate() instanceof AtomicConcept)) |
| 176 | toNormalise = true; | 179 | toNormalise = true; |
| 177 | 180 | ||
| 178 | if (!toNormalise) { | 181 | if (!toNormalise) { |
| 179 | m_normClauses.add(clause); | 182 | m_normClauses.add(clause); |
| 180 | return ; | 183 | return; |
| 181 | } | 184 | } |
| 182 | 185 | ||
| 183 | Clause myClause = null; | 186 | Clause myClause = null; |
| 184 | try { | 187 | try { |
| 185 | myClause = new Clause(Clausifier.getInstance(m_ontology), clause); | 188 | myClause = new Clause(Clausifier.getInstance(m_ontology), clause); |
| 186 | } catch (Exception e) { | 189 | } catch (Exception e) { |
| 187 | Utility.logError("The clause: " + clause + " cannot be rolled up into GCI."); | 190 | Utility.logError("The clause: " + clause + " cannot be rolled up into GCI."); |
| 188 | m_normClauses.add(clause); | 191 | m_normClauses.add(clause); |
| 189 | return ; | 192 | return; |
| 190 | } | 193 | } |
| 191 | 194 | ||
| 192 | Atom[] newBodyAtoms = new Atom [myClause.getSubClasses().size()]; | 195 | Atom[] newBodyAtoms = new Atom [myClause.getSubClasses().size()]; |
| 193 | int index = 0; | 196 | int index = 0; |
| 194 | for (OWLClassExpression clsExp: myClause.getSubClasses()) { | 197 | for (OWLClassExpression clsExp: myClause.getSubClasses()) { |
| 195 | if (clsExp instanceof OWLClass) | 198 | if (clsExp instanceof OWLClass) |
| 196 | newBodyAtoms[index] = Atom.create(AtomicConcept.create(((OWLClass) clsExp).getIRI().toString()), X); | 199 | newBodyAtoms[index] = Atom.create(AtomicConcept.create(((OWLClass) clsExp).getIRI().toString()), X); |
| 197 | else if (clsExp instanceof OWLObjectSomeValuesFrom || clsExp instanceof OWLObjectMinCardinality) { | 200 | else if (clsExp instanceof OWLObjectSomeValuesFrom || clsExp instanceof OWLObjectMinCardinality) { |
| 198 | int number; | 201 | int number; |
| 199 | OWLObjectPropertyExpression prop; | 202 | OWLObjectPropertyExpression prop; |
| 200 | OWLClassExpression filler; | 203 | OWLClassExpression filler; |
| 201 | if (clsExp instanceof OWLObjectSomeValuesFrom) { | 204 | if (clsExp instanceof OWLObjectSomeValuesFrom) { |
| 202 | OWLObjectSomeValuesFrom owl = (OWLObjectSomeValuesFrom) clsExp; | 205 | OWLObjectSomeValuesFrom owl = (OWLObjectSomeValuesFrom) clsExp; |
| 203 | number = 1; | 206 | number = 1; |
| 204 | prop = owl.getProperty(); | 207 | prop = owl.getProperty(); |
| 205 | filler = owl.getFiller(); | 208 | filler = owl.getFiller(); |
| 206 | } | 209 | } |
| 207 | else { | 210 | else { |
| 208 | OWLObjectMinCardinality owl = (OWLObjectMinCardinality) clsExp; | 211 | OWLObjectMinCardinality owl = (OWLObjectMinCardinality) clsExp; |
| 209 | number = owl.getCardinality(); | 212 | number = owl.getCardinality(); |
| 210 | prop = owl.getProperty(); | 213 | prop = owl.getProperty(); |
| 211 | filler = owl.getFiller(); | 214 | filler = owl.getFiller(); |
| 212 | } | 215 | } |
| 213 | 216 | ||
| 214 | Role r = null; | 217 | Role r = null; |
| 215 | if (prop instanceof OWLObjectProperty) | 218 | if (prop instanceof OWLObjectProperty) |
| 216 | r = AtomicRole.create(((OWLObjectProperty) prop).getIRI().toString()); | 219 | r = AtomicRole.create(((OWLObjectProperty) prop).getIRI().toString()); |
| 217 | else | 220 | else |
| 218 | r = InverseRole.create(AtomicRole.create(((OWLObjectProperty) (((OWLObjectInverseOf) prop).getInverse())).getIRI().toString())); | 221 | r = InverseRole.create(AtomicRole.create(((OWLObjectProperty) (((OWLObjectInverseOf) prop).getInverse())).getIRI().toString())); |
| 219 | 222 | ||
| 220 | LiteralConcept c = AtomicConcept.create(((OWLClass) filler).getIRI().toString()); | 223 | LiteralConcept c = AtomicConcept.create(((OWLClass) filler).getIRI().toString()); |
| 221 | AtomicConcept ac = getLeftAuxiliaryConcept(AtLeastConcept.create(number, r, c), false); | 224 | AtomicConcept ac = getLeftAuxiliaryConcept(AtLeastConcept.create(number, r, c), false); |
| 222 | 225 | ||
| 223 | m_normClauses.add(exists_r_C_implies_A(number, r, c, ac)); | 226 | m_normClauses.add(exists_r_C_implies_A(number, r, c, ac)); |
| 224 | newBodyAtoms[index] = Atom.create(ac, X); | 227 | newBodyAtoms[index] = Atom.create(ac, X); |
| 225 | } | 228 | } |
| 226 | // else if (clsExp instanceof OWLDataSomeValuesFrom || clsExp instanceof OWLDataMinCardinality) { | 229 | // else if (clsExp instanceof OWLDataSomeValuesFrom || clsExp instanceof OWLDataMinCardinality) { |
| 227 | // int number; | 230 | // int number; |
| 228 | // OWLDataPropertyExpression prop; | 231 | // OWLDataPropertyExpression prop; |
| 229 | // OWLDataRange filler; | 232 | // OWLDataRange filler; |
| 230 | // if (clsExp instanceof OWLDataSomeValuesFrom) { | 233 | // if (clsExp instanceof OWLDataSomeValuesFrom) { |
| 231 | // OWLDataSomeValuesFrom owl = (OWLDataSomeValuesFrom) clsExp; | 234 | // OWLDataSomeValuesFrom owl = (OWLDataSomeValuesFrom) clsExp; |
| 232 | // number = 1; | 235 | // number = 1; |
| 233 | // prop = owl.getProperty(); | 236 | // prop = owl.getProperty(); |
| 234 | // filler = owl.getFiller(); | 237 | // filler = owl.getFiller(); |
| 235 | // } | 238 | // } |
| 236 | // else { | 239 | // else { |
| 237 | // OWLDataMinCardinality owl = (OWLDataMinCardinality) clsExp; | 240 | // OWLDataMinCardinality owl = (OWLDataMinCardinality) clsExp; |
| 238 | // number = owl.getCardinality(); | 241 | // number = owl.getCardinality(); |
| 239 | // prop = owl.getProperty(); | 242 | // prop = owl.getProperty(); |
| 240 | // filler = owl.getFiller(); | 243 | // filler = owl.getFiller(); |
| 241 | // } | 244 | // } |
| 242 | // | 245 | // |
| 243 | // Role r = AtomicRole.create(((OWLDataProperty) prop).getIRI().toString()); | 246 | // Role r = AtomicRole.create(((OWLDataProperty) prop).getIRI().toString()); |
| 244 | // | 247 | // |
| 245 | // LiteralConcept c = AtomicConcept.create(((OWLClass) filler).getIRI().toString()); | 248 | // LiteralConcept c = AtomicConcept.create(((OWLClass) filler).getIRI().toString()); |
| 246 | // AtomicConcept ac = getLeftAuxiliaryConcept(AtLeastConcept.create(number, r, c), false); | 249 | // AtomicConcept ac = getLeftAuxiliaryConcept(AtLeastConcept.create(number, r, c), false); |
| 247 | // | 250 | // |
| 248 | // m_normClauses.add(exists_r_C_implies_A(number, r, c, ac)); | 251 | // m_normClauses.add(exists_r_C_implies_A(number, r, c, ac)); |
| 249 | // newBodyAtoms[index] = Atom.create(ac, X); | 252 | // newBodyAtoms[index] = Atom.create(ac, X); |
| 250 | // } | 253 | // } |
| 251 | else if (clsExp instanceof OWLObjectHasSelf) { | 254 | else if (clsExp instanceof OWLObjectHasSelf) { |
| 252 | OWLObjectPropertyExpression prop = ((OWLObjectHasSelf) clsExp).getProperty(); | 255 | OWLObjectPropertyExpression prop = ((OWLObjectHasSelf) clsExp).getProperty(); |
| 253 | AtomicRole r; | 256 | AtomicRole r; |
| 254 | if (prop instanceof OWLObjectProperty) | 257 | if (prop instanceof OWLObjectProperty) |
| 255 | r = AtomicRole.create(((OWLObjectProperty) prop).getIRI().toString()); | 258 | r = AtomicRole.create(((OWLObjectProperty) prop).getIRI().toString()); |
| 256 | else | 259 | else |
| 257 | r = AtomicRole.create(((OWLObjectProperty) (((OWLObjectInverseOf) prop).getInverse())).getIRI().toString()); | 260 | r = AtomicRole.create(((OWLObjectProperty) (((OWLObjectInverseOf) prop).getInverse())).getIRI().toString()); |
| 258 | newBodyAtoms[index] = Atom.create(r, X, X); | 261 | newBodyAtoms[index] = Atom.create(r, X, X); |
| 259 | } | 262 | } |
| 260 | else if (clsExp instanceof OWLDataHasValue) { | 263 | else if (clsExp instanceof OWLDataHasValue) { |
| 261 | OWLDataPropertyExpression prop = ((OWLDataHasValue) clsExp).getProperty(); | 264 | OWLDataPropertyExpression prop = ((OWLDataHasValue) clsExp).getProperty(); |
| 262 | AtomicRole r = AtomicRole.create(((OWLDataProperty) prop).getIRI().toString()); | 265 | AtomicRole r = AtomicRole.create(((OWLDataProperty) prop).getIRI().toString()); |
| 263 | OWLLiteral l = ((OWLDataHasValue) clsExp).getValue(); | 266 | OWLLiteral l = ((OWLDataHasValue) clsExp).getValue(); |
| 264 | if (l.getDatatype().toStringID().equals(Namespace.RDF_PLAIN_LITERAL)) | 267 | if (l.getDatatype().toStringID().equals(Namespace.RDF_PLAIN_LITERAL)) |
| 265 | newBodyAtoms[index] = Atom.create(r, X, Constant.create(l.getLiteral() + "@" + l.getLang(), Namespace.RDF_PLAIN_LITERAL)); | 268 | newBodyAtoms[index] = Atom.create(r, X, Constant.create(l.getLiteral() + "@" + l.getLang(), Namespace.RDF_PLAIN_LITERAL)); |
| 266 | else | 269 | else |
| 267 | newBodyAtoms[index] = Atom.create(r, X, Constant.create(l.getLiteral(), l.getDatatype().toStringID())); | 270 | newBodyAtoms[index] = Atom.create(r, X, Constant.create(l.getLiteral(), l.getDatatype().toStringID())); |
| 268 | } | 271 | } else { |
| 269 | else { | ||
| 270 | newBodyAtoms[index] = null; | 272 | newBodyAtoms[index] = null; |
| 271 | Utility.logError("counld not translate OWLClassExpression: " + clsExp + " in " + clause); | 273 | Utility.logError("counld not translate OWLClassExpression: " + clsExp + " in " + clause); |
| 272 | } | 274 | } |
| 273 | ++index; | 275 | ++index; |
| 274 | } | 276 | } |
| 275 | 277 | ||
| 276 | m_normClauses.add(DLClause.create(clause.getHeadAtoms(), newBodyAtoms)); | 278 | m_normClauses.add(DLClause.create(clause.getHeadAtoms(), newBodyAtoms)); |
| 277 | } | 279 | } |
| 278 | 280 | ||
| 279 | private static final Variable X = Variable.create("X"), Y = Variable.create("Y"); | ||
| 280 | |||
| 281 | private DLClause exists_r_C_implies_A(int n, Role r, LiteralConcept c, AtomicConcept a) { | 281 | private DLClause exists_r_C_implies_A(int n, Role r, LiteralConcept c, AtomicConcept a) { |
| 282 | Variable[] Ys = new Variable[n]; | 282 | Variable[] Ys = new Variable[n]; |
| 283 | if (n == 1) Ys[0] = Y; | 283 | if (n == 1) Ys[0] = Y; |
| 284 | else | 284 | else |
| 285 | for (int i = 0; i < n; ++i) | 285 | for (int i = 0; i < n; ++i) |
| 286 | Ys[i] = Variable.create("Y" + (i + 1)); | 286 | Ys[i] = Variable.create("Y" + (i + 1)); |
| 287 | Collection<Atom> bodyAtoms = new LinkedList<Atom>(); | 287 | Collection<Atom> bodyAtoms = new LinkedList<Atom>(); |
| 288 | 288 | ||
| 289 | for (int i = 0; i < n; ++i) { | 289 | for (int i = 0; i < n; ++i) { |
| 290 | Atom rxy = r instanceof AtomicRole ? | 290 | Atom rxy = r instanceof AtomicRole ? |
| 291 | Atom.create(((AtomicRole) r), X, Ys[i]) : | 291 | Atom.create(((AtomicRole) r), X, Ys[i]) : |
| 292 | Atom.create(((InverseRole) r).getInverseOf(), Ys[i], X); | 292 | Atom.create(((InverseRole) r).getInverseOf(), Ys[i], X); |
| 293 | bodyAtoms.add(rxy); | 293 | bodyAtoms.add(rxy); |
| 294 | if (!c.equals(AtomicConcept.THING)) | 294 | if (!c.equals(AtomicConcept.THING)) |
| 295 | bodyAtoms.add(Atom.create((AtomicConcept) c, Ys[i])); | 295 | bodyAtoms.add(Atom.create((AtomicConcept) c, Ys[i])); |
| 296 | } | 296 | } |
| 297 | 297 | ||
| 298 | for (int i = 0; i < n; ++i) | 298 | for (int i = 0; i < n; ++i) |
| 299 | for (int j = i + 1; j < n; ++j) | 299 | for (int j = i + 1; j < n; ++j) |
| 300 | bodyAtoms.add(Atom.create(Inequality.INSTANCE, Ys[i], Ys[j])); | 300 | bodyAtoms.add(Atom.create(Inequality.INSTANCE, Ys[i], Ys[j])); |
| 301 | |||
| 302 | return DLClause.create(new Atom[] {Atom.create(a, X)}, bodyAtoms.toArray(new Atom[0])); | ||
| 303 | } | ||
| 304 | |||
| 305 | private Map<AtLeastConcept, AtomicConcept> leftAuxiliaryConcept = new HashMap<AtLeastConcept, AtomicConcept>(); | ||
| 306 | private Map<AtomicConcept, AtLeastConcept> leftAuxiliaryConcept_inv = new HashMap<AtomicConcept, AtLeastConcept>(); | ||
| 307 | |||
| 308 | public static final String auxiliaryConceptPrefix = Namespace.PAGODA_AUX + "concept_"; | ||
| 309 | 301 | ||
| 310 | private static String getName(String iri) { | 302 | return DLClause.create(new Atom[]{Atom.create(a, X)}, bodyAtoms.toArray(new Atom[0])); |
| 311 | int index = iri.lastIndexOf("#"); | ||
| 312 | if (index != -1) return iri.substring(index + 1); | ||
| 313 | index = iri.lastIndexOf("/"); | ||
| 314 | if (index != -1) return iri.substring(index + 1); | ||
| 315 | return iri; | ||
| 316 | } | 303 | } |
| 317 | 304 | ||
| 318 | private AtomicConcept getRightAuxiliaryConcept(AtLeastConcept alc, Individual... individuals) { | 305 | private AtomicConcept getRightAuxiliaryConcept(AtLeastConcept alc, Individual... individuals) { |
| 319 | String iri = getAuxiliaryConcept4Disjunct(alc, individuals); | 306 | String iri = getAuxiliaryConcept4Disjunct(alc, individuals); |
| 320 | rightAuxiliaryConcept.put(iri, alc); | 307 | rightAuxiliaryConcept.put(iri, alc); |
| 321 | return AtomicConcept.create(iri); | 308 | return AtomicConcept.create(iri); |
| 322 | } | ||
| 323 | |||
| 324 | public static String getAuxiliaryConcept4Disjunct(AtLeastConcept alc, Individual... individuals) { | ||
| 325 | Role r = alc.getOnRole(); | ||
| 326 | LiteralConcept c = alc.getToConcept(); | ||
| 327 | StringBuilder builder = new StringBuilder(auxiliaryConceptPrefix); | ||
| 328 | if (r instanceof AtomicRole) | ||
| 329 | builder.append(getName(((AtomicRole) r).getIRI())); | ||
| 330 | else | ||
| 331 | builder.append(getName(((InverseRole) r).getInverseOf().getIRI())).append("_inv"); | ||
| 332 | |||
| 333 | if (alc.getNumber() > 1) | ||
| 334 | builder.append("_").append(alc.getNumber()); | ||
| 335 | |||
| 336 | if (c instanceof AtomicConcept) { | ||
| 337 | if (!c.equals(AtomicConcept.THING)) | ||
| 338 | builder.append("_").append(getName(((AtomicConcept) c).getIRI())); | ||
| 339 | } | ||
| 340 | else | ||
| 341 | builder.append("_").append(getName((OverApproxExist.getNegationConcept(((AtomicNegationConcept) c).getNegatedAtomicConcept()).getIRI()))); | ||
| 342 | |||
| 343 | if (individuals.length > 1) | ||
| 344 | builder.append("_").append(getName(individuals[0].getIRI())); | ||
| 345 | |||
| 346 | builder.append("_exist"); | ||
| 347 | |||
| 348 | return builder.toString(); | ||
| 349 | } | 309 | } |
| 350 | 310 | ||
| 351 | public AtomicConcept getLeftAuxiliaryConcept(AtLeastConcept key, boolean available) { | 311 | public AtomicConcept getLeftAuxiliaryConcept(AtLeastConcept key, boolean available) { |
| 352 | // AtLeastConcept key = AtLeastConcept.create(1, r, c); | 312 | // AtLeastConcept key = AtLeastConcept.create(1, r, c); |
| 353 | AtomicConcept value = null; | 313 | AtomicConcept value = null; |
| 354 | if ((value = leftAuxiliaryConcept.get(key)) != null); | 314 | if ((value = leftAuxiliaryConcept.get(key)) != null) ; |
| 355 | else if (!available) { | 315 | else if (!available) { |
| 356 | value = AtomicConcept.create(getAuxiliaryConcept4Disjunct(key)); | 316 | value = AtomicConcept.create(getAuxiliaryConcept4Disjunct(key)); |
| 357 | leftAuxiliaryConcept.put(key, value); | 317 | leftAuxiliaryConcept.put(key, value); |
| 358 | leftAuxiliaryConcept_inv.put(value, key); | 318 | leftAuxiliaryConcept_inv.put(value, key); |
| 359 | } | 319 | } |
| 360 | return value; | 320 | return value; |
| 361 | } | 321 | } |
| 362 | 322 | ||
| 363 | public AtLeastConcept getLeftAtLeastConcept(AtomicConcept value) { | 323 | public AtLeastConcept getLeftAtLeastConcept(AtomicConcept value) { |
| 364 | return leftAuxiliaryConcept_inv.get(value); | 324 | return leftAuxiliaryConcept_inv.get(value); |
| 365 | } | 325 | } |
| 366 | |||
| 367 | Map<String, AtLeastConcept> rightAuxiliaryConcept = new HashMap<String, AtLeastConcept>(); | ||
| 368 | 326 | ||
| 369 | public AtLeastConcept getRightAtLeastConcept(AtomicConcept p) { | 327 | public AtLeastConcept getRightAtLeastConcept(AtomicConcept p) { |
| 370 | return rightAuxiliaryConcept.get(p.getIRI()); | 328 | return rightAuxiliaryConcept.get(p.getIRI()); |
diff --git a/src/uk/ac/ox/cs/pagoda/multistage/TwoStageApplication.java b/src/uk/ac/ox/cs/pagoda/multistage/TwoStageApplication.java index f08bfbd..79627d9 100644 --- a/src/uk/ac/ox/cs/pagoda/multistage/TwoStageApplication.java +++ b/src/uk/ac/ox/cs/pagoda/multistage/TwoStageApplication.java | |||
| @@ -1,26 +1,6 @@ | |||
| 1 | package uk.ac.ox.cs.pagoda.multistage; | 1 | package uk.ac.ox.cs.pagoda.multistage; |
| 2 | 2 | ||
| 3 | import java.util.Collection; | 3 | import org.semanticweb.HermiT.model.*; |
| 4 | import java.util.HashMap; | ||
| 5 | import java.util.HashSet; | ||
| 6 | import java.util.LinkedList; | ||
| 7 | import java.util.Map; | ||
| 8 | import java.util.Set; | ||
| 9 | |||
| 10 | import org.semanticweb.HermiT.model.AnnotatedEquality; | ||
| 11 | import org.semanticweb.HermiT.model.AtLeast; | ||
| 12 | import org.semanticweb.HermiT.model.AtLeastConcept; | ||
| 13 | import org.semanticweb.HermiT.model.AtLeastDataRange; | ||
| 14 | import org.semanticweb.HermiT.model.Atom; | ||
| 15 | import org.semanticweb.HermiT.model.AtomicConcept; | ||
| 16 | import org.semanticweb.HermiT.model.AtomicNegationConcept; | ||
| 17 | import org.semanticweb.HermiT.model.AtomicRole; | ||
| 18 | import org.semanticweb.HermiT.model.DLClause; | ||
| 19 | import org.semanticweb.HermiT.model.DLPredicate; | ||
| 20 | import org.semanticweb.HermiT.model.Equality; | ||
| 21 | import org.semanticweb.HermiT.model.Inequality; | ||
| 22 | import org.semanticweb.HermiT.model.Variable; | ||
| 23 | |||
| 24 | import uk.ac.ox.cs.JRDFox.JRDFStoreException; | 4 | import uk.ac.ox.cs.JRDFox.JRDFStoreException; |
| 25 | import uk.ac.ox.cs.JRDFox.store.TupleIterator; | 5 | import uk.ac.ox.cs.JRDFox.store.TupleIterator; |
| 26 | import uk.ac.ox.cs.pagoda.MyPrefixes; | 6 | import uk.ac.ox.cs.pagoda.MyPrefixes; |
| @@ -29,38 +9,36 @@ import uk.ac.ox.cs.pagoda.hermit.RuleHelper; | |||
| 29 | import uk.ac.ox.cs.pagoda.query.GapByStore4ID; | 9 | import uk.ac.ox.cs.pagoda.query.GapByStore4ID; |
| 30 | import uk.ac.ox.cs.pagoda.reasoner.light.RDFoxTripleManager; | 10 | import uk.ac.ox.cs.pagoda.reasoner.light.RDFoxTripleManager; |
| 31 | import uk.ac.ox.cs.pagoda.rules.DatalogProgram; | 11 | import uk.ac.ox.cs.pagoda.rules.DatalogProgram; |
| 32 | import uk.ac.ox.cs.pagoda.rules.OverApproxExist; | ||
| 33 | import uk.ac.ox.cs.pagoda.rules.Program; | 12 | import uk.ac.ox.cs.pagoda.rules.Program; |
| 13 | import uk.ac.ox.cs.pagoda.rules.approximators.OverApproxExist; | ||
| 34 | import uk.ac.ox.cs.pagoda.util.Namespace; | 14 | import uk.ac.ox.cs.pagoda.util.Namespace; |
| 35 | import uk.ac.ox.cs.pagoda.util.SparqlHelper; | 15 | import uk.ac.ox.cs.pagoda.util.SparqlHelper; |
| 36 | import uk.ac.ox.cs.pagoda.util.Utility; | 16 | import uk.ac.ox.cs.pagoda.util.Utility; |
| 37 | 17 | ||
| 18 | import java.util.*; | ||
| 19 | |||
| 38 | abstract class TwoStageApplication { | 20 | abstract class TwoStageApplication { |
| 39 | 21 | ||
| 22 | private static final String NAF_suffix = "_NAF"; | ||
| 40 | protected TwoStageQueryEngine engine; | 23 | protected TwoStageQueryEngine engine; |
| 41 | protected MyPrefixes prefixes = MyPrefixes.PAGOdAPrefixes; | 24 | protected MyPrefixes prefixes = MyPrefixes.PAGOdAPrefixes; |
| 42 | private GapByStore4ID gap; | ||
| 43 | |||
| 44 | Program lowerProgram; | ||
| 45 | |||
| 46 | boolean m_incrementally = true; | ||
| 47 | |||
| 48 | protected Set<DLClause> rules = new HashSet<DLClause>(); | 25 | protected Set<DLClause> rules = new HashSet<DLClause>(); |
| 49 | private StringBuilder datalogRuleText = new StringBuilder(); | ||
| 50 | |||
| 51 | protected Collection<DLClause> constraints = new LinkedList<DLClause>(); | 26 | protected Collection<DLClause> constraints = new LinkedList<DLClause>(); |
| 52 | protected BottomStrategy m_bottom; | 27 | protected BottomStrategy m_bottom; |
| 53 | |||
| 54 | protected Set<Atom> toGenerateNAFFacts = new HashSet<Atom>(); | 28 | protected Set<Atom> toGenerateNAFFacts = new HashSet<Atom>(); |
| 55 | |||
| 56 | protected OverApproxExist overExist = new OverApproxExist(); | 29 | protected OverApproxExist overExist = new OverApproxExist(); |
| 57 | 30 | Program lowerProgram; | |
| 31 | boolean m_incrementally = true; | ||
| 32 | Set<Integer> allIndividuals = new HashSet<Integer>(); | ||
| 33 | RDFoxTripleManager tripleManager; | ||
| 34 | private GapByStore4ID gap; | ||
| 35 | private StringBuilder datalogRuleText = new StringBuilder(); | ||
| 58 | private Map<DLClause, DLClause> map = new HashMap<DLClause, DLClause>(); | 36 | private Map<DLClause, DLClause> map = new HashMap<DLClause, DLClause>(); |
| 59 | 37 | ||
| 60 | public TwoStageApplication(TwoStageQueryEngine engine, DatalogProgram program, GapByStore4ID gap) { | 38 | public TwoStageApplication(TwoStageQueryEngine engine, DatalogProgram program, GapByStore4ID gap) { |
| 61 | this.engine = engine; | 39 | this.engine = engine; |
| 62 | tripleManager = new RDFoxTripleManager(engine.getDataStore(), m_incrementally); | 40 | tripleManager = new RDFoxTripleManager(engine.getDataStore(), m_incrementally); |
| 63 | this.gap = gap; | 41 | this.gap = gap; |
| 64 | m_bottom = program.getUpperBottomStrategy(); | 42 | m_bottom = program.getUpperBottomStrategy(); |
| 65 | lowerProgram = program.getLower(); | 43 | lowerProgram = program.getLower(); |
| 66 | 44 | ||
| @@ -123,7 +101,7 @@ abstract class TwoStageApplication { | |||
| 123 | for (DLClause clause: lowerProgram.getClauses()) | 101 | for (DLClause clause: lowerProgram.getClauses()) |
| 124 | if (!rules.contains(clause)) | 102 | if (!rules.contains(clause)) |
| 125 | builder.append(RuleHelper.getText(clause)); | 103 | builder.append(RuleHelper.getText(clause)); |
| 126 | 104 | ||
| 127 | engine.materialise(builder.toString(), null, false); | 105 | engine.materialise(builder.toString(), null, false); |
| 128 | addAuxiliaryRules(); | 106 | addAuxiliaryRules(); |
| 129 | addAuxiliaryNAFFacts(); | 107 | addAuxiliaryNAFFacts(); |
| @@ -150,7 +128,7 @@ abstract class TwoStageApplication { | |||
| 150 | e.printStackTrace(); | 128 | e.printStackTrace(); |
| 151 | } finally { | 129 | } finally { |
| 152 | if (tuples != null) tuples.dispose(); | 130 | if (tuples != null) tuples.dispose(); |
| 153 | tuples = null; | 131 | tuples = null; |
| 154 | } | 132 | } |
| 155 | } | 133 | } |
| 156 | } | 134 | } |
| @@ -171,9 +149,6 @@ abstract class TwoStageApplication { | |||
| 171 | 149 | ||
| 172 | protected abstract void addAuxiliaryRules(); | 150 | protected abstract void addAuxiliaryRules(); |
| 173 | 151 | ||
| 174 | Set<Integer> allIndividuals = new HashSet<Integer>(); | ||
| 175 | RDFoxTripleManager tripleManager; | ||
| 176 | |||
| 177 | private void addAuxiliaryNAFFacts() { | 152 | private void addAuxiliaryNAFFacts() { |
| 178 | 153 | ||
| 179 | for (int id : tripleManager.getResourceIDs(engine.getAllIndividuals())) | 154 | for (int id : tripleManager.getResourceIDs(engine.getAllIndividuals())) |
| @@ -203,7 +178,7 @@ abstract class TwoStageApplication { | |||
| 203 | tuples = engine.internal_evaluate(SparqlHelper.getSPARQLQuery( | 178 | tuples = engine.internal_evaluate(SparqlHelper.getSPARQLQuery( |
| 204 | new Atom[] { Atom.create(p, X) }, "X")); | 179 | new Atom[] { Atom.create(p, X) }, "X")); |
| 205 | for (long multi = tuples.open(); multi != 0; multi = tuples.getNext()) { | 180 | for (long multi = tuples.open(); multi != 0; multi = tuples.getNext()) { |
| 206 | ret.remove((int) tuples.getResourceID(0)); | 181 | ret.remove(tuples.getResourceID(0)); |
| 207 | } | 182 | } |
| 208 | } catch (JRDFStoreException e) { | 183 | } catch (JRDFStoreException e) { |
| 209 | // TODO Auto-generated catch block | 184 | // TODO Auto-generated catch block |
| @@ -216,8 +191,6 @@ abstract class TwoStageApplication { | |||
| 216 | 191 | ||
| 217 | protected abstract Collection<DLClause> getInitialClauses(Program program); | 192 | protected abstract Collection<DLClause> getInitialClauses(Program program); |
| 218 | 193 | ||
| 219 | private static final String NAF_suffix = "_NAF"; | ||
| 220 | |||
| 221 | protected Atom getNAFAtom(Atom atom) { | 194 | protected Atom getNAFAtom(Atom atom) { |
| 222 | return getNAFAtom(atom, true); | 195 | return getNAFAtom(atom, true); |
| 223 | } | 196 | } |
diff --git a/src/uk/ac/ox/cs/pagoda/multistage/treatement/Pick4NegativeConceptQuerySpecific.java b/src/uk/ac/ox/cs/pagoda/multistage/treatement/Pick4NegativeConceptQuerySpecific.java index ae168cf..10aa22f 100644 --- a/src/uk/ac/ox/cs/pagoda/multistage/treatement/Pick4NegativeConceptQuerySpecific.java +++ b/src/uk/ac/ox/cs/pagoda/multistage/treatement/Pick4NegativeConceptQuerySpecific.java | |||
| @@ -1,18 +1,7 @@ | |||
| 1 | package uk.ac.ox.cs.pagoda.multistage.treatement; | 1 | package uk.ac.ox.cs.pagoda.multistage.treatement; |
| 2 | 2 | ||
| 3 | import java.util.Comparator; | 3 | import org.semanticweb.HermiT.model.*; |
| 4 | import java.util.Set; | 4 | import uk.ac.ox.cs.JRDFox.JRDFStoreException; |
| 5 | |||
| 6 | import org.semanticweb.HermiT.model.AnnotatedEquality; | ||
| 7 | import org.semanticweb.HermiT.model.AtLeastConcept; | ||
| 8 | import org.semanticweb.HermiT.model.Atom; | ||
| 9 | import org.semanticweb.HermiT.model.AtomicConcept; | ||
| 10 | import org.semanticweb.HermiT.model.AtomicNegationConcept; | ||
| 11 | import org.semanticweb.HermiT.model.AtomicRole; | ||
| 12 | import org.semanticweb.HermiT.model.DLPredicate; | ||
| 13 | import org.semanticweb.HermiT.model.Equality; | ||
| 14 | import org.semanticweb.HermiT.model.Inequality; | ||
| 15 | import org.semanticweb.HermiT.model.InverseRole; | ||
| 16 | import uk.ac.ox.cs.pagoda.constraints.PredicateDependency; | 5 | import uk.ac.ox.cs.pagoda.constraints.PredicateDependency; |
| 17 | import uk.ac.ox.cs.pagoda.hermit.DLClauseHelper; | 6 | import uk.ac.ox.cs.pagoda.hermit.DLClauseHelper; |
| 18 | import uk.ac.ox.cs.pagoda.multistage.MultiStageQueryEngine; | 7 | import uk.ac.ox.cs.pagoda.multistage.MultiStageQueryEngine; |
| @@ -20,10 +9,11 @@ import uk.ac.ox.cs.pagoda.multistage.Normalisation; | |||
| 20 | import uk.ac.ox.cs.pagoda.multistage.RestrictedApplication; | 9 | import uk.ac.ox.cs.pagoda.multistage.RestrictedApplication; |
| 21 | import uk.ac.ox.cs.pagoda.multistage.Violation; | 10 | import uk.ac.ox.cs.pagoda.multistage.Violation; |
| 22 | import uk.ac.ox.cs.pagoda.query.QueryRecord; | 11 | import uk.ac.ox.cs.pagoda.query.QueryRecord; |
| 23 | import uk.ac.ox.cs.pagoda.rules.OverApproxExist; | 12 | import uk.ac.ox.cs.pagoda.rules.approximators.OverApproxExist; |
| 24 | import uk.ac.ox.cs.pagoda.util.Namespace; | 13 | import uk.ac.ox.cs.pagoda.util.Namespace; |
| 25 | 14 | ||
| 26 | import uk.ac.ox.cs.JRDFox.JRDFStoreException; | 15 | import java.util.Comparator; |
| 16 | import java.util.Set; | ||
| 27 | 17 | ||
| 28 | public class Pick4NegativeConceptQuerySpecific extends Pick4NegativeConcept { | 18 | public class Pick4NegativeConceptQuerySpecific extends Pick4NegativeConcept { |
| 29 | 19 | ||
diff --git a/src/uk/ac/ox/cs/pagoda/reasoner/light/DLPredicateComparator.java b/src/uk/ac/ox/cs/pagoda/reasoner/light/DLPredicateComparator.java index c22902c..05e399e 100644 --- a/src/uk/ac/ox/cs/pagoda/reasoner/light/DLPredicateComparator.java +++ b/src/uk/ac/ox/cs/pagoda/reasoner/light/DLPredicateComparator.java | |||
| @@ -1,9 +1,9 @@ | |||
| 1 | package uk.ac.ox.cs.pagoda.reasoner.light; | 1 | package uk.ac.ox.cs.pagoda.reasoner.light; |
| 2 | 2 | ||
| 3 | import java.util.Comparator; | ||
| 4 | |||
| 5 | import uk.ac.ox.cs.pagoda.multistage.Normalisation; | 3 | import uk.ac.ox.cs.pagoda.multistage.Normalisation; |
| 6 | import uk.ac.ox.cs.pagoda.rules.OverApproxExist; | 4 | import uk.ac.ox.cs.pagoda.rules.approximators.OverApproxExist; |
| 5 | |||
| 6 | import java.util.Comparator; | ||
| 7 | 7 | ||
| 8 | public class DLPredicateComparator implements Comparator<String> { | 8 | public class DLPredicateComparator implements Comparator<String> { |
| 9 | 9 | ||
diff --git a/src/uk/ac/ox/cs/pagoda/rules/ApproxProgram.java b/src/uk/ac/ox/cs/pagoda/rules/ApproxProgram.java index 3b9d6fc..acbf354 100644 --- a/src/uk/ac/ox/cs/pagoda/rules/ApproxProgram.java +++ b/src/uk/ac/ox/cs/pagoda/rules/ApproxProgram.java | |||
| @@ -1,27 +1,22 @@ | |||
| 1 | package uk.ac.ox.cs.pagoda.rules; | 1 | package uk.ac.ox.cs.pagoda.rules; |
| 2 | 2 | ||
| 3 | import java.util.Collection; | ||
| 4 | import java.util.HashMap; | ||
| 5 | import java.util.HashSet; | ||
| 6 | import java.util.Iterator; | ||
| 7 | import java.util.Map; | ||
| 8 | |||
| 9 | import org.semanticweb.HermiT.model.DLClause; | 3 | import org.semanticweb.HermiT.model.DLClause; |
| 10 | import org.semanticweb.owlapi.model.OWLAxiom; | 4 | import org.semanticweb.owlapi.model.OWLAxiom; |
| 11 | import org.semanticweb.owlapi.model.OWLSubPropertyChainOfAxiom; | 5 | import org.semanticweb.owlapi.model.OWLSubPropertyChainOfAxiom; |
| 12 | import org.semanticweb.owlapi.model.OWLTransitiveObjectPropertyAxiom; | 6 | import org.semanticweb.owlapi.model.OWLTransitiveObjectPropertyAxiom; |
| 13 | |||
| 14 | import uk.ac.ox.cs.pagoda.owl.OWLHelper; | 7 | import uk.ac.ox.cs.pagoda.owl.OWLHelper; |
| 8 | import uk.ac.ox.cs.pagoda.rules.approximators.Approximator; | ||
| 9 | |||
| 10 | import java.util.*; | ||
| 15 | 11 | ||
| 16 | public abstract class ApproxProgram extends Program { | 12 | public abstract class ApproxProgram extends Program { |
| 17 | 13 | ||
| 14 | protected Approximator m_approx = null; | ||
| 18 | /** | 15 | /** |
| 19 | * mapping from over-approximated DLClauses to DLClauses from the original ontology | 16 | * mapping from over-approximated DLClauses to DLClauses from the original ontology |
| 20 | */ | 17 | */ |
| 21 | Map<DLClause, Object> correspondence = new HashMap<DLClause, Object>(); | 18 | Map<DLClause, Object> correspondence = new HashMap<DLClause, Object>(); |
| 22 | 19 | ||
| 23 | protected Approximator m_approx = null; | ||
| 24 | |||
| 25 | protected ApproxProgram() { initApproximator(); } | 20 | protected ApproxProgram() { initApproximator(); } |
| 26 | 21 | ||
| 27 | protected abstract void initApproximator(); | 22 | protected abstract void initApproximator(); |
| @@ -76,7 +71,7 @@ public abstract class ApproxProgram extends Program { | |||
| 76 | 71 | ||
| 77 | public OWLAxiom getEquivalentAxiom(DLClause clause) { | 72 | public OWLAxiom getEquivalentAxiom(DLClause clause) { |
| 78 | Object obj = correspondence.get(clause); | 73 | Object obj = correspondence.get(clause); |
| 79 | while (obj != null && obj instanceof DLClause && !obj.equals(clause) && correspondence.containsKey((DLClause) obj)) | 74 | while (obj != null && obj instanceof DLClause && !obj.equals(clause) && correspondence.containsKey(obj)) |
| 80 | obj = correspondence.get(clause); | 75 | obj = correspondence.get(clause); |
| 81 | if (obj instanceof OWLAxiom) | 76 | if (obj instanceof OWLAxiom) |
| 82 | return (OWLAxiom) obj; | 77 | return (OWLAxiom) obj; |
| @@ -98,14 +93,14 @@ public abstract class ApproxProgram extends Program { | |||
| 98 | 93 | ||
| 99 | class ClauseSet extends HashSet<DLClause> { | 94 | class ClauseSet extends HashSet<DLClause> { |
| 100 | 95 | ||
| 101 | public ClauseSet(DLClause first, DLClause second) { | ||
| 102 | add(first); | ||
| 103 | add(second); | ||
| 104 | } | ||
| 105 | |||
| 106 | /** | 96 | /** |
| 107 | * | 97 | * |
| 108 | */ | 98 | */ |
| 109 | private static final long serialVersionUID = 1L; | 99 | private static final long serialVersionUID = 1L; |
| 110 | 100 | ||
| 101 | public ClauseSet(DLClause first, DLClause second) { | ||
| 102 | add(first); | ||
| 103 | add(second); | ||
| 104 | } | ||
| 105 | |||
| 111 | } \ No newline at end of file | 106 | } \ No newline at end of file |
diff --git a/src/uk/ac/ox/cs/pagoda/rules/Approximator.java b/src/uk/ac/ox/cs/pagoda/rules/Approximator.java deleted file mode 100644 index 66e676b..0000000 --- a/src/uk/ac/ox/cs/pagoda/rules/Approximator.java +++ /dev/null | |||
| @@ -1,62 +0,0 @@ | |||
| 1 | package uk.ac.ox.cs.pagoda.rules; | ||
| 2 | |||
| 3 | import org.semanticweb.HermiT.model.AtLeast; | ||
| 4 | import org.semanticweb.HermiT.model.Atom; | ||
| 5 | import org.semanticweb.HermiT.model.DLClause; | ||
| 6 | import org.semanticweb.HermiT.model.DLPredicate; | ||
| 7 | |||
| 8 | import java.util.Collection; | ||
| 9 | import java.util.LinkedList; | ||
| 10 | |||
| 11 | public interface Approximator { | ||
| 12 | |||
| 13 | Collection<DLClause> convert(DLClause clause, DLClause originalClause); | ||
| 14 | |||
| 15 | } | ||
| 16 | |||
| 17 | class IgnoreExist implements Approximator { | ||
| 18 | |||
| 19 | @Override | ||
| 20 | public Collection<DLClause> convert(DLClause clause, DLClause originalClause) { | ||
| 21 | Collection<DLClause> ret = new LinkedList<DLClause>(); | ||
| 22 | DLPredicate p; | ||
| 23 | for (Atom headAtom: clause.getHeadAtoms()) { | ||
| 24 | p = headAtom.getDLPredicate(); | ||
| 25 | if (p instanceof AtLeast) return ret; | ||
| 26 | } | ||
| 27 | |||
| 28 | ret.add(clause); | ||
| 29 | return ret; | ||
| 30 | } | ||
| 31 | |||
| 32 | } | ||
| 33 | |||
| 34 | class IgnoreBoth implements Approximator { | ||
| 35 | |||
| 36 | @Override | ||
| 37 | public Collection<DLClause> convert(DLClause clause, DLClause originalClause) { | ||
| 38 | Collection<DLClause> ret = new LinkedList<DLClause>(); | ||
| 39 | |||
| 40 | if (clause.getHeadLength() > 1) return ret; | ||
| 41 | |||
| 42 | if (clause.getHeadLength() > 0) { | ||
| 43 | DLPredicate predicate = clause.getHeadAtom(0).getDLPredicate(); | ||
| 44 | |||
| 45 | if (predicate instanceof AtLeast) return ret; | ||
| 46 | } | ||
| 47 | |||
| 48 | ret.add(clause); | ||
| 49 | return ret; | ||
| 50 | } | ||
| 51 | } | ||
| 52 | |||
| 53 | class IgnoreDisj implements Approximator { | ||
| 54 | |||
| 55 | @Override | ||
| 56 | public Collection<DLClause> convert(DLClause clause, DLClause originalClause) { | ||
| 57 | Collection<DLClause> ret = new LinkedList<DLClause>(); | ||
| 58 | if (clause.getHeadLength() > 1) return ret; | ||
| 59 | ret.add(clause); | ||
| 60 | return ret; | ||
| 61 | } | ||
| 62 | } | ||
diff --git a/src/uk/ac/ox/cs/pagoda/rules/DisjunctiveProgram.java b/src/uk/ac/ox/cs/pagoda/rules/DisjunctiveProgram.java index 6ebe666..d50c2d4 100644 --- a/src/uk/ac/ox/cs/pagoda/rules/DisjunctiveProgram.java +++ b/src/uk/ac/ox/cs/pagoda/rules/DisjunctiveProgram.java | |||
| @@ -1,10 +1,12 @@ | |||
| 1 | package uk.ac.ox.cs.pagoda.rules; | 1 | package uk.ac.ox.cs.pagoda.rules; |
| 2 | 2 | ||
| 3 | import uk.ac.ox.cs.pagoda.rules.approximators.OverApproxExist; | ||
| 4 | |||
| 3 | public class DisjunctiveProgram extends UpperProgram { | 5 | public class DisjunctiveProgram extends UpperProgram { |
| 4 | 6 | ||
| 5 | @Override | 7 | @Override |
| 6 | protected void initApproximator() { | 8 | protected void initApproximator() { |
| 7 | m_approx = new OverApproxExist(); | 9 | m_approx = new OverApproxExist(); |
| 8 | } | 10 | } |
| 9 | 11 | ||
| 10 | // @Override | 12 | // @Override |
diff --git a/src/uk/ac/ox/cs/pagoda/rules/ExistConstantApproximator.java b/src/uk/ac/ox/cs/pagoda/rules/ExistConstantApproximator.java index 74c531f..7c9562f 100644 --- a/src/uk/ac/ox/cs/pagoda/rules/ExistConstantApproximator.java +++ b/src/uk/ac/ox/cs/pagoda/rules/ExistConstantApproximator.java | |||
| @@ -2,6 +2,8 @@ package uk.ac.ox.cs.pagoda.rules; | |||
| 2 | 2 | ||
| 3 | import org.semanticweb.HermiT.model.DLClause; | 3 | import org.semanticweb.HermiT.model.DLClause; |
| 4 | import uk.ac.ox.cs.pagoda.multistage.AnswerTupleID; | 4 | import uk.ac.ox.cs.pagoda.multistage.AnswerTupleID; |
| 5 | import uk.ac.ox.cs.pagoda.rules.approximators.OverApproxExist; | ||
| 6 | import uk.ac.ox.cs.pagoda.rules.approximators.TupleDependentApproximator; | ||
| 5 | 7 | ||
| 6 | import java.util.Collection; | 8 | import java.util.Collection; |
| 7 | 9 | ||
diff --git a/src/uk/ac/ox/cs/pagoda/rules/ExistentialProgram.java b/src/uk/ac/ox/cs/pagoda/rules/ExistentialProgram.java index 64d018f..e825917 100644 --- a/src/uk/ac/ox/cs/pagoda/rules/ExistentialProgram.java +++ b/src/uk/ac/ox/cs/pagoda/rules/ExistentialProgram.java | |||
| @@ -1,5 +1,7 @@ | |||
| 1 | package uk.ac.ox.cs.pagoda.rules; | 1 | package uk.ac.ox.cs.pagoda.rules; |
| 2 | 2 | ||
| 3 | import uk.ac.ox.cs.pagoda.rules.approximators.OverApproxDisj; | ||
| 4 | |||
| 3 | public class ExistentialProgram extends UpperProgram { | 5 | public class ExistentialProgram extends UpperProgram { |
| 4 | 6 | ||
| 5 | // @Override | 7 | // @Override |
| @@ -12,7 +14,7 @@ public class ExistentialProgram extends UpperProgram { | |||
| 12 | 14 | ||
| 13 | @Override | 15 | @Override |
| 14 | protected void initApproximator() { | 16 | protected void initApproximator() { |
| 15 | m_approx = new OverApproxDisj(); | 17 | m_approx = new OverApproxDisj(); |
| 16 | } | 18 | } |
| 17 | 19 | ||
| 18 | } | 20 | } |
diff --git a/src/uk/ac/ox/cs/pagoda/rules/ExistentialToDisjunctive.java b/src/uk/ac/ox/cs/pagoda/rules/ExistentialToDisjunctive.java index ebe0b7d..2098f73 100644 --- a/src/uk/ac/ox/cs/pagoda/rules/ExistentialToDisjunctive.java +++ b/src/uk/ac/ox/cs/pagoda/rules/ExistentialToDisjunctive.java | |||
| @@ -1,19 +1,17 @@ | |||
| 1 | package uk.ac.ox.cs.pagoda.rules; | 1 | package uk.ac.ox.cs.pagoda.rules; |
| 2 | 2 | ||
| 3 | import org.semanticweb.HermiT.model.*; | ||
| 4 | import org.semanticweb.owlapi.model.OWLObjectProperty; | ||
| 5 | import org.semanticweb.owlapi.model.OWLOntology; | ||
| 6 | import uk.ac.ox.cs.pagoda.constraints.BottomStrategy; | ||
| 7 | import uk.ac.ox.cs.pagoda.rules.approximators.Approximator; | ||
| 8 | import uk.ac.ox.cs.pagoda.rules.approximators.OverApproxExist; | ||
| 9 | |||
| 3 | import java.util.Collection; | 10 | import java.util.Collection; |
| 4 | import java.util.HashSet; | 11 | import java.util.HashSet; |
| 5 | import java.util.LinkedList; | 12 | import java.util.LinkedList; |
| 6 | import java.util.Set; | 13 | import java.util.Set; |
| 7 | 14 | ||
| 8 | import org.semanticweb.HermiT.model.AtLeastConcept; | ||
| 9 | import org.semanticweb.HermiT.model.Atom; | ||
| 10 | import org.semanticweb.HermiT.model.AtomicRole; | ||
| 11 | import org.semanticweb.HermiT.model.DLClause; | ||
| 12 | import org.semanticweb.HermiT.model.DLPredicate; | ||
| 13 | import org.semanticweb.owlapi.model.OWLObjectProperty; | ||
| 14 | import org.semanticweb.owlapi.model.OWLOntology; | ||
| 15 | import uk.ac.ox.cs.pagoda.constraints.BottomStrategy; | ||
| 16 | |||
| 17 | public class ExistentialToDisjunctive extends UpperProgram { | 15 | public class ExistentialToDisjunctive extends UpperProgram { |
| 18 | 16 | ||
| 19 | Set<String> inverseFuncProperties = new HashSet<String>(); | 17 | Set<String> inverseFuncProperties = new HashSet<String>(); |
diff --git a/src/uk/ac/ox/cs/pagoda/rules/LowerDatalogProgram.java b/src/uk/ac/ox/cs/pagoda/rules/LowerDatalogProgram.java index a664ba1..199d167 100644 --- a/src/uk/ac/ox/cs/pagoda/rules/LowerDatalogProgram.java +++ b/src/uk/ac/ox/cs/pagoda/rules/LowerDatalogProgram.java | |||
| @@ -10,6 +10,7 @@ import uk.ac.ox.cs.pagoda.constraints.UnaryBottom; | |||
| 10 | import uk.ac.ox.cs.pagoda.constraints.UpperUnaryBottom; | 10 | import uk.ac.ox.cs.pagoda.constraints.UpperUnaryBottom; |
| 11 | import uk.ac.ox.cs.pagoda.multistage.Normalisation; | 11 | import uk.ac.ox.cs.pagoda.multistage.Normalisation; |
| 12 | import uk.ac.ox.cs.pagoda.multistage.RestrictedApplication; | 12 | import uk.ac.ox.cs.pagoda.multistage.RestrictedApplication; |
| 13 | import uk.ac.ox.cs.pagoda.rules.approximators.Approximator; | ||
| 13 | import uk.ac.ox.cs.pagoda.util.Timer; | 14 | import uk.ac.ox.cs.pagoda.util.Timer; |
| 14 | import uk.ac.ox.cs.pagoda.util.Utility; | 15 | import uk.ac.ox.cs.pagoda.util.Utility; |
| 15 | 16 | ||
| @@ -106,7 +107,26 @@ public class LowerDatalogProgram extends ApproxProgram implements IncrementalPro | |||
| 106 | 107 | ||
| 107 | @Override | 108 | @Override |
| 108 | protected void initApproximator() { | 109 | protected void initApproximator() { |
| 109 | m_approx = new IgnoreBoth(); | 110 | m_approx = new IgnoreBoth(); |
| 111 | } | ||
| 112 | |||
| 113 | private class IgnoreBoth implements Approximator { | ||
| 114 | |||
| 115 | @Override | ||
| 116 | public Collection<DLClause> convert(DLClause clause, DLClause originalClause) { | ||
| 117 | Collection<DLClause> ret = new LinkedList<DLClause>(); | ||
| 118 | |||
| 119 | if (clause.getHeadLength() > 1) return ret; | ||
| 120 | |||
| 121 | if (clause.getHeadLength() > 0) { | ||
| 122 | DLPredicate predicate = clause.getHeadAtom(0).getDLPredicate(); | ||
| 123 | |||
| 124 | if (predicate instanceof AtLeast) return ret; | ||
| 125 | } | ||
| 126 | |||
| 127 | ret.add(clause); | ||
| 128 | return ret; | ||
| 129 | } | ||
| 110 | } | 130 | } |
| 111 | 131 | ||
| 112 | } | 132 | } |
| @@ -116,15 +136,13 @@ class ClassifyThread extends Thread { | |||
| 116 | IncrementalProgram m_program; | 136 | IncrementalProgram m_program; |
| 117 | Collection<DLClause> clauses = new LinkedList<DLClause>(); | 137 | Collection<DLClause> clauses = new LinkedList<DLClause>(); |
| 118 | 138 | ||
| 119 | Variable X = Variable.create("X"), Y = Variable.create("Y"); | 139 | Variable X = Variable.create("X"), Y = Variable.create("Y"); |
| 120 | 140 | Reasoner hermitReasoner; | |
| 141 | OWLOntology ontology; | ||
| 121 | ClassifyThread(IncrementalProgram program) { | 142 | ClassifyThread(IncrementalProgram program) { |
| 122 | m_program = program; | 143 | m_program = program; |
| 123 | } | 144 | } |
| 124 | 145 | ||
| 125 | Reasoner hermitReasoner; | ||
| 126 | OWLOntology ontology; | ||
| 127 | |||
| 128 | @Override | 146 | @Override |
| 129 | public void run() { | 147 | public void run() { |
| 130 | ontology = m_program.getOntology(); | 148 | ontology = m_program.getOntology(); |
| @@ -215,5 +233,4 @@ class ClassifyThread extends Thread { | |||
| 215 | private Atom getAtom(OWLClass c) { | 233 | private Atom getAtom(OWLClass c) { |
| 216 | return Atom.create(AtomicConcept.create(c.toStringID()), X); | 234 | return Atom.create(AtomicConcept.create(c.toStringID()), X); |
| 217 | } | 235 | } |
| 218 | |||
| 219 | } \ No newline at end of file | 236 | } \ No newline at end of file |
diff --git a/src/uk/ac/ox/cs/pagoda/rules/UpperDatalogProgram.java b/src/uk/ac/ox/cs/pagoda/rules/UpperDatalogProgram.java index a4cd790..611e183 100644 --- a/src/uk/ac/ox/cs/pagoda/rules/UpperDatalogProgram.java +++ b/src/uk/ac/ox/cs/pagoda/rules/UpperDatalogProgram.java | |||
| @@ -1,12 +1,13 @@ | |||
| 1 | package uk.ac.ox.cs.pagoda.rules; | 1 | package uk.ac.ox.cs.pagoda.rules; |
| 2 | 2 | ||
| 3 | import org.semanticweb.HermiT.model.DLClause; | ||
| 4 | import org.semanticweb.HermiT.model.DLPredicate; | ||
| 5 | import uk.ac.ox.cs.pagoda.rules.approximators.OverApproxBoth; | ||
| 6 | |||
| 3 | import java.util.Collection; | 7 | import java.util.Collection; |
| 4 | import java.util.HashMap; | 8 | import java.util.HashMap; |
| 5 | import java.util.Map; | 9 | import java.util.Map; |
| 6 | 10 | ||
| 7 | import org.semanticweb.HermiT.model.DLClause; | ||
| 8 | import org.semanticweb.HermiT.model.DLPredicate; | ||
| 9 | |||
| 10 | 11 | ||
| 11 | public class UpperDatalogProgram extends UpperProgram { | 12 | public class UpperDatalogProgram extends UpperProgram { |
| 12 | 13 | ||
| @@ -22,7 +23,7 @@ public class UpperDatalogProgram extends UpperProgram { | |||
| 22 | 23 | ||
| 23 | @Override | 24 | @Override |
| 24 | protected void initApproximator() { | 25 | protected void initApproximator() { |
| 25 | m_approx = new OverApproxBoth(); | 26 | m_approx = new OverApproxBoth(); |
| 26 | } | 27 | } |
| 27 | 28 | ||
| 28 | public int getBottomNumber() { | 29 | public int getBottomNumber() { |
diff --git a/src/uk/ac/ox/cs/pagoda/rules/approximators/Approximator.java b/src/uk/ac/ox/cs/pagoda/rules/approximators/Approximator.java new file mode 100644 index 0000000..f910c64 --- /dev/null +++ b/src/uk/ac/ox/cs/pagoda/rules/approximators/Approximator.java | |||
| @@ -0,0 +1,42 @@ | |||
| 1 | package uk.ac.ox.cs.pagoda.rules.approximators; | ||
| 2 | |||
| 3 | import org.semanticweb.HermiT.model.DLClause; | ||
| 4 | |||
| 5 | import java.util.Collection; | ||
| 6 | |||
| 7 | public interface Approximator { | ||
| 8 | |||
| 9 | Collection<DLClause> convert(DLClause clause, DLClause originalClause); | ||
| 10 | |||
| 11 | } | ||
| 12 | |||
| 13 | // TODO remove | ||
| 14 | //class IgnoreExist implements Approximator { | ||
| 15 | // | ||
| 16 | // @Override | ||
| 17 | // public Collection<DLClause> convert(DLClause clause, DLClause originalClause) { | ||
| 18 | // Collection<DLClause> ret = new LinkedList<DLClause>(); | ||
| 19 | // DLPredicate p; | ||
| 20 | // for (Atom headAtom: clause.getHeadAtoms()) { | ||
| 21 | // p = headAtom.getDLPredicate(); | ||
| 22 | // if (p instanceof AtLeast) return ret; | ||
| 23 | // } | ||
| 24 | // | ||
| 25 | // ret.add(clause); | ||
| 26 | // return ret; | ||
| 27 | // } | ||
| 28 | // | ||
| 29 | //} | ||
| 30 | // | ||
| 31 | // | ||
| 32 | // | ||
| 33 | //class IgnoreDisj implements Approximator { | ||
| 34 | // | ||
| 35 | // @Override | ||
| 36 | // public Collection<DLClause> convert(DLClause clause, DLClause originalClause) { | ||
| 37 | // Collection<DLClause> ret = new LinkedList<DLClause>(); | ||
| 38 | // if (clause.getHeadLength() > 1) return ret; | ||
| 39 | // ret.add(clause); | ||
| 40 | // return ret; | ||
| 41 | // } | ||
| 42 | //} | ||
diff --git a/src/uk/ac/ox/cs/pagoda/rules/LimitedSkolemisationApproximator.java b/src/uk/ac/ox/cs/pagoda/rules/approximators/LimitedSkolemisationApproximator.java index 284edd2..8fc6b77 100644 --- a/src/uk/ac/ox/cs/pagoda/rules/LimitedSkolemisationApproximator.java +++ b/src/uk/ac/ox/cs/pagoda/rules/approximators/LimitedSkolemisationApproximator.java | |||
| @@ -1,7 +1,8 @@ | |||
| 1 | package uk.ac.ox.cs.pagoda.rules; | 1 | package uk.ac.ox.cs.pagoda.rules.approximators; |
| 2 | 2 | ||
| 3 | import org.semanticweb.HermiT.model.DLClause; | 3 | import org.semanticweb.HermiT.model.DLClause; |
| 4 | import uk.ac.ox.cs.pagoda.multistage.AnswerTupleID; | 4 | import uk.ac.ox.cs.pagoda.multistage.AnswerTupleID; |
| 5 | import uk.ac.ox.cs.pagoda.rules.ExistConstantApproximator; | ||
| 5 | 6 | ||
| 6 | import java.util.*; | 7 | import java.util.*; |
| 7 | 8 | ||
| @@ -62,6 +63,7 @@ public class LimitedSkolemisationApproximator implements TupleDependentApproxima | |||
| 62 | 63 | ||
| 63 | private DLClause getInstantiatedSkolemisation(DLClause clause, DLClause originalClause, AnswerTupleID violationTuple) { | 64 | private DLClause getInstantiatedSkolemisation(DLClause clause, DLClause originalClause, AnswerTupleID violationTuple) { |
| 64 | // TODO implement | 65 | // TODO implement |
| 66 | // filter the violation tuples appearing on both the sides of the rule | ||
| 65 | return null; | 67 | return null; |
| 66 | } | 68 | } |
| 67 | 69 | ||
diff --git a/src/uk/ac/ox/cs/pagoda/rules/OverApproxBoth.java b/src/uk/ac/ox/cs/pagoda/rules/approximators/OverApproxBoth.java index 3cc2aba..ae2a2cf 100644 --- a/src/uk/ac/ox/cs/pagoda/rules/OverApproxBoth.java +++ b/src/uk/ac/ox/cs/pagoda/rules/approximators/OverApproxBoth.java | |||
| @@ -1,11 +1,11 @@ | |||
| 1 | package uk.ac.ox.cs.pagoda.rules; | 1 | package uk.ac.ox.cs.pagoda.rules.approximators; |
| 2 | |||
| 3 | import java.util.Collection; | ||
| 4 | import java.util.LinkedList; | ||
| 5 | 2 | ||
| 6 | import org.semanticweb.HermiT.model.AtLeastDataRange; | 3 | import org.semanticweb.HermiT.model.AtLeastDataRange; |
| 7 | import org.semanticweb.HermiT.model.DLClause; | 4 | import org.semanticweb.HermiT.model.DLClause; |
| 8 | 5 | ||
| 6 | import java.util.Collection; | ||
| 7 | import java.util.LinkedList; | ||
| 8 | |||
| 9 | public class OverApproxBoth implements Approximator { | 9 | public class OverApproxBoth implements Approximator { |
| 10 | 10 | ||
| 11 | Approximator approxDist = new OverApproxDisj(), approxExist = new OverApproxExist(); | 11 | Approximator approxDist = new OverApproxDisj(), approxExist = new OverApproxExist(); |
diff --git a/src/uk/ac/ox/cs/pagoda/rules/OverApproxDisj.java b/src/uk/ac/ox/cs/pagoda/rules/approximators/OverApproxDisj.java index 5b298e8..05d9442 100644 --- a/src/uk/ac/ox/cs/pagoda/rules/OverApproxDisj.java +++ b/src/uk/ac/ox/cs/pagoda/rules/approximators/OverApproxDisj.java | |||
| @@ -1,4 +1,4 @@ | |||
| 1 | package uk.ac.ox.cs.pagoda.rules; | 1 | package uk.ac.ox.cs.pagoda.rules.approximators; |
| 2 | 2 | ||
| 3 | import org.semanticweb.HermiT.model.*; | 3 | import org.semanticweb.HermiT.model.*; |
| 4 | import uk.ac.ox.cs.pagoda.hermit.DLClauseHelper; | 4 | import uk.ac.ox.cs.pagoda.hermit.DLClauseHelper; |
| @@ -88,7 +88,7 @@ public class OverApproxDisj implements Approximator { | |||
| 88 | arguments[i] = rename(atom.getArgument(i), unifier); | 88 | arguments[i] = rename(atom.getArgument(i), unifier); |
| 89 | return Atom.create(atom.getDLPredicate(), arguments); | 89 | return Atom.create(atom.getDLPredicate(), arguments); |
| 90 | } | 90 | } |
| 91 | 91 | ||
| 92 | public static Term rename(Term argument, Map<Variable, Term> unifier) { | 92 | public static Term rename(Term argument, Map<Variable, Term> unifier) { |
| 93 | Term newArg; | 93 | Term newArg; |
| 94 | while ((newArg = unifier.get(argument)) != null) | 94 | while ((newArg = unifier.get(argument)) != null) |
diff --git a/src/uk/ac/ox/cs/pagoda/rules/OverApproxExist.java b/src/uk/ac/ox/cs/pagoda/rules/approximators/OverApproxExist.java index 1099acf..e0bafe0 100644 --- a/src/uk/ac/ox/cs/pagoda/rules/OverApproxExist.java +++ b/src/uk/ac/ox/cs/pagoda/rules/approximators/OverApproxExist.java | |||
| @@ -1,4 +1,4 @@ | |||
| 1 | package uk.ac.ox.cs.pagoda.rules; | 1 | package uk.ac.ox.cs.pagoda.rules.approximators; |
| 2 | 2 | ||
| 3 | import org.semanticweb.HermiT.model.*; | 3 | import org.semanticweb.HermiT.model.*; |
| 4 | import uk.ac.ox.cs.pagoda.hermit.DLClauseHelper; | 4 | import uk.ac.ox.cs.pagoda.hermit.DLClauseHelper; |
| @@ -11,9 +11,11 @@ public class OverApproxExist implements Approximator { | |||
| 11 | public static final String negativeSuffix = "_neg"; | 11 | public static final String negativeSuffix = "_neg"; |
| 12 | public static final String skolemisedIndividualPrefix = Namespace.PAGODA_ANONY + "individual"; | 12 | public static final String skolemisedIndividualPrefix = Namespace.PAGODA_ANONY + "individual"; |
| 13 | private static final Variable X = Variable.create("X"); | 13 | private static final Variable X = Variable.create("X"); |
| 14 | //DEBUG | ||
| 15 | public static Collection<String> createdIndividualIRIs = new HashSet<>(); | ||
| 14 | private static int individualCounter = 0; | 16 | private static int individualCounter = 0; |
| 15 | private static Map<DLClause, Integer> individualNumber = new HashMap<DLClause, Integer>(); | 17 | private static Map<DLClause, Integer> individualNumber = new HashMap<DLClause, Integer>(); |
| 16 | 18 | ||
| 17 | private static int noOfExistential(DLClause originalClause) { | 19 | private static int noOfExistential(DLClause originalClause) { |
| 18 | int no = 0; | 20 | int no = 0; |
| 19 | for (Atom atom: originalClause.getHeadAtoms()) | 21 | for (Atom atom: originalClause.getHeadAtoms()) |
| @@ -42,7 +44,7 @@ public class OverApproxExist implements Approximator { | |||
| 42 | } | 44 | } |
| 43 | return -1; | 45 | return -1; |
| 44 | } | 46 | } |
| 45 | 47 | ||
| 46 | public static AtomicConcept getNegationConcept(DLPredicate p) { | 48 | public static AtomicConcept getNegationConcept(DLPredicate p) { |
| 47 | if (p.equals(AtomicConcept.THING)) return AtomicConcept.NOTHING; | 49 | if (p.equals(AtomicConcept.THING)) return AtomicConcept.NOTHING; |
| 48 | if (p.equals(AtomicConcept.NOTHING)) return AtomicConcept.THING; | 50 | if (p.equals(AtomicConcept.NOTHING)) return AtomicConcept.THING; |
| @@ -66,15 +68,19 @@ public class OverApproxExist implements Approximator { | |||
| 66 | public static int getNumberOfSkolemisedIndividual() { | 68 | public static int getNumberOfSkolemisedIndividual() { |
| 67 | return individualCounter; | 69 | return individualCounter; |
| 68 | } | 70 | } |
| 69 | 71 | //DEBUG | |
| 72 | |||
| 70 | public static Individual getNewIndividual(DLClause originalClause, int offset) { | 73 | public static Individual getNewIndividual(DLClause originalClause, int offset) { |
| 71 | Individual ret; | 74 | Individual ret; |
| 75 | int individualID; | ||
| 72 | if (individualNumber.containsKey(originalClause)) { | 76 | if (individualNumber.containsKey(originalClause)) { |
| 73 | ret = Individual.create(skolemisedIndividualPrefix + (individualNumber.get(originalClause) + offset)); | 77 | individualID = individualNumber.get(originalClause) + offset; |
| 78 | ret = Individual.create(skolemisedIndividualPrefix + individualID); | ||
| 74 | } | 79 | } |
| 75 | else { | 80 | else { |
| 76 | individualNumber.put(originalClause, individualCounter); | 81 | individualNumber.put(originalClause, individualCounter); |
| 77 | ret = Individual.create(skolemisedIndividualPrefix + (individualCounter + offset)); | 82 | individualID = individualCounter + offset; |
| 83 | ret = Individual.create(skolemisedIndividualPrefix + individualID); | ||
| 78 | individualCounter += noOfExistential(originalClause); | 84 | individualCounter += noOfExistential(originalClause); |
| 79 | } | 85 | } |
| 80 | return ret; | 86 | return ret; |
diff --git a/src/uk/ac/ox/cs/pagoda/rules/approximators/SkolemTermsDispenser.java b/src/uk/ac/ox/cs/pagoda/rules/approximators/SkolemTermsDispenser.java new file mode 100644 index 0000000..a920ec5 --- /dev/null +++ b/src/uk/ac/ox/cs/pagoda/rules/approximators/SkolemTermsDispenser.java | |||
| @@ -0,0 +1,74 @@ | |||
| 1 | package uk.ac.ox.cs.pagoda.rules.approximators; | ||
| 2 | |||
| 3 | import org.semanticweb.HermiT.model.AtLeast; | ||
| 4 | import org.semanticweb.HermiT.model.Atom; | ||
| 5 | import org.semanticweb.HermiT.model.DLClause; | ||
| 6 | import org.semanticweb.HermiT.model.Individual; | ||
| 7 | import uk.ac.ox.cs.pagoda.multistage.AnswerTupleID; | ||
| 8 | import uk.ac.ox.cs.pagoda.util.Namespace; | ||
| 9 | |||
| 10 | import java.util.HashMap; | ||
| 11 | import java.util.Map; | ||
| 12 | |||
| 13 | /** | ||
| 14 | * If you need a Skolem term (i.e. fresh individual), ask this class. | ||
| 15 | */ | ||
| 16 | public class SkolemTermsDispenser { | ||
| 17 | |||
| 18 | public static final String skolemisedIndividualPrefix = Namespace.PAGODA_ANONY + "individual"; | ||
| 19 | private static SkolemTermsDispenser skolemTermsDispenser; | ||
| 20 | private int individualCounter = 0; | ||
| 21 | private Map<DLClause, Integer> termNumber = new HashMap<>(); | ||
| 22 | private Map<SkolemTermId, Integer> mapTermToDepth = new HashMap<>(); | ||
| 23 | private int dependenciesCounter = 0; | ||
| 24 | private Map<AnswerTupleID, Integer> mapDependencyToId = new HashMap<>(); | ||
| 25 | |||
| 26 | private SkolemTermsDispenser() { | ||
| 27 | } | ||
| 28 | |||
| 29 | public static SkolemTermsDispenser getInstance() { | ||
| 30 | if (skolemTermsDispenser == null) skolemTermsDispenser = new SkolemTermsDispenser(); | ||
| 31 | return skolemTermsDispenser; | ||
| 32 | } | ||
| 33 | |||
| 34 | private int getDependencyId(AnswerTupleID answerTupleID) { | ||
| 35 | if (mapDependencyToId.containsKey(answerTupleID)) return mapDependencyToId.get(answerTupleID); | ||
| 36 | else return mapDependencyToId.put(answerTupleID, dependenciesCounter++); | ||
| 37 | } | ||
| 38 | |||
| 39 | public Individual getNewIndividual(DLClause originalClause, int offset, AnswerTupleID dependency) { | ||
| 40 | if (!termNumber.containsKey(originalClause)) { | ||
| 41 | termNumber.put(originalClause, individualCounter); | ||
| 42 | individualCounter += noOfExistential(originalClause); | ||
| 43 | } | ||
| 44 | if (!mapDependencyToId.containsKey(dependency)) { | ||
| 45 | mapDependencyToId.put(dependency, dependenciesCounter++); | ||
| 46 | } | ||
| 47 | |||
| 48 | SkolemTermId termId = new SkolemTermId(termNumber.get(originalClause) + offset, getDependencyId(dependency)); | ||
| 49 | return Individual.create(skolemisedIndividualPrefix + termId); | ||
| 50 | } | ||
| 51 | |||
| 52 | private int noOfExistential(DLClause originalClause) { | ||
| 53 | int no = 0; | ||
| 54 | for (Atom atom : originalClause.getHeadAtoms()) | ||
| 55 | if (atom.getDLPredicate() instanceof AtLeast) | ||
| 56 | no += ((AtLeast) atom.getDLPredicate()).getNumber(); | ||
| 57 | return no; | ||
| 58 | } | ||
| 59 | |||
| 60 | private class SkolemTermId { | ||
| 61 | private final int idBase; | ||
| 62 | private final int idOffset; | ||
| 63 | |||
| 64 | private SkolemTermId(int idBase, int idOffset) { | ||
| 65 | this.idBase = idBase; | ||
| 66 | this.idOffset = idOffset; | ||
| 67 | } | ||
| 68 | |||
| 69 | @Override | ||
| 70 | public String toString() { | ||
| 71 | return idBase + "_" + idOffset; | ||
| 72 | } | ||
| 73 | } | ||
| 74 | } | ||
diff --git a/src/uk/ac/ox/cs/pagoda/rules/TupleDependentApproximator.java b/src/uk/ac/ox/cs/pagoda/rules/approximators/TupleDependentApproximator.java index 63057c4..1a729e5 100644 --- a/src/uk/ac/ox/cs/pagoda/rules/TupleDependentApproximator.java +++ b/src/uk/ac/ox/cs/pagoda/rules/approximators/TupleDependentApproximator.java | |||
| @@ -1,4 +1,4 @@ | |||
| 1 | package uk.ac.ox.cs.pagoda.rules; | 1 | package uk.ac.ox.cs.pagoda.rules.approximators; |
| 2 | 2 | ||
| 3 | import org.semanticweb.HermiT.model.DLClause; | 3 | import org.semanticweb.HermiT.model.DLClause; |
| 4 | import uk.ac.ox.cs.pagoda.multistage.AnswerTupleID; | 4 | import uk.ac.ox.cs.pagoda.multistage.AnswerTupleID; |
diff --git a/src/uk/ac/ox/cs/pagoda/tracking/TrackingRuleEncoderDisj.java b/src/uk/ac/ox/cs/pagoda/tracking/TrackingRuleEncoderDisj.java index cee829f..331ad12 100644 --- a/src/uk/ac/ox/cs/pagoda/tracking/TrackingRuleEncoderDisj.java +++ b/src/uk/ac/ox/cs/pagoda/tracking/TrackingRuleEncoderDisj.java | |||
| @@ -1,30 +1,14 @@ | |||
| 1 | package uk.ac.ox.cs.pagoda.tracking; | 1 | package uk.ac.ox.cs.pagoda.tracking; |
| 2 | 2 | ||
| 3 | import java.util.Collection; | 3 | import org.semanticweb.HermiT.model.*; |
| 4 | import java.util.Collections; | ||
| 5 | import java.util.HashMap; | ||
| 6 | import java.util.HashSet; | ||
| 7 | import java.util.Iterator; | ||
| 8 | import java.util.LinkedList; | ||
| 9 | import java.util.Map; | ||
| 10 | |||
| 11 | import org.semanticweb.HermiT.model.AnnotatedEquality; | ||
| 12 | import org.semanticweb.HermiT.model.AtLeastConcept; | ||
| 13 | import org.semanticweb.HermiT.model.Atom; | ||
| 14 | import org.semanticweb.HermiT.model.AtomicConcept; | ||
| 15 | import org.semanticweb.HermiT.model.AtomicRole; | ||
| 16 | import org.semanticweb.HermiT.model.DLClause; | ||
| 17 | import org.semanticweb.HermiT.model.DLPredicate; | ||
| 18 | import org.semanticweb.HermiT.model.Equality; | ||
| 19 | import org.semanticweb.HermiT.model.Individual; | ||
| 20 | import org.semanticweb.HermiT.model.Inequality; | ||
| 21 | |||
| 22 | import uk.ac.ox.cs.pagoda.hermit.DLClauseHelper; | 4 | import uk.ac.ox.cs.pagoda.hermit.DLClauseHelper; |
| 23 | import uk.ac.ox.cs.pagoda.reasoner.light.BasicQueryEngine; | 5 | import uk.ac.ox.cs.pagoda.reasoner.light.BasicQueryEngine; |
| 24 | import uk.ac.ox.cs.pagoda.rules.OverApproxExist; | ||
| 25 | import uk.ac.ox.cs.pagoda.rules.UpperDatalogProgram; | 6 | import uk.ac.ox.cs.pagoda.rules.UpperDatalogProgram; |
| 7 | import uk.ac.ox.cs.pagoda.rules.approximators.OverApproxExist; | ||
| 26 | import uk.ac.ox.cs.pagoda.util.Namespace; | 8 | import uk.ac.ox.cs.pagoda.util.Namespace; |
| 27 | 9 | ||
| 10 | import java.util.*; | ||
| 11 | |||
| 28 | public abstract class TrackingRuleEncoderDisj extends TrackingRuleEncoderWithGap { | 12 | public abstract class TrackingRuleEncoderDisj extends TrackingRuleEncoderWithGap { |
| 29 | 13 | ||
| 30 | public TrackingRuleEncoderDisj(UpperDatalogProgram program, BasicQueryEngine store) { | 14 | public TrackingRuleEncoderDisj(UpperDatalogProgram program, BasicQueryEngine store) { |
diff --git a/src/uk/ac/ox/cs/pagoda/tracking/TrackingRuleEncoderDisj1.java b/src/uk/ac/ox/cs/pagoda/tracking/TrackingRuleEncoderDisj1.java index e72ed96..d6b5e8b 100644 --- a/src/uk/ac/ox/cs/pagoda/tracking/TrackingRuleEncoderDisj1.java +++ b/src/uk/ac/ox/cs/pagoda/tracking/TrackingRuleEncoderDisj1.java | |||
| @@ -1,26 +1,14 @@ | |||
| 1 | package uk.ac.ox.cs.pagoda.tracking; | 1 | package uk.ac.ox.cs.pagoda.tracking; |
| 2 | 2 | ||
| 3 | import java.util.LinkedList; | 3 | import org.semanticweb.HermiT.model.*; |
| 4 | |||
| 5 | import org.semanticweb.HermiT.model.AtLeastConcept; | ||
| 6 | import org.semanticweb.HermiT.model.Atom; | ||
| 7 | import org.semanticweb.HermiT.model.AtomicConcept; | ||
| 8 | import org.semanticweb.HermiT.model.AtomicNegationConcept; | ||
| 9 | import org.semanticweb.HermiT.model.AtomicRole; | ||
| 10 | import org.semanticweb.HermiT.model.DLClause; | ||
| 11 | import org.semanticweb.HermiT.model.DLPredicate; | ||
| 12 | import org.semanticweb.HermiT.model.Individual; | ||
| 13 | import org.semanticweb.HermiT.model.Inequality; | ||
| 14 | import org.semanticweb.HermiT.model.InverseRole; | ||
| 15 | import org.semanticweb.HermiT.model.Term; | ||
| 16 | import org.semanticweb.HermiT.model.Variable; | ||
| 17 | |||
| 18 | import uk.ac.ox.cs.pagoda.MyPrefixes; | 4 | import uk.ac.ox.cs.pagoda.MyPrefixes; |
| 19 | import uk.ac.ox.cs.pagoda.hermit.DLClauseHelper; | 5 | import uk.ac.ox.cs.pagoda.hermit.DLClauseHelper; |
| 20 | import uk.ac.ox.cs.pagoda.multistage.Normalisation; | 6 | import uk.ac.ox.cs.pagoda.multistage.Normalisation; |
| 21 | import uk.ac.ox.cs.pagoda.reasoner.light.BasicQueryEngine; | 7 | import uk.ac.ox.cs.pagoda.reasoner.light.BasicQueryEngine; |
| 22 | import uk.ac.ox.cs.pagoda.rules.OverApproxExist; | ||
| 23 | import uk.ac.ox.cs.pagoda.rules.UpperDatalogProgram; | 8 | import uk.ac.ox.cs.pagoda.rules.UpperDatalogProgram; |
| 9 | import uk.ac.ox.cs.pagoda.rules.approximators.OverApproxExist; | ||
| 10 | |||
| 11 | import java.util.LinkedList; | ||
| 24 | 12 | ||
| 25 | public class TrackingRuleEncoderDisj1 extends TrackingRuleEncoderDisj { | 13 | public class TrackingRuleEncoderDisj1 extends TrackingRuleEncoderDisj { |
| 26 | 14 | ||
diff --git a/src/uk/ac/ox/cs/pagoda/tracking/TrackingRuleEncoderDisj2.java b/src/uk/ac/ox/cs/pagoda/tracking/TrackingRuleEncoderDisj2.java index 6cf239f..8d79090 100644 --- a/src/uk/ac/ox/cs/pagoda/tracking/TrackingRuleEncoderDisj2.java +++ b/src/uk/ac/ox/cs/pagoda/tracking/TrackingRuleEncoderDisj2.java | |||
| @@ -1,24 +1,12 @@ | |||
| 1 | package uk.ac.ox.cs.pagoda.tracking; | 1 | package uk.ac.ox.cs.pagoda.tracking; |
| 2 | 2 | ||
| 3 | import org.semanticweb.HermiT.model.AtLeastConcept; | 3 | import org.semanticweb.HermiT.model.*; |
| 4 | import org.semanticweb.HermiT.model.Atom; | ||
| 5 | import org.semanticweb.HermiT.model.AtomicConcept; | ||
| 6 | import org.semanticweb.HermiT.model.AtomicNegationConcept; | ||
| 7 | import org.semanticweb.HermiT.model.AtomicRole; | ||
| 8 | import org.semanticweb.HermiT.model.DLClause; | ||
| 9 | import org.semanticweb.HermiT.model.DLPredicate; | ||
| 10 | import org.semanticweb.HermiT.model.Individual; | ||
| 11 | import org.semanticweb.HermiT.model.Inequality; | ||
| 12 | import org.semanticweb.HermiT.model.InverseRole; | ||
| 13 | import org.semanticweb.HermiT.model.Term; | ||
| 14 | import org.semanticweb.HermiT.model.Variable; | ||
| 15 | |||
| 16 | import uk.ac.ox.cs.pagoda.MyPrefixes; | 4 | import uk.ac.ox.cs.pagoda.MyPrefixes; |
| 17 | import uk.ac.ox.cs.pagoda.multistage.Normalisation; | 5 | import uk.ac.ox.cs.pagoda.multistage.Normalisation; |
| 18 | import uk.ac.ox.cs.pagoda.query.QueryRecord; | 6 | import uk.ac.ox.cs.pagoda.query.QueryRecord; |
| 19 | import uk.ac.ox.cs.pagoda.reasoner.light.BasicQueryEngine; | 7 | import uk.ac.ox.cs.pagoda.reasoner.light.BasicQueryEngine; |
| 20 | import uk.ac.ox.cs.pagoda.rules.OverApproxExist; | ||
| 21 | import uk.ac.ox.cs.pagoda.rules.UpperDatalogProgram; | 8 | import uk.ac.ox.cs.pagoda.rules.UpperDatalogProgram; |
| 9 | import uk.ac.ox.cs.pagoda.rules.approximators.OverApproxExist; | ||
| 22 | 10 | ||
| 23 | public class TrackingRuleEncoderDisj2 extends TrackingRuleEncoderDisj { | 11 | public class TrackingRuleEncoderDisj2 extends TrackingRuleEncoderDisj { |
| 24 | 12 | ||
| @@ -56,7 +44,7 @@ public class TrackingRuleEncoderDisj2 extends TrackingRuleEncoderDisj { | |||
| 56 | 44 | ||
| 57 | @Override | 45 | @Override |
| 58 | protected DLPredicate generateAuxiliaryRule(AtLeastConcept p, DLClause original, Individual[] individuals) { | 46 | protected DLPredicate generateAuxiliaryRule(AtLeastConcept p, DLClause original, Individual[] individuals) { |
| 59 | DLPredicate ret = AtomicConcept.create(getTrackingPredicate(Normalisation.getAuxiliaryConcept4Disjunct((AtLeastConcept) p, individuals))); | 47 | DLPredicate ret = AtomicConcept.create(getTrackingPredicate(Normalisation.getAuxiliaryConcept4Disjunct(p, individuals))); |
| 60 | Atom[] headAtom = new Atom[] {Atom.create(ret, X)}; | 48 | Atom[] headAtom = new Atom[] {Atom.create(ret, X)}; |
| 61 | 49 | ||
| 62 | AtomicRole role = p.getOnRole() instanceof AtomicRole ? | 50 | AtomicRole role = p.getOnRole() instanceof AtomicRole ? |
diff --git a/src/uk/ac/ox/cs/pagoda/tracking/TrackingRuleEncoderDisjVar1.java b/src/uk/ac/ox/cs/pagoda/tracking/TrackingRuleEncoderDisjVar1.java index 37116d4..2143b03 100644 --- a/src/uk/ac/ox/cs/pagoda/tracking/TrackingRuleEncoderDisjVar1.java +++ b/src/uk/ac/ox/cs/pagoda/tracking/TrackingRuleEncoderDisjVar1.java | |||
| @@ -1,34 +1,20 @@ | |||
| 1 | package uk.ac.ox.cs.pagoda.tracking; | 1 | package uk.ac.ox.cs.pagoda.tracking; |
| 2 | 2 | ||
| 3 | import java.util.Collection; | 3 | import org.semanticweb.HermiT.model.*; |
| 4 | import java.util.HashSet; | ||
| 5 | import java.util.LinkedList; | ||
| 6 | import java.util.Set; | ||
| 7 | |||
| 8 | import org.semanticweb.HermiT.model.AnnotatedEquality; | ||
| 9 | import org.semanticweb.HermiT.model.AtLeast; | ||
| 10 | import org.semanticweb.HermiT.model.AtLeastConcept; | ||
| 11 | import org.semanticweb.HermiT.model.Atom; | ||
| 12 | import org.semanticweb.HermiT.model.AtomicConcept; | ||
| 13 | import org.semanticweb.HermiT.model.AtomicNegationConcept; | ||
| 14 | import org.semanticweb.HermiT.model.AtomicRole; | ||
| 15 | import org.semanticweb.HermiT.model.DLClause; | ||
| 16 | import org.semanticweb.HermiT.model.DLPredicate; | ||
| 17 | import org.semanticweb.HermiT.model.DatatypeRestriction; | ||
| 18 | import org.semanticweb.HermiT.model.Equality; | ||
| 19 | import org.semanticweb.HermiT.model.Inequality; | ||
| 20 | import org.semanticweb.HermiT.model.InverseRole; | ||
| 21 | import org.semanticweb.HermiT.model.Variable; | ||
| 22 | |||
| 23 | import uk.ac.ox.cs.pagoda.MyPrefixes; | 4 | import uk.ac.ox.cs.pagoda.MyPrefixes; |
| 24 | import uk.ac.ox.cs.pagoda.hermit.DLClauseHelper; | 5 | import uk.ac.ox.cs.pagoda.hermit.DLClauseHelper; |
| 25 | import uk.ac.ox.cs.pagoda.multistage.Normalisation; | 6 | import uk.ac.ox.cs.pagoda.multistage.Normalisation; |
| 26 | import uk.ac.ox.cs.pagoda.reasoner.light.BasicQueryEngine; | 7 | import uk.ac.ox.cs.pagoda.reasoner.light.BasicQueryEngine; |
| 27 | import uk.ac.ox.cs.pagoda.rules.OverApproxExist; | ||
| 28 | import uk.ac.ox.cs.pagoda.rules.UpperDatalogProgram; | 8 | import uk.ac.ox.cs.pagoda.rules.UpperDatalogProgram; |
| 9 | import uk.ac.ox.cs.pagoda.rules.approximators.OverApproxExist; | ||
| 29 | import uk.ac.ox.cs.pagoda.util.Namespace; | 10 | import uk.ac.ox.cs.pagoda.util.Namespace; |
| 30 | import uk.ac.ox.cs.pagoda.util.Utility; | 11 | import uk.ac.ox.cs.pagoda.util.Utility; |
| 31 | 12 | ||
| 13 | import java.util.Collection; | ||
| 14 | import java.util.HashSet; | ||
| 15 | import java.util.LinkedList; | ||
| 16 | import java.util.Set; | ||
| 17 | |||
| 32 | public class TrackingRuleEncoderDisjVar1 extends TrackingRuleEncoderWithGap { | 18 | public class TrackingRuleEncoderDisjVar1 extends TrackingRuleEncoderWithGap { |
| 33 | 19 | ||
| 34 | public TrackingRuleEncoderDisjVar1(UpperDatalogProgram program, BasicQueryEngine store) { | 20 | public TrackingRuleEncoderDisjVar1(UpperDatalogProgram program, BasicQueryEngine store) { |
| @@ -96,13 +82,13 @@ public class TrackingRuleEncoderDisjVar1 extends TrackingRuleEncoderWithGap { | |||
| 96 | return Atom.create(getTrackingDLPredicate(AtomicConcept.create(Normalisation.getAuxiliaryConcept4Disjunct((AtLeastConcept) p))), headAtom.getArgument(0)); | 82 | return Atom.create(getTrackingDLPredicate(AtomicConcept.create(Normalisation.getAuxiliaryConcept4Disjunct((AtLeastConcept) p))), headAtom.getArgument(0)); |
| 97 | } | 83 | } |
| 98 | if (p instanceof AtomicConcept) | 84 | if (p instanceof AtomicConcept) |
| 99 | return Atom.create(getTrackingDLPredicate((AtomicConcept) p), headAtom.getArgument(0)); | 85 | return Atom.create(getTrackingDLPredicate(p), headAtom.getArgument(0)); |
| 100 | if (p instanceof AtomicRole) | 86 | if (p instanceof AtomicRole) |
| 101 | return Atom.create(getTrackingDLPredicate((AtomicRole) p), headAtom.getArgument(0), headAtom.getArgument(1)); | 87 | return Atom.create(getTrackingDLPredicate(p), headAtom.getArgument(0), headAtom.getArgument(1)); |
| 102 | if (p instanceof Equality || p instanceof AnnotatedEquality) | 88 | if (p instanceof Equality || p instanceof AnnotatedEquality) |
| 103 | return Atom.create(getTrackingDLPredicate(Equality.INSTANCE), headAtom.getArgument(0), headAtom.getArgument(1)); | 89 | return Atom.create(getTrackingDLPredicate(Equality.INSTANCE), headAtom.getArgument(0), headAtom.getArgument(1)); |
| 104 | if (p instanceof Inequality) | 90 | if (p instanceof Inequality) |
| 105 | return Atom.create(getTrackingDLPredicate((Inequality) p), headAtom.getArgument(0), headAtom.getArgument(1)); | 91 | return Atom.create(getTrackingDLPredicate(p), headAtom.getArgument(0), headAtom.getArgument(1)); |
| 106 | 92 | ||
| 107 | return null; | 93 | return null; |
| 108 | } | 94 | } |
| @@ -114,15 +100,15 @@ public class TrackingRuleEncoderDisjVar1 extends TrackingRuleEncoderWithGap { | |||
| 114 | return Atom.create(getGapDLPredicate(AtomicConcept.create(Normalisation.getAuxiliaryConcept4Disjunct((AtLeastConcept) p))), headAtom.getArgument(0)); | 100 | return Atom.create(getGapDLPredicate(AtomicConcept.create(Normalisation.getAuxiliaryConcept4Disjunct((AtLeastConcept) p))), headAtom.getArgument(0)); |
| 115 | } | 101 | } |
| 116 | if (p instanceof AtomicConcept) | 102 | if (p instanceof AtomicConcept) |
| 117 | return Atom.create(getGapDLPredicate((AtomicConcept) p), headAtom.getArgument(0)); | 103 | return Atom.create(getGapDLPredicate(p), headAtom.getArgument(0)); |
| 118 | if (p instanceof AtomicRole) | 104 | if (p instanceof AtomicRole) |
| 119 | return Atom.create(getGapDLPredicate((AtomicRole) p), headAtom.getArgument(0), headAtom.getArgument(1)); | 105 | return Atom.create(getGapDLPredicate(p), headAtom.getArgument(0), headAtom.getArgument(1)); |
| 120 | if (p instanceof Equality || p instanceof AnnotatedEquality) | 106 | if (p instanceof Equality || p instanceof AnnotatedEquality) |
| 121 | return Atom.create(getGapDLPredicate(Equality.INSTANCE), headAtom.getArgument(0), headAtom.getArgument(1)); | 107 | return Atom.create(getGapDLPredicate(Equality.INSTANCE), headAtom.getArgument(0), headAtom.getArgument(1)); |
| 122 | if (p instanceof Inequality) | 108 | if (p instanceof Inequality) |
| 123 | return Atom.create(getGapDLPredicate((Inequality) p), headAtom.getArgument(0), headAtom.getArgument(1)); | 109 | return Atom.create(getGapDLPredicate(p), headAtom.getArgument(0), headAtom.getArgument(1)); |
| 124 | if (p instanceof DatatypeRestriction) | 110 | if (p instanceof DatatypeRestriction) |
| 125 | return Atom.create(getGapDLPredicate((DatatypeRestriction) p), headAtom.getArgument(0)); | 111 | return Atom.create(getGapDLPredicate(p), headAtom.getArgument(0)); |
| 126 | Utility.logError(p + " is not recognised."); | 112 | Utility.logError(p + " is not recognised."); |
| 127 | return null; | 113 | return null; |
| 128 | } | 114 | } |
diff --git a/src/uk/ac/ox/cs/pagoda/tracking/TrackingRuleEncoderDisjVar2.java b/src/uk/ac/ox/cs/pagoda/tracking/TrackingRuleEncoderDisjVar2.java index d257de3..7311a86 100644 --- a/src/uk/ac/ox/cs/pagoda/tracking/TrackingRuleEncoderDisjVar2.java +++ b/src/uk/ac/ox/cs/pagoda/tracking/TrackingRuleEncoderDisjVar2.java | |||
| @@ -1,31 +1,19 @@ | |||
| 1 | package uk.ac.ox.cs.pagoda.tracking; | 1 | package uk.ac.ox.cs.pagoda.tracking; |
| 2 | 2 | ||
| 3 | import java.util.Collection; | 3 | import org.semanticweb.HermiT.model.*; |
| 4 | import java.util.HashSet; | ||
| 5 | import java.util.LinkedList; | ||
| 6 | import java.util.Set; | ||
| 7 | |||
| 8 | import org.semanticweb.HermiT.model.AnnotatedEquality; | ||
| 9 | import org.semanticweb.HermiT.model.AtLeastConcept; | ||
| 10 | import org.semanticweb.HermiT.model.Atom; | ||
| 11 | import org.semanticweb.HermiT.model.AtomicConcept; | ||
| 12 | import org.semanticweb.HermiT.model.AtomicNegationConcept; | ||
| 13 | import org.semanticweb.HermiT.model.AtomicRole; | ||
| 14 | import org.semanticweb.HermiT.model.DLClause; | ||
| 15 | import org.semanticweb.HermiT.model.DLPredicate; | ||
| 16 | import org.semanticweb.HermiT.model.Equality; | ||
| 17 | import org.semanticweb.HermiT.model.Inequality; | ||
| 18 | import org.semanticweb.HermiT.model.InverseRole; | ||
| 19 | import org.semanticweb.HermiT.model.Variable; | ||
| 20 | |||
| 21 | import uk.ac.ox.cs.pagoda.hermit.DLClauseHelper; | 4 | import uk.ac.ox.cs.pagoda.hermit.DLClauseHelper; |
| 22 | import uk.ac.ox.cs.pagoda.multistage.Normalisation; | 5 | import uk.ac.ox.cs.pagoda.multistage.Normalisation; |
| 23 | import uk.ac.ox.cs.pagoda.query.QueryRecord; | 6 | import uk.ac.ox.cs.pagoda.query.QueryRecord; |
| 24 | import uk.ac.ox.cs.pagoda.reasoner.light.BasicQueryEngine; | 7 | import uk.ac.ox.cs.pagoda.reasoner.light.BasicQueryEngine; |
| 25 | import uk.ac.ox.cs.pagoda.rules.OverApproxExist; | ||
| 26 | import uk.ac.ox.cs.pagoda.rules.UpperDatalogProgram; | 8 | import uk.ac.ox.cs.pagoda.rules.UpperDatalogProgram; |
| 9 | import uk.ac.ox.cs.pagoda.rules.approximators.OverApproxExist; | ||
| 27 | import uk.ac.ox.cs.pagoda.util.Namespace; | 10 | import uk.ac.ox.cs.pagoda.util.Namespace; |
| 28 | 11 | ||
| 12 | import java.util.Collection; | ||
| 13 | import java.util.HashSet; | ||
| 14 | import java.util.LinkedList; | ||
| 15 | import java.util.Set; | ||
| 16 | |||
| 29 | public class TrackingRuleEncoderDisjVar2 extends TrackingRuleEncoderWithGap { | 17 | public class TrackingRuleEncoderDisjVar2 extends TrackingRuleEncoderWithGap { |
| 30 | 18 | ||
| 31 | public TrackingRuleEncoderDisjVar2(UpperDatalogProgram program, BasicQueryEngine store) { | 19 | public TrackingRuleEncoderDisjVar2(UpperDatalogProgram program, BasicQueryEngine store) { |
| @@ -91,13 +79,13 @@ public class TrackingRuleEncoderDisjVar2 extends TrackingRuleEncoderWithGap { | |||
| 91 | return Atom.create(getGapDLPredicate(AtomicConcept.create(Normalisation.getAuxiliaryConcept4Disjunct((AtLeastConcept) p))), headAtom.getArgument(0)); | 79 | return Atom.create(getGapDLPredicate(AtomicConcept.create(Normalisation.getAuxiliaryConcept4Disjunct((AtLeastConcept) p))), headAtom.getArgument(0)); |
| 92 | } | 80 | } |
| 93 | if (p instanceof AtomicConcept) | 81 | if (p instanceof AtomicConcept) |
| 94 | return Atom.create(getGapDLPredicate((AtomicConcept) p), headAtom.getArgument(0)); | 82 | return Atom.create(getGapDLPredicate(p), headAtom.getArgument(0)); |
| 95 | if (p instanceof AtomicRole) | 83 | if (p instanceof AtomicRole) |
| 96 | return Atom.create(getGapDLPredicate((AtomicRole) p), headAtom.getArgument(0), headAtom.getArgument(1)); | 84 | return Atom.create(getGapDLPredicate(p), headAtom.getArgument(0), headAtom.getArgument(1)); |
| 97 | if (p instanceof Equality || p instanceof AnnotatedEquality) | 85 | if (p instanceof Equality || p instanceof AnnotatedEquality) |
| 98 | return Atom.create(getGapDLPredicate(Equality.INSTANCE), headAtom.getArgument(0), headAtom.getArgument(1)); | 86 | return Atom.create(getGapDLPredicate(Equality.INSTANCE), headAtom.getArgument(0), headAtom.getArgument(1)); |
| 99 | if (p instanceof Inequality) | 87 | if (p instanceof Inequality) |
| 100 | return Atom.create(getGapDLPredicate((Inequality) p), headAtom.getArgument(0), headAtom.getArgument(1)); | 88 | return Atom.create(getGapDLPredicate(p), headAtom.getArgument(0), headAtom.getArgument(1)); |
| 101 | 89 | ||
| 102 | return null; | 90 | return null; |
| 103 | } | 91 | } |
