aboutsummaryrefslogtreecommitdiff
path: root/src/uk/ac/ox/cs/pagoda/reasoner/IterativeRefinement.java
blob: 7847e7c2047d76e5264fb07194333539a03a8104 (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
104
105
106
107
108
109
110
111
112
113
114
115
116
117
package uk.ac.ox.cs.pagoda.reasoner;

import org.semanticweb.owlapi.model.OWLOntology;
import uk.ac.ox.cs.pagoda.constraints.BottomStrategy;
import uk.ac.ox.cs.pagoda.constraints.UpperUnaryBottom;
import uk.ac.ox.cs.pagoda.multistage.MultiStageQueryEngine;
import uk.ac.ox.cs.pagoda.query.AnswerTuples;
import uk.ac.ox.cs.pagoda.query.QueryRecord;
import uk.ac.ox.cs.pagoda.reasoner.light.BasicQueryEngine;
import uk.ac.ox.cs.pagoda.rules.GeneralProgram;
import uk.ac.ox.cs.pagoda.tracking.QueryTracker;
import uk.ac.ox.cs.pagoda.util.Utility;

import java.io.File;

public class IterativeRefinement {
	
	private static final int depthLimit = 1; 
	
	QueryRecord m_record;
	QueryTracker m_tracker; 
	BasicQueryEngine m_trackingStore;
	QueryRecord[] botQueryRecords;  
	
	int m_depth = 0;
	String tempDataFile = "temp.ttl";
	
	public IterativeRefinement(QueryRecord queryRecord, QueryTracker tracker, BasicQueryEngine trackingStore, QueryRecord[] botQueryRecords) {
		m_record = queryRecord;
		m_tracker = tracker;
		m_trackingStore = trackingStore;
		this.botQueryRecords = botQueryRecords;
	}

	public OWLOntology extractWithFullABox(String dataset, BottomStrategy upperBottom) {
		GeneralProgram program; 
		boolean update; 
		while (m_depth < depthLimit) {
			++m_depth;
			program = new GeneralProgram(m_record.getRelevantClauses(), m_record.getRelevantOntology());
			
			MultiStageQueryEngine tEngine = new MultiStageQueryEngine("query-tracking", true);
			try {
				tEngine.importRDFData("data", dataset);
				if (tEngine.materialise4SpecificQuery(program, m_record, upperBottom) != 1) {
					return m_record.getRelevantOntology(); 
				}
				
				AnswerTuples ans = null; 
				try {
					ans = tEngine.evaluate(m_record.getQueryText());
					update = m_record.updateUpperBoundAnswers(ans);
				} finally {
					if (ans != null) ans.dispose();
				}				
			} finally {
				tEngine.dispose();
			}

			if(m_record.isProcessed())
				return null;
			
			if (!update) break; 
			
			m_record.updateSubID();
			m_tracker.extract(m_trackingStore, botQueryRecords, true); 
		}
		
		return m_record.getRelevantOntology(); 
	}
	
	public OWLOntology extract(UpperUnaryBottom upperBottom) {
		GeneralProgram program; 
		boolean update; 
		while (m_depth < depthLimit) {
			m_record.saveABoxInTurtle(tempDataFile); 
			program = new GeneralProgram(m_record.getRelevantClauses(), m_record.getRelevantOntology());
			
			MultiStageQueryEngine tEngine = new MultiStageQueryEngine("query-tracking", true);
			try {
				tEngine.importRDFData("fragment abox", tempDataFile);
				if (tEngine.materialise4SpecificQuery(program, m_record, upperBottom) != 1) {
					return m_record.getRelevantOntology(); 
				}
				
				AnswerTuples ans = null; 
				try {
					ans = tEngine.evaluate(m_record.getQueryText()); 
					update = m_record.updateUpperBoundAnswers(ans);
				} finally {
					if (ans != null) ans.dispose();
				}
			} finally {
				tEngine.dispose();
			}

			if(m_record.isProcessed())
				return null;
			
			if (!update) break; 
			
			m_record.updateSubID();
			m_tracker.extract(m_trackingStore, botQueryRecords, true); 
		}
		
		return m_record.getRelevantOntology(); 
	}
	
	public void dispose() {
		File file = new File(tempDataFile);  
		if (file.exists()) {
			file.delete(); 
			Utility.logDebug(file.getAbsolutePath() + " is deleted.");
		}
	}

}