blob: de2f87edd7e2981e4ceebbb5ab332d56fbb3f9c1 (
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
|
package org.semanticweb.karma2.model;
import java.util.LinkedHashSet;
import java.util.LinkedList;
import java.util.List;
import java.util.Set;
import org.semanticweb.HermiT.model.Atom;
import org.semanticweb.HermiT.model.Term;
import org.semanticweb.HermiT.model.Variable;
import uk.ac.ox.cs.JRDFox.Prefixes;
public class ExtendedConjunctiveQuery extends ConjunctiveQuery {
private Term[] ansTerms;
private Term[] terms;
public ExtendedConjunctiveQuery(
Atom[] queryAtoms, Term[] answerTerms, Prefixes pref) {
super(queryAtoms, getExtendedHead(queryAtoms, answerTerms), pref);
this.ansTerms = answerTerms.clone();
terms = getQueryTerms(queryAtoms);
}
public int getNumberOfRealAnswerTerms() {
return ansTerms.length;
}
public Term getRealAnswerTerm(int termIndex) {
return ansTerms[termIndex];
}
public int getNumberOfTerms() {
return terms.length;
}
public Term[] getTerms() {
return terms;
}
public Atom[] getAtoms() {
return m_queryAtoms;
}
public Term[] getRealAnswerTerms() {
return ansTerms;
}
private static Term[] getExtendedHead(Atom[] queryAtoms, Term[] answerTerms) {
List<Term> terms = new LinkedList<Term>();
for (Term t :answerTerms) {
terms.add(t);
}
for (Atom a : queryAtoms) {
if (a.getArgument(0) instanceof Variable && !terms.contains(a.getArgument(0)))
terms.add(a.getArgument(0));
if (a.getArity()> 1 && a.getArgument(1) instanceof Variable && !terms.contains(a.getArgument(1)))
terms.add(a.getArgument(1));
}
return terms.toArray(new Term[terms.size()]);
}
private static Term[] getQueryTerms(Atom[] queryAtoms) {
Set<Term> terms = new LinkedHashSet<Term>();
for (Atom a : queryAtoms) {
terms.add(a.getArgument(0));
if (a.getArity()> 1)
terms.add(a.getArgument(1));
}
return terms.toArray(new Term[terms.size()]);
}
public static ExtendedConjunctiveQuery computeExtension(ConjunctiveQuery q) {
Term[] answerTerms = new Term[q.getNumberOfAnswerTerms()];
for (int i = 0; i < q.getNumberOfAnswerTerms(); i++)
answerTerms[i] = q.getAnswerTerm(i);
Atom[] atoms = new Atom[q.getNumberOfQueryAtoms()];
for (int i = 0; i < q.getNumberOfQueryAtoms(); i++)
atoms[i] = q.getQueryAtom(i);
return new ExtendedConjunctiveQuery(atoms, answerTerms,q.prefixes);
}
public Term getTerm(int i) {
return terms[i];
}
}
|