aboutsummaryrefslogtreecommitdiff
path: root/src/uk/ac/ox/cs/pagoda/tracking/TrackingRuleEncoderWithoutGap.java
blob: f898114c3270d49e8e94ac11d3008f527281ac61 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
package uk.ac.ox.cs.pagoda.tracking;

import org.semanticweb.HermiT.model.*;
import org.semanticweb.owlapi.model.OWLClass;
import org.semanticweb.owlapi.model.OWLObjectProperty;
import org.semanticweb.owlapi.model.OWLOntology;
import uk.ac.ox.cs.pagoda.hermit.DLClauseHelper;
import uk.ac.ox.cs.pagoda.reasoner.light.BasicQueryEngine;
import uk.ac.ox.cs.pagoda.rules.UpperDatalogProgram;
import uk.ac.ox.cs.pagoda.util.Namespace;

import java.util.Collection;
import java.util.LinkedList;

public class TrackingRuleEncoderWithoutGap extends TrackingRuleEncoder {

	public TrackingRuleEncoderWithoutGap(UpperDatalogProgram program, BasicQueryEngine store) {
		super(program, store); 
	}
	
	@Override
	protected String getEqualityRelatedRuleText() {
		if (equalityRelatedRuleText != null) return equalityRelatedRuleText.replace("_tn", getTrackingPredicate("")); 
		
		Collection<DLClause> equalityRelatedClauses = new LinkedList<DLClause>(); 
		Variable X = Variable.create("X"); 
		AtomicRole trackingSameAs = AtomicRole.create(Namespace.EQUALITY + "_tn");  
		OWLOntology onto = program.getOntology();
		Atom[] headAtom, bodyAtom; 
		for (OWLClass cls: onto.getClassesInSignature(true)) {
			String clsIRI = cls.getIRI().toString(); 
			unaryPredicates.add(clsIRI); 
			headAtom = new Atom[] {Atom.create(trackingSameAs, X, X)}; 
			bodyAtom = new Atom[] {
					Atom.create(AtomicConcept.create(clsIRI + "_tn"), X),
//					Atom.create(AtomicConcept.create(GapTupleIterator.getGapPredicate(clsIRI)), X1), 
					Atom.create(AtomicConcept.create(clsIRI), X)}; 
			equalityRelatedClauses.add(DLClause.create(headAtom, bodyAtom)); 
		}
		Variable Y = Variable.create("Y"); 
		for (OWLObjectProperty prop: onto.getObjectPropertiesInSignature(true)) {
			String propIRI = prop.getIRI().toString();
			binaryPredicates.add(propIRI); 
			AtomicRole trackingRole = AtomicRole.create(propIRI + "_tn"); 
//			AtomicRole gapRole = AtomicRole.create(GapTupleIterator.getGapPredicate(propIRI)); 
			AtomicRole role = AtomicRole.create(propIRI); 
			headAtom = new Atom[] {Atom.create(trackingSameAs, X, X)}; 
			bodyAtom = new Atom[] {
					Atom.create(trackingRole, X, Y), 
//					Atom.create(gapRole, X1, Y), 
					Atom.create(role, X, Y)}; 
			equalityRelatedClauses.add(DLClause.create(headAtom, bodyAtom));
			
			bodyAtom = new Atom[] {
					Atom.create(trackingRole, Y, X), 
//					Atom.create(gapRole, Y, X1), 
					Atom.create(role, Y, X)}; 
			equalityRelatedClauses.add(DLClause.create(headAtom, bodyAtom)); 
		}
		
		equalityRelatedClauses.add(
				DLClause.create(
						new Atom[] {Atom.create(trackingSameAs, Y, X)}, 
						new Atom[] {Atom.create(trackingSameAs, X, Y)}));
		
		equalityRelatedRuleText = DLClauseHelper.toString(equalityRelatedClauses).toString();
		return equalityRelatedRuleText.replace("_tn", getTrackingPredicate(""));
	}

	@Override
	protected void encodingRule(DLClause clause) {
		LinkedList<Atom> newHeadAtoms = new LinkedList<Atom>();
		newHeadAtoms.add(Atom.create(selected, getIndividual4GeneralRule(clause)));
		
		Atom headAtom;
		for (Atom atom: clause.getBodyAtoms()) {
			headAtom = Atom.create(
					getTrackingDLPredicate(atom.getDLPredicate()), 
					DLClauseHelper.getArguments(atom));
			newHeadAtoms.add(headAtom);
		}

		DLClause newClause;
		Atom[] newBodyAtoms = new Atom[clause.getBodyLength() + 1];
		headAtom = clause.getHeadAtom(0);
		newBodyAtoms[0] = Atom.create(
				getTrackingDLPredicate(headAtom.getDLPredicate()), 
				DLClauseHelper.getArguments(headAtom));
		
//		newBodyAtoms[1] = Atom.create(
//				getGapDLPredicate(headAtom.getDLPredicate()), 
//				DLClauseHelper.getArguments(headAtom));

		for (int i = 0; i < clause.getBodyLength(); ++i)
			newBodyAtoms[i + 1] = clause.getBodyAtom(i); 
		
		for (Atom atom: newHeadAtoms) {
			newClause = DLClause.create(new Atom[] {atom}, newBodyAtoms); 
			trackingClauses.add(newClause);
		}
		
	}
}