aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRncLsn <rnc.lsn@gmail.com>2015-08-04 18:30:46 +0100
committerRncLsn <rnc.lsn@gmail.com>2015-08-04 18:30:46 +0100
commitc3480bb733b8bca976718a3dc2f09a21cb4b1b45 (patch)
tree648b2dacb4b162205d26856c4be4bb7389f99141
parent0c39145b3b76b3db73db0a38d5324caa7ff3c434 (diff)
downloadACQuA-c3480bb733b8bca976718a3dc2f09a21cb4b1b45.tar.gz
ACQuA-c3480bb733b8bca976718a3dc2f09a21cb4b1b45.zip
Rules parsing.
-rw-r--r--src/resources/pagoda.properties4
-rw-r--r--src/uk/ac/ox/cs/pagoda/hermit/RuleHelper.java83
-rw-r--r--src/uk/ac/ox/cs/pagoda/multistage/MultiStageUpperProgram.java1
-rw-r--r--src/uk/ac/ox/cs/pagoda/multistage/treatement/Pick4NegativeConcept.java1
-rw-r--r--src/uk/ac/ox/cs/pagoda/reasoner/ELHOUQueryReasoner.java2
-rw-r--r--src/uk/ac/ox/cs/pagoda/reasoner/HermiTReasoner.java2
-rw-r--r--src/uk/ac/ox/cs/pagoda/reasoner/MyQueryReasoner.java8
-rw-r--r--src/uk/ac/ox/cs/pagoda/rules/DatalogProgram.java51
-rw-r--r--src/uk/ac/ox/cs/pagoda/rules/GeneralProgram.java2
-rw-r--r--src/uk/ac/ox/cs/pagoda/rules/LowerDatalogProgram.java3
-rw-r--r--src/uk/ac/ox/cs/pagoda/rules/Program.java37
-rw-r--r--src/uk/ac/ox/cs/pagoda/rules/approximators/LimitedSkolemisationApproximator.java2
-rw-r--r--src/uk/ac/ox/cs/pagoda/rules/clauses/Conjunction.java4
-rw-r--r--src/uk/ac/ox/cs/pagoda/rules/clauses/DLClause.java12
-rw-r--r--test/resources/MiscellaneousTests.xml12
-rw-r--r--test/uk/ac/ox/cs/pagoda/hermit/TestRuleHelper.java319
16 files changed, 484 insertions, 59 deletions
diff --git a/src/resources/pagoda.properties b/src/resources/pagoda.properties
index e6aa503..dab8388 100644
--- a/src/resources/pagoda.properties
+++ b/src/resources/pagoda.properties
@@ -1,8 +1,8 @@
1debug=true 1debug=true
2useAlwaysSimpleUpperBound=false 2useAlwaysSimpleUpperBound=false
3skolemUpperBound=DISABLED 3#skolemUpperBound=DISABLED
4#skolemUpperBound=BEFORE_SUMMARISATION 4#skolemUpperBound=BEFORE_SUMMARISATION
5#skolemUpperBound=AFTER_SUMMARISATION 5skolemUpperBound=AFTER_SUMMARISATION
6skolemDepth=1 6skolemDepth=1
7toCallHermit=true 7toCallHermit=true
8 8
diff --git a/src/uk/ac/ox/cs/pagoda/hermit/RuleHelper.java b/src/uk/ac/ox/cs/pagoda/hermit/RuleHelper.java
index 81c99a4..43c5849 100644
--- a/src/uk/ac/ox/cs/pagoda/hermit/RuleHelper.java
+++ b/src/uk/ac/ox/cs/pagoda/hermit/RuleHelper.java
@@ -2,9 +2,16 @@ package uk.ac.ox.cs.pagoda.hermit;
2 2
3import org.semanticweb.HermiT.model.*; 3import org.semanticweb.HermiT.model.*;
4import uk.ac.ox.cs.pagoda.MyPrefixes; 4import uk.ac.ox.cs.pagoda.MyPrefixes;
5import uk.ac.ox.cs.pagoda.owl.OWLHelper;
5import uk.ac.ox.cs.pagoda.util.Namespace; 6import uk.ac.ox.cs.pagoda.util.Namespace;
6 7
8import java.security.InvalidParameterException;
9import java.util.ArrayList;
10
7public class RuleHelper { 11public class RuleHelper {
12 private static final String OR = "|";
13 private static final String IF = ":-";
14 private static final String AND = ",";
8 15
9// public static String abbreviateIRI(String text) { 16// public static String abbreviateIRI(String text) {
10// String prefixName, prefixIRI; 17// String prefixName, prefixIRI;
@@ -37,16 +44,16 @@ public class RuleHelper {
37 boolean lastSpace = true; 44 boolean lastSpace = true;
38 for (Atom headAtom: clause.getHeadAtoms()) { 45 for (Atom headAtom: clause.getHeadAtoms()) {
39 if ((atomText = getText(headAtom)) == null) continue; 46 if ((atomText = getText(headAtom)) == null) continue;
40 if (!lastSpace) buf.append(" v "); 47 if (!lastSpace) buf.append(" ").append(OR).append(" ");
41 buf.append(atomText); 48 buf.append(atomText);
42 lastSpace = false; 49 lastSpace = false;
43 } 50 }
44 buf.append(" :- "); 51 buf.append(" ").append(IF).append(" ");
45 lastSpace = true; 52 lastSpace = true;
46 for (Atom bodyAtom: clause.getBodyAtoms()) { 53 for (Atom bodyAtom: clause.getBodyAtoms()) {
47// for (String str: strs[1].split(", ")) { 54// for (String str: strs[1].split(", ")) {
48 if ((atomText = getText(bodyAtom)) == null) continue; 55 if ((atomText = getText(bodyAtom)) == null) continue;
49 if (!lastSpace) buf.append(", "); 56 if (!lastSpace) buf.append(AND).append(" ");
50 buf.append(atomText); 57 buf.append(atomText);
51 lastSpace = false; 58 lastSpace = false;
52 } 59 }
@@ -74,7 +81,7 @@ public class RuleHelper {
74 else builder.append(getText(p)); 81 else builder.append(getText(p));
75 builder.append("("); 82 builder.append("(");
76 builder.append(getText(atom.getArgument(0))); 83 builder.append(getText(atom.getArgument(0)));
77 builder.append(","); 84 builder.append(",");
78 builder.append(getText(atom.getArgument(1))); 85 builder.append(getText(atom.getArgument(1)));
79 builder.append(")"); 86 builder.append(")");
80 } 87 }
@@ -95,4 +102,72 @@ public class RuleHelper {
95 return MyPrefixes.PAGOdAPrefixes.abbreviateIRI(t.toString()); 102 return MyPrefixes.PAGOdAPrefixes.abbreviateIRI(t.toString());
96 } 103 }
97 104
105 public static Term parseTerm(String s) {
106 s = s.trim();
107 if(s.startsWith("?")) return Variable.create(s.substring(1));
108 return Individual.create(MyPrefixes.PAGOdAPrefixes.expandIRI(s));
109 }
110
111 public static Atom parseAtom(String s) {
112 s = s.trim();
113
114 String[] split = s.split("\\(");
115 String predicateIri = OWLHelper.removeAngles(MyPrefixes.PAGOdAPrefixes.expandText(split[0]));
116 String[] predicateArgs = split[1].substring(0, split[1].length() - 1).split(",");
117 int numOfargs = predicateArgs.length;
118 Term terms[] = new Term[predicateArgs.length];
119 for (int i = 0; i < terms.length; i++)
120 terms[i] = parseTerm(predicateArgs[i]);
121 if(numOfargs == 1) {
122 AtomicConcept atomicConcept = AtomicConcept.create(predicateIri);
123 return Atom.create(atomicConcept, terms);
124 }
125 else if(numOfargs == 2) {
126 AtomicRole atomicRole = AtomicRole.create(predicateIri);
127 return Atom.create(atomicRole, terms);
128 }
129 else
130 throw new InvalidParameterException();
131 // TODO? add equality (owl:sameAs)?
132 }
133
134 public static DLClause parseClause(String s) {
135 s = s.trim();
136 if(s.endsWith(".")) s = s.substring(0, s.length()-1).trim();
137
138 String[] headAndBody = s.split(IF);
139 String[] headAtomsStr = splitAtoms(headAndBody[0], OR);
140 String[] bodyAtomsStr = splitAtoms(headAndBody[1], AND);
141
142 Atom[] headAtoms = new Atom[headAtomsStr.length];
143 Atom[] bodyAtoms = new Atom[bodyAtomsStr.length];
144 for (int i = 0; i < headAtoms.length; i++)
145 headAtoms[i] = parseAtom(headAtomsStr[i]);
146 for (int i = 0; i < bodyAtoms.length; i++)
147 bodyAtoms[i] = parseAtom(bodyAtomsStr[i]);
148
149 return DLClause.create(headAtoms, bodyAtoms);
150 }
151
152 private static String[] splitAtoms(String s, String operator) {
153 char op = operator.charAt(0);
154 ArrayList<String> result = new ArrayList<>();
155
156 int b = 0;
157 boolean betweenParenthesis = false;
158 for (int i = 0; i < s.length(); i++) {
159 if(s.charAt(i) == '(')
160 betweenParenthesis = true;
161 else if(s.charAt(i) == ')')
162 betweenParenthesis = false;
163 else if(s.charAt(i) == op && !betweenParenthesis) {
164 result.add(s.substring(b, i));
165 b = i + 1;
166 }
167 }
168 if(b < s.length()) result.add(s.substring(b));
169
170 return result.toArray(new String[0]);
171 }
172
98} 173}
diff --git a/src/uk/ac/ox/cs/pagoda/multistage/MultiStageUpperProgram.java b/src/uk/ac/ox/cs/pagoda/multistage/MultiStageUpperProgram.java
index 1664c99..e64c5e6 100644
--- a/src/uk/ac/ox/cs/pagoda/multistage/MultiStageUpperProgram.java
+++ b/src/uk/ac/ox/cs/pagoda/multistage/MultiStageUpperProgram.java
@@ -193,6 +193,7 @@ public abstract class MultiStageUpperProgram {
193 193
194 public abstract Collection<Violation> isIntegrated(MultiStageQueryEngine engine, boolean incrementally); 194 public abstract Collection<Violation> isIntegrated(MultiStageQueryEngine engine, boolean incrementally);
195 195
196 // TODO -RULE-
196 protected Violation violate(MultiStageQueryEngine engine, DLClause clause, boolean incrementally) { 197 protected Violation violate(MultiStageQueryEngine engine, DLClause clause, boolean incrementally) {
197 Utility.logTrace("checking constraint: " + clause); 198 Utility.logTrace("checking constraint: " + clause);
198 199
diff --git a/src/uk/ac/ox/cs/pagoda/multistage/treatement/Pick4NegativeConcept.java b/src/uk/ac/ox/cs/pagoda/multistage/treatement/Pick4NegativeConcept.java
index 687fa4a..3528788 100644
--- a/src/uk/ac/ox/cs/pagoda/multistage/treatement/Pick4NegativeConcept.java
+++ b/src/uk/ac/ox/cs/pagoda/multistage/treatement/Pick4NegativeConcept.java
@@ -49,6 +49,7 @@ public abstract class Pick4NegativeConcept extends Treatment {
49 tripleManager.addTripleByID(tripleManager.getInstance(gapAtom, assignment)); 49 tripleManager.addTripleByID(tripleManager.getInstance(gapAtom, assignment));
50 } 50 }
51 51
52 // TODO -RULE-
52 protected boolean makeSatisfied(Violation violation, Comparator<Atom> comp) { 53 protected boolean makeSatisfied(Violation violation, Comparator<Atom> comp) {
53 LinkedList<AnswerTupleID> tuples = violation.getTuples(); 54 LinkedList<AnswerTupleID> tuples = violation.getTuples();
54 DLClause constraint = violation.getConstraint(); 55 DLClause constraint = violation.getConstraint();
diff --git a/src/uk/ac/ox/cs/pagoda/reasoner/ELHOUQueryReasoner.java b/src/uk/ac/ox/cs/pagoda/reasoner/ELHOUQueryReasoner.java
index a56a793..15dfa03 100644
--- a/src/uk/ac/ox/cs/pagoda/reasoner/ELHOUQueryReasoner.java
+++ b/src/uk/ac/ox/cs/pagoda/reasoner/ELHOUQueryReasoner.java
@@ -117,7 +117,7 @@ class ELHOUQueryReasoner extends QueryReasoner {
117 } 117 }
118 118
119 OWLOntology ontology = o; 119 OWLOntology ontology = o;
120 program = new DatalogProgram(ontology, properties.getToClassify()); 120 program = new DatalogProgram(ontology);
121 121
122 importData(program.getAdditionalDataFile()); 122 importData(program.getAdditionalDataFile());
123 123
diff --git a/src/uk/ac/ox/cs/pagoda/reasoner/HermiTReasoner.java b/src/uk/ac/ox/cs/pagoda/reasoner/HermiTReasoner.java
index 15eb9e8..ac62488 100644
--- a/src/uk/ac/ox/cs/pagoda/reasoner/HermiTReasoner.java
+++ b/src/uk/ac/ox/cs/pagoda/reasoner/HermiTReasoner.java
@@ -52,7 +52,7 @@ class HermiTReasoner extends QueryReasoner {
52 e.printStackTrace(); 52 e.printStackTrace();
53 } 53 }
54 54
55 DatalogProgram datalogProgram = new DatalogProgram(tbox, false); 55 DatalogProgram datalogProgram = new DatalogProgram(tbox);
56 importData(datalogProgram.getAdditionalDataFile()); 56 importData(datalogProgram.getAdditionalDataFile());
57 upperStore = new MultiStageQueryEngine("rl-upper", false); 57 upperStore = new MultiStageQueryEngine("rl-upper", false);
58 upperStore.importRDFData("data", getImportedData()); 58 upperStore.importRDFData("data", getImportedData());
diff --git a/src/uk/ac/ox/cs/pagoda/reasoner/MyQueryReasoner.java b/src/uk/ac/ox/cs/pagoda/reasoner/MyQueryReasoner.java
index 8e28142..71d5752 100644
--- a/src/uk/ac/ox/cs/pagoda/reasoner/MyQueryReasoner.java
+++ b/src/uk/ac/ox/cs/pagoda/reasoner/MyQueryReasoner.java
@@ -68,7 +68,7 @@ class MyQueryReasoner extends QueryReasoner {
68 } 68 }
69 69
70 ontology = o; 70 ontology = o;
71 program = new DatalogProgram(ontology, properties.getToClassify()); 71 program = new DatalogProgram(ontology);
72// program.getLower().save(); 72// program.getLower().save();
73// program.getUpper().save(); 73// program.getUpper().save();
74// program.getGeneral().save(); 74// program.getGeneral().save();
@@ -154,7 +154,7 @@ class MyQueryReasoner extends QueryReasoner {
154// encoder = new TrackingRuleEncoderDisjVar2(program.getUpper(), trackingStore); 154// encoder = new TrackingRuleEncoderDisjVar2(program.getUpper(), trackingStore);
155// encoder = new TrackingRuleEncoderDisj2(program.getUpper(), trackingStore); 155// encoder = new TrackingRuleEncoderDisj2(program.getUpper(), trackingStore);
156 156
157 // TODO add consistency check by Skolem-upper-bound 157 // TODO? add consistency check by Skolem-upper-bound
158 158
159 if(!isConsistent()) 159 if(!isConsistent())
160 return false; 160 return false;
@@ -225,7 +225,7 @@ class MyQueryReasoner extends QueryReasoner {
225 @Override 225 @Override
226 public void evaluateUpper(QueryRecord queryRecord) { 226 public void evaluateUpper(QueryRecord queryRecord) {
227 if(isDisposed()) throw new DisposedException(); 227 if(isDisposed()) throw new DisposedException();
228 // TODO add new upper store 228 // TODO? add new upper store
229 AnswerTuples rlAnswer = null; 229 AnswerTuples rlAnswer = null;
230 boolean useFull = queryRecord.isBottom() || lazyUpperStore == null; 230 boolean useFull = queryRecord.isBottom() || lazyUpperStore == null;
231 try { 231 try {
@@ -388,7 +388,7 @@ class MyQueryReasoner extends QueryReasoner {
388 Utility.logInfo(">> Semi-Skolemisation <<"); 388 Utility.logInfo(">> Semi-Skolemisation <<");
389 t.reset(); 389 t.reset();
390 390
391 DatalogProgram relevantProgram = new DatalogProgram(relevantSubset, false); // toClassify is false 391 DatalogProgram relevantProgram = new DatalogProgram(relevantSubset);
392 392
393 MultiStageQueryEngine relevantStore = 393 MultiStageQueryEngine relevantStore =
394 new MultiStageQueryEngine("Relevant-store", true); // checkValidity is true 394 new MultiStageQueryEngine("Relevant-store", true); // checkValidity is true
diff --git a/src/uk/ac/ox/cs/pagoda/rules/DatalogProgram.java b/src/uk/ac/ox/cs/pagoda/rules/DatalogProgram.java
index 29e74c2..e2a171d 100644
--- a/src/uk/ac/ox/cs/pagoda/rules/DatalogProgram.java
+++ b/src/uk/ac/ox/cs/pagoda/rules/DatalogProgram.java
@@ -2,11 +2,12 @@ package uk.ac.ox.cs.pagoda.rules;
2 2
3import org.semanticweb.owlapi.model.OWLOntology; 3import org.semanticweb.owlapi.model.OWLOntology;
4import uk.ac.ox.cs.pagoda.constraints.BottomStrategy; 4import uk.ac.ox.cs.pagoda.constraints.BottomStrategy;
5import uk.ac.ox.cs.pagoda.constraints.PredicateDependency;
6import uk.ac.ox.cs.pagoda.constraints.UpperUnaryBottom; 5import uk.ac.ox.cs.pagoda.constraints.UpperUnaryBottom;
7import uk.ac.ox.cs.pagoda.util.disposable.Disposable; 6import uk.ac.ox.cs.pagoda.util.disposable.Disposable;
8import uk.ac.ox.cs.pagoda.util.disposable.DisposedException; 7import uk.ac.ox.cs.pagoda.util.disposable.DisposedException;
9 8
9import java.io.InputStream;
10
10public class DatalogProgram extends Disposable { 11public class DatalogProgram extends Disposable {
11 12
12 UpperDatalogProgram upperProgram = new UpperDatalogProgram(); 13 UpperDatalogProgram upperProgram = new UpperDatalogProgram();
@@ -15,14 +16,36 @@ public class DatalogProgram extends Disposable {
15 16
16 BottomStrategy upperBottom; 17 BottomStrategy upperBottom;
17 18
18 public DatalogProgram(OWLOntology o) { 19 public DatalogProgram(InputStream inputStream) {
19 lowerProgram = new LowerDatalogProgram(); 20 lowerProgram = new LowerDatalogProgram();
20 init(o, false); 21
22 upperProgram.load(inputStream, upperBottom = new UpperUnaryBottom());
23 lowerProgram.clone(upperProgram);
24 program.clone(upperProgram);
25
26 upperProgram.transform();
27 lowerProgram.transform();
28 program.transform();
29
30 program.buildDependencyGraph();
31 lowerProgram.dependencyGraph = upperProgram.buildDependencyGraph();
21 } 32 }
22 33
23 public DatalogProgram(OWLOntology o, boolean toClassify) { 34 public DatalogProgram(OWLOntology o) {
24 lowerProgram = new LowerDatalogProgram(toClassify); 35 lowerProgram = new LowerDatalogProgram();
25 init(o, toClassify); 36
37 upperProgram.load(o, upperBottom = new UpperUnaryBottom());
38// upperProgram.load(o, upperBottom = new UnaryBottom());
39 lowerProgram.clone(upperProgram);
40 program.clone(upperProgram);
41// program.botStrategy = new UnaryBottom();
42
43 upperProgram.transform();
44 lowerProgram.transform();
45 program.transform();
46
47 program.buildDependencyGraph();
48 lowerProgram.dependencyGraph = upperProgram.buildDependencyGraph();
26 } 49 }
27 50
28 public LowerDatalogProgram getLower() { 51 public LowerDatalogProgram getLower() {
@@ -55,20 +78,4 @@ public class DatalogProgram extends Disposable {
55 super.dispose(); 78 super.dispose();
56 if(upperProgram != null) upperProgram.deleteABoxTurtleFile(); 79 if(upperProgram != null) upperProgram.deleteABoxTurtleFile();
57 } 80 }
58
59 private void init(OWLOntology o, boolean forSemFacet) {
60 upperProgram.load(o, upperBottom = new UpperUnaryBottom());
61// upperProgram.load(o, upperBottom = new UnaryBottom());
62 lowerProgram.clone(upperProgram);
63 program.clone(upperProgram);
64// program.botStrategy = new UnaryBottom();
65
66 upperProgram.transform();
67 lowerProgram.transform();
68 program.transform();
69
70 program.buildDependencyGraph();
71 PredicateDependency graph = upperProgram.buildDependencyGraph();
72 lowerProgram.dependencyGraph = graph;
73 }
74} 81}
diff --git a/src/uk/ac/ox/cs/pagoda/rules/GeneralProgram.java b/src/uk/ac/ox/cs/pagoda/rules/GeneralProgram.java
index 01ab427..e390a29 100644
--- a/src/uk/ac/ox/cs/pagoda/rules/GeneralProgram.java
+++ b/src/uk/ac/ox/cs/pagoda/rules/GeneralProgram.java
@@ -15,7 +15,7 @@ public class GeneralProgram extends Program {
15 ontology = relevantOntology; 15 ontology = relevantOntology;
16 16
17 ontologyDirectory = null; 17 ontologyDirectory = null;
18 dlOntology = null; 18// dlOntology = null;
19 botStrategy = new UnaryBottom(); 19 botStrategy = new UnaryBottom();
20 20
21 clauses = botStrategy.process(relevantClauses); 21 clauses = botStrategy.process(relevantClauses);
diff --git a/src/uk/ac/ox/cs/pagoda/rules/LowerDatalogProgram.java b/src/uk/ac/ox/cs/pagoda/rules/LowerDatalogProgram.java
index 9930009..a2676e8 100644
--- a/src/uk/ac/ox/cs/pagoda/rules/LowerDatalogProgram.java
+++ b/src/uk/ac/ox/cs/pagoda/rules/LowerDatalogProgram.java
@@ -39,6 +39,7 @@ public class LowerDatalogProgram extends ApproxProgram implements IncrementalPro
39 } 39 }
40 40
41 41
42 // TODO -RULE- filter out unsafe rules
42 @Override 43 @Override
43 public void transform() { 44 public void transform() {
44 if (m_toClassify) { 45 if (m_toClassify) {
@@ -56,7 +57,7 @@ public class LowerDatalogProgram extends ApproxProgram implements IncrementalPro
56 else 57 else
57 super.transform(); 58 super.transform();
58 59
59 Normalisation norm = new Normalisation(dlOntology.getDLClauses(), ontology, new NullaryBottom()); 60 Normalisation norm = new Normalisation(dlClauses, ontology, new NullaryBottom());
60 BottomStrategy tBottom = new NullaryBottom(); 61 BottomStrategy tBottom = new NullaryBottom();
61 norm.process(); 62 norm.process();
62 for (DLClause nClause: norm.getNormlisedClauses()) { 63 for (DLClause nClause: norm.getNormlisedClauses()) {
diff --git a/src/uk/ac/ox/cs/pagoda/rules/Program.java b/src/uk/ac/ox/cs/pagoda/rules/Program.java
index a0edf85..de06f52 100644
--- a/src/uk/ac/ox/cs/pagoda/rules/Program.java
+++ b/src/uk/ac/ox/cs/pagoda/rules/Program.java
@@ -4,6 +4,7 @@ import org.apache.commons.io.FilenameUtils;
4import org.semanticweb.HermiT.Configuration; 4import org.semanticweb.HermiT.Configuration;
5import org.semanticweb.HermiT.model.*; 5import org.semanticweb.HermiT.model.*;
6import org.semanticweb.HermiT.structural.OWLClausification; 6import org.semanticweb.HermiT.structural.OWLClausification;
7import org.semanticweb.owlapi.apibinding.OWLManager;
7import org.semanticweb.owlapi.model.*; 8import org.semanticweb.owlapi.model.*;
8import org.semanticweb.simpleETL.SimpleETL; 9import org.semanticweb.simpleETL.SimpleETL;
9import uk.ac.ox.cs.pagoda.MyPrefixes; 10import uk.ac.ox.cs.pagoda.MyPrefixes;
@@ -13,6 +14,7 @@ import uk.ac.ox.cs.pagoda.constraints.BottomStrategy;
13import uk.ac.ox.cs.pagoda.constraints.NullaryBottom; 14import uk.ac.ox.cs.pagoda.constraints.NullaryBottom;
14import uk.ac.ox.cs.pagoda.constraints.PredicateDependency; 15import uk.ac.ox.cs.pagoda.constraints.PredicateDependency;
15import uk.ac.ox.cs.pagoda.hermit.DLClauseHelper; 16import uk.ac.ox.cs.pagoda.hermit.DLClauseHelper;
17import uk.ac.ox.cs.pagoda.hermit.RuleHelper;
16import uk.ac.ox.cs.pagoda.owl.OWLHelper; 18import uk.ac.ox.cs.pagoda.owl.OWLHelper;
17import uk.ac.ox.cs.pagoda.util.Utility; 19import uk.ac.ox.cs.pagoda.util.Utility;
18 20
@@ -23,7 +25,9 @@ public abstract class Program implements KnowledgeBase {
23 25
24 protected String ontologyDirectory = null; 26 protected String ontologyDirectory = null;
25 protected OWLOntology ontology; 27 protected OWLOntology ontology;
26 protected DLOntology dlOntology; 28// protected DLOntology dlOntology;
29 protected Set<DLClause> dlClauses = new HashSet<>();
30 protected Set<Atom> positiveFacts = new HashSet<>();
27 protected BottomStrategy botStrategy; 31 protected BottomStrategy botStrategy;
28 protected Collection<DLClause> clauses = new HashSet<DLClause>(); 32 protected Collection<DLClause> clauses = new HashSet<DLClause>();
29// protected Set<DLClause> used = new HashSet<DLClause>(); 33// protected Set<DLClause> used = new HashSet<DLClause>();
@@ -40,6 +44,24 @@ protected PredicateDependency dependencyGraph;
40 return sb.toString(); 44 return sb.toString();
41 } 45 }
42 46
47 public void load(InputStream rules, BottomStrategy botStrategy) {
48// this.botStrategy = botStrategy;
49// // fake instantiation
50 try {
51 load(OWLManager.createOWLOntologyManager().createOntology(), botStrategy);
52 } catch (OWLOntologyCreationException e) {
53 e.printStackTrace();
54 }
55
56 try(BufferedReader br = new BufferedReader(new InputStreamReader(rules))) {
57 String line;
58 while((line = br.readLine()) != null)
59 dlClauses.add(RuleHelper.parseClause(line));
60 } catch (IOException e) {
61 e.printStackTrace();
62 }
63 }
64
43 public void load(OWLOntology o, BottomStrategy botStrategy) { 65 public void load(OWLOntology o, BottomStrategy botStrategy) {
44 this.botStrategy = botStrategy; 66 this.botStrategy = botStrategy;
45 RLPlusOntology owlOntology = new RLPlusOntology(); 67 RLPlusOntology owlOntology = new RLPlusOntology();
@@ -57,7 +79,7 @@ protected PredicateDependency dependencyGraph;
57 OWLOntology abox = OWLHelper.loadOntology(aboxOWLFile); 79 OWLOntology abox = OWLHelper.loadOntology(aboxOWLFile);
58 OWLOntologyManager manager = abox.getOWLOntologyManager(); 80 OWLOntologyManager manager = abox.getOWLOntologyManager();
59 OWLAxiom axiom; 81 OWLAxiom axiom;
60 for (Atom atom: dlOntology.getPositiveFacts()) { 82 for (Atom atom: positiveFacts) {
61 if ((axiom = OWLHelper.getABoxAssertion(manager.getOWLDataFactory(), atom)) != null) 83 if ((axiom = OWLHelper.getABoxAssertion(manager.getOWLDataFactory(), atom)) != null)
62 manager.addAxiom(abox, axiom); 84 manager.addAxiom(abox, axiom);
63 } 85 }
@@ -90,7 +112,7 @@ protected PredicateDependency dependencyGraph;
90 112
91 @Override 113 @Override
92 public void transform() { 114 public void transform() {
93 for(DLClause dlClause : dlOntology.getDLClauses()) { 115 for(DLClause dlClause : dlClauses) {
94 DLClause simplifiedDLClause = DLClauseHelper.removeNominalConcept(dlClause); 116 DLClause simplifiedDLClause = DLClauseHelper.removeNominalConcept(dlClause);
95 simplifiedDLClause = removeAuxiliaryBodyAtoms(simplifiedDLClause); 117 simplifiedDLClause = removeAuxiliaryBodyAtoms(simplifiedDLClause);
96 simplifiedDLClause = DLClauseHelper.replaceWithDataValue(simplifiedDLClause); 118 simplifiedDLClause = DLClauseHelper.replaceWithDataValue(simplifiedDLClause);
@@ -190,7 +212,9 @@ protected PredicateDependency dependencyGraph;
190 void clone(Program program) { 212 void clone(Program program) {
191 this.ontologyDirectory = program.ontologyDirectory; 213 this.ontologyDirectory = program.ontologyDirectory;
192 this.ontology = program.ontology; 214 this.ontology = program.ontology;
193 this.dlOntology = program.dlOntology; 215// this.dlOntology = program.dlOntology;
216 this.dlClauses = program.dlClauses;
217 this.positiveFacts = program.positiveFacts;
194 this.botStrategy = program.botStrategy; 218 this.botStrategy = program.botStrategy;
195 this.additionalDataFile = program.additionalDataFile; 219 this.additionalDataFile = program.additionalDataFile;
196 this.transitiveAxioms = program.transitiveAxioms; 220 this.transitiveAxioms = program.transitiveAxioms;
@@ -248,8 +272,9 @@ protected PredicateDependency dependencyGraph;
248 } 272 }
249 Utility.logInfo("The number of data property range axioms that are ignored: " + noOfDataPropertyRangeAxioms + "(" + noOfAxioms + ")"); 273 Utility.logInfo("The number of data property range axioms that are ignored: " + noOfDataPropertyRangeAxioms + "(" + noOfAxioms + ")");
250 274
251 dlOntology = (DLOntology) clausifier.preprocessAndClausify(filteredOntology, null)[1]; 275 DLOntology dlOntology = (DLOntology) clausifier.preprocessAndClausify(filteredOntology, null)[1];
252 clausifier = null; 276 dlClauses = dlOntology.getDLClauses();
277 positiveFacts = dlOntology.getPositiveFacts();
253 } 278 }
254 279
255 private DLClause removeAuxiliaryBodyAtoms(DLClause dlClause) { 280 private DLClause removeAuxiliaryBodyAtoms(DLClause dlClause) {
diff --git a/src/uk/ac/ox/cs/pagoda/rules/approximators/LimitedSkolemisationApproximator.java b/src/uk/ac/ox/cs/pagoda/rules/approximators/LimitedSkolemisationApproximator.java
index 7d29c74..a140225 100644
--- a/src/uk/ac/ox/cs/pagoda/rules/approximators/LimitedSkolemisationApproximator.java
+++ b/src/uk/ac/ox/cs/pagoda/rules/approximators/LimitedSkolemisationApproximator.java
@@ -9,7 +9,7 @@ import java.util.ArrayList;
9import java.util.Collection; 9import java.util.Collection;
10import java.util.Collections; 10import java.util.Collections;
11 11
12/** 12/***
13 * Approximates existential rules through a limited form of Skolemisation. 13 * Approximates existential rules through a limited form of Skolemisation.
14 * <p> 14 * <p>
15 * Given a rule and a ground substitution, 15 * Given a rule and a ground substitution,
diff --git a/src/uk/ac/ox/cs/pagoda/rules/clauses/Conjunction.java b/src/uk/ac/ox/cs/pagoda/rules/clauses/Conjunction.java
deleted file mode 100644
index 91bb3e7..0000000
--- a/src/uk/ac/ox/cs/pagoda/rules/clauses/Conjunction.java
+++ /dev/null
@@ -1,4 +0,0 @@
1package uk.ac.ox.cs.pagoda.rules.clauses;
2
3public class Conjunction {
4}
diff --git a/src/uk/ac/ox/cs/pagoda/rules/clauses/DLClause.java b/src/uk/ac/ox/cs/pagoda/rules/clauses/DLClause.java
deleted file mode 100644
index 7394be0..0000000
--- a/src/uk/ac/ox/cs/pagoda/rules/clauses/DLClause.java
+++ /dev/null
@@ -1,12 +0,0 @@
1package uk.ac.ox.cs.pagoda.rules.clauses;
2
3public class DLClause extends Clause {
4
5// private DLClause(Atom[] headAtoms, Atom[] bodyAtoms) {
6// super(headAtoms, bodyAtoms);
7// }
8//
9// public static DLClause create(Atom[] headAtoms, Atom[] bodyAtoms) {
10// return s_interningManager.intern(new DLClause(headAtoms, bodyAtoms));
11// }
12}
diff --git a/test/resources/MiscellaneousTests.xml b/test/resources/MiscellaneousTests.xml
new file mode 100644
index 0000000..21b64f7
--- /dev/null
+++ b/test/resources/MiscellaneousTests.xml
@@ -0,0 +1,12 @@
1<?xml version="1.0" encoding="UTF-8"?>
2<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd" >
3
4<suite name="MiscellaneousTests">
5
6 <test name="RuleHelper">
7 <classes>
8 <class name="uk.ac.ox.cs.pagoda.hermit.TestRuleHelper" />
9 </classes>
10 </test>
11
12</suite> \ No newline at end of file
diff --git a/test/uk/ac/ox/cs/pagoda/hermit/TestRuleHelper.java b/test/uk/ac/ox/cs/pagoda/hermit/TestRuleHelper.java
new file mode 100644
index 0000000..3a2cad8
--- /dev/null
+++ b/test/uk/ac/ox/cs/pagoda/hermit/TestRuleHelper.java
@@ -0,0 +1,319 @@
1package uk.ac.ox.cs.pagoda.hermit;
2
3import org.testng.annotations.Test;
4import uk.ac.ox.cs.pagoda.MyPrefixes;
5import uk.ac.ox.cs.pagoda.owl.OWLHelper;
6import uk.ac.ox.cs.pagoda.rules.DatalogProgram;
7
8import java.io.ByteArrayInputStream;
9import java.io.InputStream;
10import java.nio.charset.Charset;
11
12public class TestRuleHelper {
13
14 @Test
15 public static void someTest() {
16 String prefixes = "PREFIX anony: <http://www.cs.ox.ac.uk/PAGOdA/skolemised#>\n" +
17 "PREFIX aux: <http://www.cs.ox.ac.uk/PAGOdA/auxiliary#>\n" +
18 "PREFIX owl: <http://www.w3.org/2002/07/owl#>\n" +
19 "PREFIX prefix0: <http://semantics.crl.ibm.com/univ-bench-dl.owl#>\n" +
20 "PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>\n" +
21 "PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>\n" +
22 "PREFIX ruleml: <http://www.w3.org/2003/11/ruleml#>\n" +
23 "PREFIX swrl: <http://www.w3.org/2003/11/swrl#>\n" +
24 "PREFIX swrlb: <http://www.w3.org/2003/11/swrlb#>\n" +
25 "PREFIX swrlx: <http://www.w3.org/2003/11/swrlx#>\n" +
26 "PREFIX xsd: <http://www.w3.org/2001/XMLSchema#>\n";
27 String rule = "owl:Nothing(?X) :- owl:Nothing2(?X).\n" +
28 "prefix0:WomanCollege(?X) :- prefix0:College(?X).\n" +
29 "owl:Nothing5(?X) :- prefix0:WomanCollege(?X), prefix0:hasStudent(?X,?Y), prefix0:Man(?Y).\n" +
30 "prefix0:SportsFan(?X) :- prefix0:Person(?X), prefix0:isCrazyAbout(?X,?Y), prefix0:Sports(?Y).\n" +
31 "prefix0:Organization(?X) :- prefix0:isAffiliateOf(?X,?Y).\n" +
32 "prefix0:Person(?X) :- prefix0:lastName(?X,?Y).\n" +
33 "owl:sameAs(?Y1,?Y2) :- prefix0:isHeadOf(?Y1,?X), prefix0:isHeadOf(?Y2,?X).\n" +
34 "prefix0:isMemberOf(?Y,?X) :- prefix0:hasMember(?X,?Y).\n" +
35 "prefix0:Person(?X) :- prefix0:hasMasterDegreeFrom(?X,?Y).\n" +
36 "prefix0:Person(?X) :- prefix0:TeachingAssistant(?X).\n" +
37 "prefix0:Employee(?X) :- prefix0:Person(?X), prefix0:worksFor(?X,?Y), prefix0:Organization(?Y).\n" +
38 "prefix0:FineArts(?X) :- prefix0:Media_Arts_And_ciencesClass(?X).\n" +
39 "prefix0:FineArts(?X) :- prefix0:Medieval_ArtsClass(?X).\n" +
40 "prefix0:Professor(?X) :- prefix0:Chair(?X).\n" +
41 "prefix0:Faculty(?Y) :- prefix0:isTaughtBy(?X,?Y).\n" +
42 "prefix0:worksFor(?X,anony:individual25) :- prefix0:Employee(?X).\n" +
43 "prefix0:Engineering(?X) :- prefix0:Chemical_EngineeringClass(?X).\n" +
44 "prefix0:BaseballClass(anony:individual1) :- prefix0:BaseballLover(?X).\n" +
45 "prefix0:Course(?Y) :- prefix0:listedCourse(?X,?Y).\n" +
46 "prefix0:worksFor(?X,?Y) :- prefix0:isHeadOf(?X,?Y).\n" +
47 "prefix0:Faculty(?X) :- prefix0:teacherOf(?X,?Y).\n" +
48 "prefix0:Course(?Y) :- prefix0:teachingAssistantOf(?X,?Y).\n" +
49 "owl:Nothing(?X) :- owl:Nothing1(?X).\n" +
50 "prefix0:Person(?X) :- prefix0:Student(?X).\n" +
51 "prefix0:isFriendOf(?Y,?X) :- prefix0:isFriendOf(?X,?Y).\n" +
52 "prefix0:Student(?X) :- prefix0:UndergraduateStudent(?X).\n" +
53 "prefix0:Person(?X) :- prefix0:BasketBallLover(?X).\n" +
54 "prefix0:Person(?Y) :- prefix0:hasSameHomeTownWith(?X,?Y).\n" +
55 "prefix0:Employee(?X) :- prefix0:Faculty(?X).\n" +
56 "prefix0:Insterest(?X) :- prefix0:Music(?X).\n" +
57 "owl:Nothing1(?X) :- prefix0:NonScienceStudent(?X), prefix0:hasMajor(?X,?Y), prefix0:Science(?Y).\n" +
58 "owl:sameAs(?Y1,?Y2) :- prefix0:isTaughtBy(?X,?Y1), prefix0:isTaughtBy(?X,?Y2).\n" +
59 "prefix0:hasStudent(?Y,?X) :- prefix0:isStudentOf(?X,?Y).\n" +
60 "prefix0:Student(?X) :- prefix0:ScienceStudent(?X).\n" +
61 "prefix0:like(?X,anony:individual7) :- prefix0:PeopleWithHobby(?X).\n" +
62 "prefix0:Publication(?X) :- prefix0:Article(?X).\n" +
63 "prefix0:isTaughtBy(?Y,?X) :- prefix0:teacherOf(?X,?Y).\n" +
64 "prefix0:isCrazyAbout(?X,anony:individual19) :- prefix0:TennisFan(?X).\n" +
65 "prefix0:Science(?X) :- prefix0:Marine_ScienceClass(?X).\n" +
66 "prefix0:SupportingStaff(?X) :- prefix0:SystemsStaff(?X).\n" +
67 "prefix0:hasStudent(?X,anony:individual10) :- prefix0:College(?X).\n" +
68 "prefix0:FineArts(?X) :- prefix0:Theatre_and_DanceClass(?X).\n" +
69 "prefix0:Organization(?Y) :- prefix0:subOrganizationOf(?X,?Y).\n" +
70 "prefix0:Engineering(?X) :- prefix0:Materical_Science_EngineeringClass(?X).\n" +
71 "prefix0:hasMember(?Y,?X) :- prefix0:isMemberOf(?X,?Y).\n" +
72 "prefix0:Student(?Y) :- prefix0:hasStudent(?X,?Y).\n" +
73 "owl:Nothing(?X) :- owl:Nothing5(?X).\n" +
74 "prefix0:isCrazyAbout(?X,anony:individual18) :- prefix0:SwimmingFan(?X).\n" +
75 "prefix0:Publication(?Y) :- prefix0:orgPublication(?X,?Y).\n" +
76 "prefix0:Chair(?X) :- prefix0:Person(?X), prefix0:isHeadOf(?X,?Y), prefix0:Department(?Y).\n" +
77 "prefix0:isStudentOf(?Y,?X) :- prefix0:hasStudent(?X,?Y).\n" +
78 "prefix0:Person(?X) :- prefix0:isAdvisedBy(?X,?Y).\n" +
79 "prefix0:hasMajor(?X,anony:individual2) :- prefix0:Student(?X).\n" +
80 "prefix0:Publication(?X) :- prefix0:publicationDate(?X,?Y).\n" +
81 "owl:Nothing(?X) :- owl:Nothing6(?X).\n" +
82 "prefix0:Director(?X) :- prefix0:Person(?X), prefix0:isHeadOf(?X,?Y), prefix0:Program(?Y).\n" +
83 "prefix0:Professor(?X) :- prefix0:AssociateProfessor(?X).\n" +
84 "prefix0:TeachingAssistant(?X) :- prefix0:Person(?X), prefix0:teachingAssistantOf(?X,?Y), prefix0:Course(?Y).\n" +
85 "prefix0:Research(?Y) :- prefix0:researchProject(?X,?Y).\n" +
86 "prefix0:TeachingAssistant(?X) :- prefix0:teachingAssistantOf(?X,?Y).\n" +
87 "prefix0:University(?X) :- prefix0:hasAlumnus(?X,?Y).\n" +
88 "prefix0:Faculty(?X) :- prefix0:Lecturer(?X).\n" +
89 "prefix0:isHeadOf(?X,anony:individual21) :- prefix0:Dean(?X).\n" +
90 "prefix0:like(?X,?Y) :- prefix0:isCrazyAbout(?X,?Y).\n" +
91 "prefix0:Person(?X) :- prefix0:hasSameHomeTownWith(?X,?Y).\n" +
92 "prefix0:Organization(?X) :- prefix0:orgPublication(?X,?Y).\n" +
93 "prefix0:Person(?Y) :- prefix0:hasMember(?X,?Y).\n" +
94 "prefix0:HumanitiesAndSocial(?X) :- prefix0:LinguisticsClass(?X).\n" +
95 "prefix0:Engineering(?X) :- prefix0:Aeronautical_EngineeringClass(?X).\n" +
96 "owl:Nothing(?X) :- owl:Nothing3(?X).\n" +
97 "prefix0:isHeadOf(?X,anony:individual12) :- prefix0:Director(?X).\n" +
98 "prefix0:Publication(?X) :- prefix0:publicationAuthor(?X,?Y).\n" +
99 "prefix0:Organization(?X) :- prefix0:College(?X).\n" +
100 "prefix0:isCrazyAbout(?X,anony:individual24) :- prefix0:BaseballFan(?X).\n" +
101 "prefix0:FineArts(?X) :- prefix0:Performing_ArtsClass(?X).\n" +
102 "prefix0:Sports(?X) :- prefix0:BasketBallClass(?X).\n" +
103 "prefix0:HumanitiesAndSocial(?X) :- prefix0:PsychologyClass(?X).\n" +
104 "prefix0:Person(?X) :- prefix0:Employee(?X).\n" +
105 "prefix0:FineArts(?X) :- prefix0:DramaClass(?X).\n" +
106 "prefix0:Faculty(?X) :- prefix0:PostDoc(?X).\n" +
107 "prefix0:University(?Y) :- prefix0:hasDoctoralDegreeFrom(?X,?Y).\n" +
108 "prefix0:Sports(anony:individual0) :- prefix0:SportsLover(?X).\n" +
109 "prefix0:Person(?Y) :- prefix0:hasAlumnus(?X,?Y).\n" +
110 "prefix0:FineArts(?X) :- prefix0:Modern_ArtsClass(?X).\n" +
111 "prefix0:hasMember(?X,?Y) :- prefix0:hasStudent(?X,?Y).\n" +
112 "prefix0:Course(?X) :- prefix0:isTaughtBy(?X,?Y).\n" +
113 "prefix0:NonScienceStudent(?X) :- prefix0:Student(?X).\n" +
114 "prefix0:BasketBallLover(?X) :- prefix0:Person(?X), prefix0:like(?X,?Y), prefix0:BasketBallClass(?Y).\n" +
115 "prefix0:Professor(?X) :- prefix0:VisitingProfessor(?X).\n" +
116 "prefix0:GraduateCourse(?Y) :- prefix0:GraduateStudent(?X), prefix0:takesCourse(?X,?Y).\n" +
117 "prefix0:TennisClass(anony:individual19) :- prefix0:TennisFan(?X).\n" +
118 "prefix0:Work(?X) :- prefix0:Research(?X).\n" +
119 "prefix0:TennisFan(?X) :- prefix0:Person(?X), prefix0:isCrazyAbout(?X,?Y), prefix0:TennisClass(?Y).\n" +
120 "prefix0:ScienceStudent(?X) :- prefix0:Student(?X), prefix0:hasMajor(?X,?Y), prefix0:Science(?Y).\n" +
121 "prefix0:Person(?X) :- prefix0:Woman(?X).\n" +
122 "prefix0:Man(?X) :- prefix0:Person(?X).\n" +
123 "prefix0:Person(?X) :- prefix0:hasUndergraduateDegreeFrom(?X,?Y).\n" +
124 "prefix0:ResearchGroup(?X) :- prefix0:researchProject(?X,?Y).\n" +
125 "prefix0:hasSameHomeTownWith(?X,?Z) :- prefix0:hasSameHomeTownWith(?X,?Y), prefix0:hasSameHomeTownWith(?Y,?Z).\n" +
126 "prefix0:Person(?X) :- prefix0:isFriendOf(?X,?Y).\n" +
127 "prefix0:Person(?Y) :- prefix0:publicationAuthor(?X,?Y).\n" +
128 "prefix0:Person(?X) :- prefix0:Chair(?X).\n" +
129 "prefix0:Publication(?X) :- prefix0:Manual(?X).\n" +
130 "prefix0:Publication(?X) :- prefix0:UnofficialPublication(?X).\n" +
131 "prefix0:Engineering(?X) :- prefix0:Industry_EngineeringClass(?X).\n" +
132 "prefix0:Science(?X) :- prefix0:StatisticsClass(?X).\n" +
133 "prefix0:Organization(?Y) :- prefix0:isStudentOf(?X,?Y).\n" +
134 "prefix0:SwimmingFan(?X) :- prefix0:Person(?X), prefix0:isCrazyAbout(?X,?Y), prefix0:SwimmingClass(?Y).\n" +
135 "prefix0:Person(?X) :- prefix0:emailAddress(?X,?Y).\n" +
136 "prefix0:FineArts(?X) :- prefix0:Latin_ArtsClass(?X).\n" +
137 "prefix0:Organization(?X) :- prefix0:ResearchGroup(?X).\n" +
138 "prefix0:AcademicSubject(?X) :- prefix0:HumanitiesAndSocial(?X).\n" +
139 "prefix0:Professor(?X) :- prefix0:Dean(?X).\n" +
140 "prefix0:SwimmingClass(anony:individual8) :- prefix0:SwimmingLover(?X).\n" +
141 "prefix0:University(?Y) :- prefix0:hasMasterDegreeFrom(?X,?Y).\n" +
142 "prefix0:Article(?X) :- prefix0:ConferencePaper(?X).\n" +
143 "prefix0:Person(?X) :- prefix0:BasketBallFan(?X).\n" +
144 "prefix0:HumanitiesAndSocial(?X) :- prefix0:ReligionsClass(?X).\n" +
145 "prefix0:Science(?X) :- prefix0:PhysicsClass(?X).\n" +
146 "prefix0:Dean(?X) :- prefix0:isHeadOf(?X,?Y), prefix0:College(?Y).\n" +
147 "prefix0:University(?Y) :- prefix0:hasDegreeFrom(?X,?Y).\n" +
148 "prefix0:Organization(?X) :- prefix0:hasMember(?X,?Y).\n" +
149 "prefix0:Engineering(?X) :- prefix0:Computer_EngineeringClass(?X).\n" +
150 "prefix0:Publication(?X) :- prefix0:Software(?X).\n" +
151 "prefix0:Science(?X) :- prefix0:GeosciencesClass(?X).\n" +
152 "prefix0:hasMajor(?X,anony:individual9) :- prefix0:ScienceStudent(?X).\n" +
153 "prefix0:hasDegreeFrom(?Y,?X) :- prefix0:hasAlumnus(?X,?Y).\n" +
154 "prefix0:Software(?X) :- prefix0:softwareDocumentation(?X,?Y).\n" +
155 "prefix0:isMemberOf(?X,?Y) :- prefix0:isStudentOf(?X,?Y).\n" +
156 "prefix0:Organization(?X) :- prefix0:hasStudent(?X,?Y).\n" +
157 "owl:Nothing2(?X) :- prefix0:GraduateCourse(?X), prefix0:GraduateCourse_neg(?X).\n" +
158 "prefix0:BaseballFan(?X) :- prefix0:Person(?X), prefix0:isCrazyAbout(?X,?Y), prefix0:BaseballClass(?Y).\n" +
159 "prefix0:Publication(?X) :- prefix0:publicationResearch(?X,?Y).\n" +
160 "prefix0:like(?X,anony:individual14) :- prefix0:PeopleWithManyHobbies(?X).\n" +
161 "prefix0:SportsLover(?X) :- prefix0:Person(?X), prefix0:like(?X,?Y), prefix0:Sports(?Y).\n" +
162 "prefix0:Organization(?X) :- prefix0:University(?X).\n" +
163 "prefix0:hasAlumnus(?Y,?X) :- prefix0:hasDegreeFrom(?X,?Y).\n" +
164 "prefix0:Science(?X) :- prefix0:Materials_ScienceClass(?X).\n" +
165 "prefix0:Professor(?X) :- prefix0:tenured(?X,?Y).\n" +
166 "prefix0:Faculty(?X) :- prefix0:Professor(?X).\n" +
167 "prefix0:Student(?X) :- prefix0:NonScienceStudent(?X).\n" +
168 "prefix0:Person(?X) :- prefix0:telephone(?X,?Y).\n" +
169 "prefix0:FineArts(?X) :- prefix0:ArchitectureClass(?X).\n" +
170 "prefix0:University(?Y) :- prefix0:hasUndergraduateDegreeFrom(?X,?Y).\n" +
171 "prefix0:Man(anony:individual10) :- prefix0:College(?X).\n" +
172 "prefix0:Person(?X) :- prefix0:Man(?X).\n" +
173 "prefix0:Person(?X) :- prefix0:title(?X,?Y).\n" +
174 "prefix0:subOrganizationOf(?X,?Z) :- prefix0:subOrganizationOf(?X,?Y), prefix0:subOrganizationOf(?Y,?Z).\n" +
175 "owl:sameAs(?Y1,?Y2) :- prefix0:like(?X,?Y1), prefix0:like(?X,?Y2).\n" +
176 "prefix0:takesCourse(?X,anony:individual4) :- prefix0:GraduateStudent(?X).\n" +
177 "prefix0:Sports(?X) :- prefix0:TennisClass(?X).\n" +
178 "prefix0:Engineering(?X) :- prefix0:Petroleuml_EngineeringClass(?X).\n" +
179 "prefix0:Organization(?X) :- prefix0:Institute(?X).\n" +
180 "prefix0:isCrazyAbout(?X,anony:individual16) :- prefix0:BasketBallFan(?X).\n" +
181 "prefix0:Science(?X) :- prefix0:BiologyClass(?X).\n" +
182 "prefix0:Person(?X) :- prefix0:SportsFan(?X).\n" +
183 "prefix0:Course(?X) :- prefix0:GraduateCourse(?X).\n" +
184 "prefix0:Person(?X) :- prefix0:Director(?X).\n" +
185 "prefix0:HumanitiesAndSocial(?X) :- prefix0:EconomicsClass(?X).\n" +
186 "prefix0:Person(?X) :- prefix0:BaseballLover(?X).\n" +
187 "prefix0:HumanitiesAndSocial(?X) :- prefix0:HistoryClass(?X).\n" +
188 "prefix0:FineArts(?X) :- prefix0:Asian_ArtsClass(?X).\n" +
189 "prefix0:isStudentOf(?X,?Y) :- prefix0:enrollIn(?X,?Y).\n" +
190 "prefix0:isHeadOf(?X,anony:individual20) :- prefix0:Chair(?X).\n" +
191 "prefix0:Person(?X) :- prefix0:PeopleWithHobby(?X).\n" +
192 "prefix0:Sports(anony:individual5) :- prefix0:SportsFan(?X).\n" +
193 "prefix0:Science(anony:individual9) :- prefix0:ScienceStudent(?X).\n" +
194 "prefix0:Engineering(?X) :- prefix0:Biomedical_EngineeringClass(?X).\n" +
195 "prefix0:HumanitiesAndSocial(?X) :- prefix0:Modern_LanguagesClass(?X).\n" +
196 "prefix0:like(?X,?Y) :- prefix0:love(?X,?Y).\n" +
197 "prefix0:hasStudent(?X,anony:individual11) :- prefix0:College(?X).\n" +
198 "prefix0:Science(?X) :- prefix0:ChemistryClass(?X).\n" +
199 "prefix0:Student(?X) :- prefix0:takesCourse(?X,?Y).\n" +
200 "prefix0:teacherOf(?Y,?X) :- prefix0:isTaughtBy(?X,?Y).\n" +
201 "prefix0:HumanitiesAndSocial(?X) :- prefix0:AnthropologyClass(?X).\n" +
202 "prefix0:Person(?X) :- prefix0:hasDegreeFrom(?X,?Y).\n" +
203 "prefix0:Person(?X) :- prefix0:hasDoctoralDegreeFrom(?X,?Y).\n" +
204 "prefix0:Engineering(?X) :- prefix0:Electrical_EngineeringClass(?X).\n" +
205 "owl:differentFrom(anony:individual13,anony:individual14) :- prefix0:PeopleWithManyHobbies(?X).\n" +
206 "prefix0:Person(?X) :- prefix0:SportsLover(?X).\n" +
207 "prefix0:Organization(?X) :- prefix0:subOrganizationOf(?X,?Y).\n" +
208 "prefix0:SwimmingLover(?X) :- prefix0:Person(?X), prefix0:like(?X,?Y), prefix0:SwimmingClass(?Y).\n" +
209 "prefix0:BaseballLover(?X) :- prefix0:Person(?X), prefix0:like(?X,?Y), prefix0:BaseballClass(?Y).\n" +
210 "prefix0:Science(?X) :- prefix0:Computer_ScienceClass(?X).\n" +
211 "prefix0:Sports(?X) :- prefix0:SwimmingClass(?X).\n" +
212 "prefix0:Science(?X) :- prefix0:AstronomyClass(?X).\n" +
213 "prefix0:Work(?X) :- prefix0:Course(?X).\n" +
214 "prefix0:Science(?X) :- prefix0:MathematicsClass(?X).\n" +
215 "prefix0:AcademicSubject(?X) :- prefix0:Engineering(?X).\n" +
216 "prefix0:hasDegreeFrom(?X,?Y) :- prefix0:hasUndergraduateDegreeFrom(?X,?Y).\n" +
217 "prefix0:like(?X,anony:individual15) :- prefix0:PeopleWithManyHobbies(?X).\n" +
218 "prefix0:Sports(?X) :- prefix0:BaseballClass(?X).\n" +
219 "prefix0:Student(?X) :- prefix0:isStudentOf(?X,?Y).\n" +
220 "prefix0:Professor(?Y) :- prefix0:isAdvisedBy(?X,?Y).\n" +
221 "prefix0:SwimmingClass(anony:individual18) :- prefix0:SwimmingFan(?X).\n" +
222 "prefix0:like(?X,anony:individual22) :- prefix0:BasketBallLover(?X).\n" +
223 "prefix0:like(?X,anony:individual1) :- prefix0:BaseballLover(?X).\n" +
224 "prefix0:Schedule(?X) :- prefix0:listedCourse(?X,?Y).\n" +
225 "owl:Nothing6(?X) :- owl:differentFrom(?X,?X).\n" +
226 "prefix0:PeopleWithManyHobbies(?X) :- prefix0:like(?X,?Y3).\n" +
227 "prefix0:Course(anony:individual23) :- prefix0:TeachingAssistant(?X).\n" +
228 "prefix0:takesCourse(?X,anony:individual3) :- prefix0:takesCourse(?X,?Y).\n" +
229 "prefix0:love(?X,?Y) :- prefix0:like(?X,?Y).\n" +
230 "prefix0:AcademicSubject(?X) :- prefix0:Science(?X).\n" +
231 "prefix0:Person(?X) :- prefix0:ResearchAssistant(?X).\n" +
232 "prefix0:Insterest(?X) :- prefix0:Sports(?X).\n" +
233 "prefix0:Article(?X) :- prefix0:TechnicalReport(?X).\n" +
234 "prefix0:UndergraduateStudent(?Y) :- prefix0:WomanCollege(?X), prefix0:hasStudent(?X,?Y).\n" +
235 "prefix0:Department(anony:individual20) :- prefix0:Chair(?X).\n" +
236 "prefix0:Woman(?X) :- prefix0:Person(?X).\n" +
237 "owl:Nothing4(?X) :- prefix0:UndergraduateStudent(?X), prefix0:UndergraduateStudent_neg(?X).\n" +
238 "prefix0:HumanitiesAndSocial(?X) :- prefix0:HumanitiesClass(?X).\n" +
239 "prefix0:GraduateCourse_neg(anony:individual3) :- prefix0:takesCourse(?X,?Y).\n" +
240 "prefix0:Organization(?Y) :- prefix0:isAffiliatedOrganizationOf(?X,?Y).\n" +
241 "owl:Nothing(?X) :- owl:Nothing4(?X).\n" +
242 "prefix0:like(?X,anony:individual0) :- prefix0:SportsLover(?X).\n" +
243 "prefix0:Research(?Y) :- prefix0:publicationResearch(?X,?Y).\n" +
244 "prefix0:Professor(?X) :- prefix0:AssistantProfessor(?X).\n" +
245 "prefix0:Program(anony:individual12) :- prefix0:Director(?X).\n" +
246 "prefix0:isMemberOf(?X,?Y) :- prefix0:worksFor(?X,?Y).\n" +
247 "prefix0:Organization(anony:individual25) :- prefix0:Employee(?X).\n" +
248 "prefix0:hasDegreeFrom(?X,?Y) :- prefix0:hasDoctoralDegreeFrom(?X,?Y).\n" +
249 "prefix0:Person(?Y) :- prefix0:isAffiliateOf(?X,?Y).\n" +
250 "prefix0:Student(?X) :- prefix0:Person(?X), prefix0:isStudentOf(?X,?Y), prefix0:Organization(?Y).\n" +
251 "prefix0:PeopleWithHobby(?X) :- prefix0:Person(?X), prefix0:like(?X,?Y).\n" +
252 "prefix0:Organization(anony:individual17) :- prefix0:Student(?X).\n" +
253 "prefix0:Engineering(?X) :- prefix0:Mechanical_EngineeringClass(?X).\n" +
254 "prefix0:Employee(?X) :- prefix0:SupportingStaff(?X).\n" +
255 "prefix0:Organization(?X) :- prefix0:Department(?X).\n" +
256 "prefix0:HumanitiesAndSocial(?X) :- prefix0:PhilosophyClass(?X).\n" +
257 "prefix0:College(anony:individual21) :- prefix0:Dean(?X).\n" +
258 "prefix0:UndergraduateStudent_neg(anony:individual11) :- prefix0:College(?X).\n" +
259 "owl:Nothing3(?X) :- prefix0:Man(?X), prefix0:Woman(?X).\n" +
260 "owl:sameAs(?Y1,?Y2) :- prefix0:takesCourse(?X,?Y1), prefix0:LeisureStudent(?X), prefix0:takesCourse(?X,?Y2).\n" +
261 "prefix0:Organization(?X) :- prefix0:isAffiliatedOrganizationOf(?X,?Y).\n" +
262 "prefix0:isCrazyAbout(?X,anony:individual5) :- prefix0:SportsFan(?X).\n" +
263 "prefix0:Software(?X) :- prefix0:softwareVersion(?X,?Y).\n" +
264 "prefix0:Science(anony:individual2) :- prefix0:Student(?X).\n" +
265 "prefix0:SupportingStaff(?X) :- prefix0:ClericalStaff(?X).\n" +
266 "prefix0:Person(?X) :- prefix0:SwimmingLover(?X).\n" +
267 "prefix0:Person(?X) :- prefix0:age(?X,?Y).\n" +
268 "prefix0:BasketBallClass(anony:individual22) :- prefix0:BasketBallLover(?X).\n" +
269 "prefix0:like(?X,anony:individual8) :- prefix0:SwimmingLover(?X).\n" +
270 "prefix0:Person(?X) :- prefix0:firstName(?X,?Y).\n" +
271 "prefix0:Department(?Y) :- prefix0:enrollIn(?X,?Y).\n" +
272 "prefix0:Publication(?Y) :- prefix0:softwareDocumentation(?X,?Y).\n" +
273 "prefix0:hasDegreeFrom(?X,?Y) :- prefix0:hasMasterDegreeFrom(?X,?Y).\n" +
274 "prefix0:AcademicSubject(?Y) :- prefix0:hasMajor(?X,?Y).\n" +
275 "prefix0:Article(?X) :- prefix0:JournalArticle(?X).\n" +
276 "prefix0:Organization(?X) :- prefix0:Program(?X).\n" +
277 "prefix0:Course(?Y) :- prefix0:teacherOf(?X,?Y).\n" +
278 "prefix0:AcademicSubject(?X) :- prefix0:FineArts(?X).\n" +
279 "prefix0:Person(?X) :- prefix0:TennisFan(?X).\n" +
280 "prefix0:GraduateStudent(?X) :- prefix0:takesCourse(?X,?Y).\n" +
281 "prefix0:BasketBallFan(?X) :- prefix0:Person(?X), prefix0:isCrazyAbout(?X,?Y), prefix0:BasketBallClass(?Y).\n" +
282 "prefix0:Publication(?X) :- prefix0:Specification(?X).\n" +
283 "prefix0:worksFor(?X,anony:individual6) :- prefix0:ResearchAssistant(?X).\n" +
284 "prefix0:Person(?X) :- prefix0:SwimmingFan(?X).\n" +
285 "prefix0:BasketBallClass(anony:individual16) :- prefix0:BasketBallFan(?X).\n" +
286 "prefix0:Person(?X) :- prefix0:BaseballFan(?X).\n" +
287 "prefix0:Person(?Y) :- prefix0:isFriendOf(?X,?Y).\n" +
288 "prefix0:like(?X,anony:individual13) :- prefix0:PeopleWithManyHobbies(?X).\n" +
289 "owl:differentFrom(anony:individual14,anony:individual15) :- prefix0:PeopleWithManyHobbies(?X).\n" +
290 "prefix0:hasSameHomeTownWith(?Y,?X) :- prefix0:hasSameHomeTownWith(?X,?Y).\n" +
291 "prefix0:ResearchGroup(anony:individual6) :- prefix0:ResearchAssistant(?X).\n" +
292 "prefix0:College(?X) :- prefix0:WomanCollege(?X).\n" +
293 "prefix0:BaseballClass(anony:individual24) :- prefix0:BaseballFan(?X).\n" +
294 "owl:differentFrom(anony:individual13,anony:individual15) :- prefix0:PeopleWithManyHobbies(?X).\n" +
295 "prefix0:Publication(?X) :- prefix0:Book(?X).\n" +
296 "prefix0:Professor(?X) :- prefix0:FullProfessor(?X).\n" +
297 "prefix0:Engineering(?X) :- prefix0:Civil_EngineeringClass(?X).\n" +
298 "prefix0:isStudentOf(?X,anony:individual17) :- prefix0:Student(?X).\n" +
299 "prefix0:HumanitiesAndSocial(?X) :- prefix0:EnglishClass(?X).\n" +
300 "prefix0:teachingAssistantOf(?X,anony:individual23) :- prefix0:TeachingAssistant(?X).\n" +
301 "prefix0:woman(?X) | prefix0:man(?X) :- prefix0:human(?X).\n" +
302 "prefix0:FineArts(?X) :- prefix0:MusicsClass(?X).\n";
303
304 for(String line: prefixes.split("\n")) {
305 String[] split = line.split(" ");
306 MyPrefixes.PAGOdAPrefixes.declarePrefix(split[1], OWLHelper.removeAngles(split[2]));
307 }
308
309 InputStream is = new ByteArrayInputStream(rule.getBytes(Charset.defaultCharset()));
310 DatalogProgram datalogProgram = new DatalogProgram(is);
311 System.out.println(">> General <<");
312 System.out.println(datalogProgram.getGeneral().toString());
313 System.out.println(">> Lower <<");
314 System.out.println(datalogProgram.getLower().toString());
315 System.out.println(">> Upper <<");
316 System.out.println(datalogProgram.getUpper().toString());
317 System.out.flush();
318 }
319}