blob: 86185922444760c7a2df80013ed8534249c77ae6 [file] [log] [blame]
Eliza Margarethaf13b8ad2014-10-13 16:36:28 +00001package de.ids_mannheim.korap.index;
2
Eliza Margaretha51fd5c22014-10-14 13:12:33 +00003import static org.junit.Assert.assertEquals;
4
Eliza Margarethaf13b8ad2014-10-13 16:36:28 +00005import java.io.IOException;
6
7import org.apache.lucene.index.Term;
Eliza Margaretha2db5e232015-03-04 10:20:01 +00008import org.apache.lucene.search.spans.SpanQuery;
Eliza Margarethaf13b8ad2014-10-13 16:36:28 +00009import org.apache.lucene.search.spans.SpanTermQuery;
10import org.junit.Test;
11
Nils Diewalda14ecd62015-02-26 21:00:20 +000012import de.ids_mannheim.korap.KrillIndex;
Eliza Margaretha98c200e2014-10-15 13:59:58 +000013import de.ids_mannheim.korap.query.SpanAttributeQuery;
margarethaf70addb2015-04-27 13:17:18 +020014import de.ids_mannheim.korap.query.SpanClassQuery;
Eliza Margaretha3e50bc42014-10-22 15:29:15 +000015import de.ids_mannheim.korap.query.SpanElementQuery;
Eliza Margaretha2db5e232015-03-04 10:20:01 +000016import de.ids_mannheim.korap.query.SpanFocusQuery;
margarethaf70addb2015-04-27 13:17:18 +020017import de.ids_mannheim.korap.query.SpanRelationMatchQuery;
Eliza Margarethaf13b8ad2014-10-13 16:36:28 +000018import de.ids_mannheim.korap.query.SpanRelationQuery;
Eliza Margarethad12cabb2014-10-27 17:45:34 +000019import de.ids_mannheim.korap.query.SpanTermWithIdQuery;
Eliza Margaretha98c200e2014-10-15 13:59:58 +000020import de.ids_mannheim.korap.query.SpanWithAttributeQuery;
Eliza Margaretha2db5e232015-03-04 10:20:01 +000021import de.ids_mannheim.korap.response.Result;
Eliza Margarethaf13b8ad2014-10-13 16:36:28 +000022
Nils Diewaldbb33da22015-03-04 16:24:25 +000023/*
Nils Diewaldf399a672013-11-18 17:55:22 +000024
25within(x,y)
26
27SpanRelationQuery->
28rel("SUBJ", query1, query2)
29
301. return all words that are subjects of (that are linked by the “SUBJ” relation to) the string “beginnt”
31xip/syntax-dep_rel:beginnt >[func=”SUBJ”] xip/syntax-dep_rel:.*
Eliza Margarethaafe98122015-01-23 17:37:57 +000032-> rel("SUBJ", highlight(query1), new TermQuery("s:beginnt"))
Nils Diewaldf399a672013-11-18 17:55:22 +000033
34
35SUBJ ist modelliert mit offset für den gesamten Bereich
36
37https://de.wikipedia.org/wiki/Dependenzgrammatik
38
39im regiert Wasser
40dass die Kinder im Wasser gespielt haben
413. im#16-18$
423. >:COORD#16-25$3,4
434. Wasser#19-25$
444. <:COORD#16-25$3,4
45
46# okay: return all main verbs that have no “SUBJ” relation specified
47
48
49# Not okay: 5. return all verbs with (at least?) 3 outgoing relations [think of ditransitives such as give]
50
51xip/morph_pos:VERB & xip/token:.* & xip/token:.* & xip/token:.* & xip/token:.* & #1 _=_#2 & #2 >[func=$x] #3 & #2 >[func=$x]#4 & #2 >[func=$x] #5
52
53# Okay: return all verbs that have singular SUBJects and dative OBJects
54
55xip/morph_pos:VERB & mpt/morph_msd:Sg & mpt/morph_msd:Dat & #1 >[func=”SUBJ”] #2 & #1 >[func=”OBJ”] #3
56
57-> [p:VVFIN](>SUBJ[nr:sg] & >OBJ[c:dat])
58
59
Nils Diewaldbb33da22015-03-04 16:24:25 +000060 */
Eliza Margarethaf13b8ad2014-10-13 16:36:28 +000061
62public class TestRelationIndex {
Nils Diewaldbb33da22015-03-04 16:24:25 +000063 private KrillIndex ki;
64 private Result kr;
Eliza Margarethaf13b8ad2014-10-13 16:36:28 +000065
Nils Diewaldbb33da22015-03-04 16:24:25 +000066
67 public TestRelationIndex () throws IOException {
68 ki = new KrillIndex();
69 }
70
71
72 private FieldDocument createFieldDoc0 () {
73 FieldDocument fd = new FieldDocument();
Eliza Margarethaf13b8ad2014-10-13 16:36:28 +000074 fd.addString("ID", "doc-0");
Nils Diewaldbb33da22015-03-04 16:24:25 +000075 fd.addTV(
76 "base",
77 "ceccecdeed",
78 "[(0-1)s:c$<s>1|_0#0-1|>:xip/syntax-dep_rel$<i>6<s>1<s>1<s>1]"
79 + "[(1-2)s:e$<s>1|_1#1-2|<:xip/syntax-dep_rel$<i>9<s>1<s>1<s>1|>:xip/syntax-dep_rel$<i>4<s>1<s>1<s>1]"
80 + "[(2-3)s:c|_2#2-3]"
81 + "[(3-4)s:c$<s>1|s:b$<s>2|_3#3-4|<:xip/syntax-dep_rel$<i>9<s>1<s>1<s>1]"
82 + "[(4-5)s:e$<s>1|s:d$<s>2|_4#4-5|<:xip/syntax-dep_rel$<i>1<s>1<s>1<s>1]"
83 + "[(5-6)s:c|_5#5-6]"
84 + "[(6-7)s:d$<s>1|_6#6-7|<:xip/syntax-dep_rel$<i>1<s>1<s>1<s>1]"
85 + "[(7-8)s:e|_7#7-8]"
86 + "[(8-9)s:e|s:b|_8#8-9]"
87 + "[(9-10)s:d$<s>1|_9#9-10|>:xip/syntax-dep_rel$<i>1<s>2<s>1<s>1|>:xip/syntax-dep_rel$<i>3<s>1<s>1<s>1]");
Eliza Margarethaf13b8ad2014-10-13 16:36:28 +000088 return fd;
89 }
Nils Diewaldbb33da22015-03-04 16:24:25 +000090
91
92 private FieldDocument createFieldDoc1 () {
93 FieldDocument fd = new FieldDocument();
Eliza Margaretha51fd5c22014-10-14 13:12:33 +000094 fd.addString("ID", "doc-1");
Nils Diewaldbb33da22015-03-04 16:24:25 +000095 fd.addTV(
96 "base",
97 "ceccecdeed",
98 "[(0-1)s:c$<s>2|<>:p$#0-3$<i>3<s>1|_0#0-1|"
99 + ">:xip/syntax-dep_rel$<i>3<i>6<i>9<s>2<s>1<s>1|"
100 + ">:xip/syntax-dep_rel$<i>6<i>9<s>1<s>2<s>1|"
101 + "r@:func=subj$<s>2]"
102 + "[(1-2)s:e|_1#1-2|<>:p#1-3$<i>3<s>1]"
103 + "[(2-3)s:c|_2#2-3]"
104 + "[(3-4)s:c|s:b|_3#3-4]"
105 + "[(4-5)s:e|s:d|_4#4-5]"
106 + "[(5-6)s:c|_5#5-6]"
107 + "[(6-7)s:d$<s>2|<>:p$#6-9$<i>9<s>1|_6#6-7|"
108 + "<:xip/syntax-dep_rel$<i>9<b>0<i>1<s>1<s>1<s>2|"
109 + ">:xip/syntax-dep_rel$<i>9<b>0<i>9<s>3<s>1<s>1|"
110 + "<:xip/syntax-dep_rel$<i>9<i>1<i>3<s>2<s>1<s>1|"
111 + "r@:func=obj$<s>2]"
112 + "[(7-8)s:e|_7#7-8]"
113 + "[(8-9)s:e|s:b|_8#8-9]"
114 + "[(9-10)s:d$<s>1|_9#9-10|<:xip/syntax-dep_rel$<i>6<i>9<s>2<s>1<s>1]");
Eliza Margaretha51fd5c22014-10-14 13:12:33 +0000115 return fd;
116 }
Nils Diewaldbb33da22015-03-04 16:24:25 +0000117
118
margarethab097bac2015-04-15 11:37:02 +0200119 public static FieldDocument createFieldDoc2 () {
Nils Diewaldbb33da22015-03-04 16:24:25 +0000120 FieldDocument fd = new FieldDocument();
Eliza Margaretha98c200e2014-10-15 13:59:58 +0000121 fd.addString("ID", "doc-2");
Nils Diewaldbb33da22015-03-04 16:24:25 +0000122 fd.addTV(
123 "base",
124 "Ich kaufe die Blümen für meine Mutter.",
125 "[(0-3)s:Ich|_0#0-3|pos:NN$<s>1|<>:s#0-38$<i>7<s>2|<>:np#0-3$<i>1<s>3|"
126 + ">:child-of$<i>0<i>7<s>1<s>3<s>2|"
margaretha50c76332015-03-19 10:10:39 +0100127 + ">:child-of$<i>0<i>1<s>2<s>1<s>3|"
128 + "<:child-of$<i>0<s>3<s>3<s>1|"
Nils Diewaldbb33da22015-03-04 16:24:25 +0000129 + "<:child-of$<i>7<i>0<i>1<s>4<s>2<s>3|"
130 + "<:child-of$<i>7<i>1<i>7<s>5<s>2<s>2|"
margarethaf70addb2015-04-27 13:17:18 +0200131 + "<:dep$<i>0<s>2<s>1<s>1|"
Nils Diewaldbb33da22015-03-04 16:24:25 +0000132 + "r@:func=sbj$<i>0<i>7<s>1]"
133 +
134
135 "[(1-2)s:kaufe|_1#4-9|pos:V$<s>1|<>:vp#4-38$<i>7<s>2|"
margaretha50c76332015-03-19 10:10:39 +0100136 + ">:child-of$<i>7<i>0<i>7<s>6<s>2<s>2|"
137 + ">:child-of$<i>1<i>7<s>2<s>7<s>2|"
138 + "<:child-of$<i>7<b>0<i>2<s>8<s>2<s>1|"
139 + "<:child-of$<i>7<i>2<i>7<s>9<s>2<s>4|"
140 + ">:dep$<i>0<s>3<s>1<s>1|"
141 + ">:dep$<i>3<s>4<s>1<s>1]"
Nils Diewaldbb33da22015-03-04 16:24:25 +0000142 +
143
144 "[(2-3)s:die|_2#10-13|pos:ART$<s>1|tt:DET$<s>2|<>:np#10-20$<i>4<s>3|<>:np#10-38$<i>7<s>4|"
margaretha50c76332015-03-19 10:10:39 +0100145 + ">:child-of$<i>4<i>2<i>7<s>10<s>3<s>4|"
146 + ">:child-of$<i>2<i>4<s>11<s>1<s>3|"
147 + ">:child-of$<i>7<i>1<i>7<s>12<s>4<s>2|"
148 + "<:child-of$<i>4<b>0<i>2<s>13<s>3<s>1|"
149 + "<:child-of$<i>4<b>0<i>3<s>14<s>3<s>1|"
150 + "<:child-of$<i>7<i>2<i>4<s>15<s>4<s>3|"
151 + "<:child-of$<i>7<i>4<i>7<s>16<s>4<s>2|"
margarethaf70addb2015-04-27 13:17:18 +0200152 + ">:parent-of$<i>7<i>4<i>7<s>17<s>4<s>2|"
153 + "<:dep$<i>3<s>3<s>1<s>1]" +
Nils Diewaldbb33da22015-03-04 16:24:25 +0000154
155 "[(3-4)s:Blümen|_3#14-20|pos:NN$<s>1|"
margaretha50c76332015-03-19 10:10:39 +0100156 + ">:child-of$<i>2<i>4<s>17<s>1<s>3|"
157 + "<:dep$<i>1<s>2<s>1<s>1|" + ">:dep$<i>2<s>3<s>1<s>1|"
158 + ">:dep$<i>4<s>4<s>1<s>1|"
margarethaf70addb2015-04-27 13:17:18 +0200159 + "r@:func=head$<i>2<i>4<s>3|"
160 + "r@:func=obj$<i>2<i>4<s>3]" +
Nils Diewaldbb33da22015-03-04 16:24:25 +0000161
162 "[(4-5)s:für|_4#21-24|pos:PREP$<s>1|<>:pp#21-38$<i>7<s>2|"
margaretha50c76332015-03-19 10:10:39 +0100163 + ">:child-of$<i>4<i>7<s>18<s>1<s>2|"
164 + ">:child-of$<i>7<i>2<i>7<s>19<s>2<s>4|"
165 + "<:child-of$<i>7<b>0<i>5<s>20<s>2<s>1|"
166 + "<:child-of$<i>7<i>5<i>7<s>21<s>2<s>2|"
167 + "<:dep$<i>3<s>1<s>1<s>1|" + ">:dep$<i>6<s>3<s>1<s>1]"
Nils Diewaldbb33da22015-03-04 16:24:25 +0000168 +
169
170 "[(5-6)s:meine|_5#25-30|pos:ART$<s>1|<>:np#25-38$<i>7<s>2|"
margaretha50c76332015-03-19 10:10:39 +0100171 + ">:child-of$<i>5<i>7<s>22<s>1<s>2|"
172 + ">:child-of$<i>7<i>4<i>7<s>23<s>2<s>2|"
173 + "<:child-of$<i>7<b>0<i>5<s>24<s>2<s>1|"
174 + "<:child-of$<i>7<b>0<i>6<s>25<s>2<s>1|"
175 + "<:dep$<i>6<s>3<s>1<s>1]" +
Nils Diewaldbb33da22015-03-04 16:24:25 +0000176
177 "[(6-7)s:Mutter.|_6#31-38|pos:NN$<s>1|"
margaretha50c76332015-03-19 10:10:39 +0100178 + ">:child-of$<i>5<i>7<s>26<s>1<s>2|"
179 + ">:dep$<i>5<s>2<s>1<s>1|" + "<:dep$<i>4<s>3<s>1<s>1|"
180 + "r@:func=head$<i>5<i>7<s>3]");
Nils Diewaldbb33da22015-03-04 16:24:25 +0000181
Eliza Margaretha98c200e2014-10-15 13:59:58 +0000182 return fd;
183 }
Eliza Margaretha2db5e232015-03-04 10:20:01 +0000184
Eliza Margaretha2db5e232015-03-04 10:20:01 +0000185
Nils Diewaldbb33da22015-03-04 16:24:25 +0000186 /**
187 * Relations: token to token, token to span, span to span
188 * */
189 @Test
190 public void testCase1 () throws IOException {
191 ki.addDoc(createFieldDoc0());
192 ki.addDoc(createFieldDoc1());
193 ki.commit();
Eliza Margaretha2db5e232015-03-04 10:20:01 +0000194
Nils Diewaldbb33da22015-03-04 16:24:25 +0000195 SpanRelationQuery sq = new SpanRelationQuery(new SpanTermQuery(
196 new Term("base", ">:xip/syntax-dep_rel")), true);
197 kr = ki.search(sq, (short) 10);
Eliza Margaretha2db5e232015-03-04 10:20:01 +0000198
Nils Diewaldbb33da22015-03-04 16:24:25 +0000199 assertEquals((long) 7, kr.getTotalResults());
200 // token to token
201 assertEquals(0, kr.getMatch(0).getLocalDocID());
202 assertEquals(0, kr.getMatch(0).getStartPos());
203 assertEquals(1, kr.getMatch(0).getEndPos());
204 assertEquals(1, kr.getMatch(1).getStartPos());
205 assertEquals(2, kr.getMatch(1).getEndPos());
206 assertEquals(9, kr.getMatch(2).getStartPos());
207 assertEquals(10, kr.getMatch(2).getEndPos());
208 assertEquals(9, kr.getMatch(3).getStartPos());
209 assertEquals(10, kr.getMatch(3).getEndPos());
Eliza Margaretha2db5e232015-03-04 10:20:01 +0000210
Nils Diewaldbb33da22015-03-04 16:24:25 +0000211 // token to span
212 assertEquals(1, kr.getMatch(4).getLocalDocID());
213 assertEquals(0, kr.getMatch(4).getStartPos());
214 assertEquals(1, kr.getMatch(4).getEndPos());
215 assertEquals(0, kr.getMatch(5).getStartPos());
216 assertEquals(3, kr.getMatch(5).getEndPos());
Eliza Margaretha2db5e232015-03-04 10:20:01 +0000217
Nils Diewaldbb33da22015-03-04 16:24:25 +0000218 // span to span
219 assertEquals(6, kr.getMatch(6).getStartPos());
220 assertEquals(9, kr.getMatch(6).getEndPos());
Eliza Margaretha2db5e232015-03-04 10:20:01 +0000221
Nils Diewaldbb33da22015-03-04 16:24:25 +0000222 // check target
Eliza Margaretha2db5e232015-03-04 10:20:01 +0000223
Nils Diewaldbb33da22015-03-04 16:24:25 +0000224 }
225
226
227 /**
228 * Relation span to token
229 * */
230 @Test
231 public void testCase2 () throws IOException {
232 ki.addDoc(createFieldDoc0());
233 ki.addDoc(createFieldDoc1());
234 ki.commit();
235
236 SpanRelationQuery sq = new SpanRelationQuery(new SpanTermQuery(
237 new Term("base", "<:xip/syntax-dep_rel")), true);
238 kr = ki.search(sq, (short) 10);
239
240 assertEquals((long) 7, kr.getTotalResults());
241 // token to token
242 assertEquals(0, kr.getMatch(0).getLocalDocID());
243 assertEquals(1, kr.getMatch(0).getStartPos());
244 assertEquals(2, kr.getMatch(0).getEndPos());
245 assertEquals(3, kr.getMatch(1).getStartPos());
246 assertEquals(4, kr.getMatch(1).getEndPos());
247 assertEquals(4, kr.getMatch(2).getStartPos());
248 assertEquals(5, kr.getMatch(2).getEndPos());
249 assertEquals(6, kr.getMatch(3).getStartPos());
250 assertEquals(7, kr.getMatch(3).getEndPos());
251
252 assertEquals(1, kr.getMatch(4).getLocalDocID());
253 // span to token
254 assertEquals(6, kr.getMatch(4).getStartPos());
255 assertEquals(9, kr.getMatch(4).getEndPos());
256 assertEquals(6, kr.getMatch(5).getStartPos());
257 assertEquals(9, kr.getMatch(5).getEndPos());
258 // span to span
259 assertEquals(9, kr.getMatch(6).getStartPos());
260 assertEquals(10, kr.getMatch(6).getEndPos());
261 }
262
263
264 /**
margarethaf70addb2015-04-27 13:17:18 +0200265 * Relations only
Nils Diewaldbb33da22015-03-04 16:24:25 +0000266 * */
margaretha50c76332015-03-19 10:10:39 +0100267 @Test
268 public void testCase3 () throws IOException {
269 ki.addDoc(createFieldDoc2());
270 ki.commit();
Nils Diewaldbb33da22015-03-04 16:24:25 +0000271
margaretha50c76332015-03-19 10:10:39 +0100272 // child-of relations
273 SpanRelationQuery srq = new SpanRelationQuery(new SpanTermQuery(
274 new Term("base", ">:child-of")), true);
275 kr = ki.search(srq, (short) 20);
Nils Diewaldbb33da22015-03-04 16:24:25 +0000276
margaretha50c76332015-03-19 10:10:39 +0100277 assertEquals((long) 13, kr.getTotalResults());
278 assertEquals(0, kr.getMatch(0).getStartPos());
279 assertEquals(1, kr.getMatch(0).getEndPos());
280 assertEquals(0, kr.getMatch(1).getStartPos());
281 assertEquals(1, kr.getMatch(1).getEndPos());
282 assertEquals(1, kr.getMatch(2).getStartPos());
283 assertEquals(2, kr.getMatch(2).getEndPos());
284 assertEquals(1, kr.getMatch(3).getStartPos());
285 assertEquals(7, kr.getMatch(3).getEndPos());
286 assertEquals(2, kr.getMatch(4).getStartPos());
287 assertEquals(3, kr.getMatch(4).getEndPos());
288 assertEquals(2, kr.getMatch(5).getStartPos());
289 assertEquals(4, kr.getMatch(5).getEndPos());
Nils Diewaldbb33da22015-03-04 16:24:25 +0000290 }
Nils Diewaldbb33da22015-03-04 16:24:25 +0000291
Akronbb5d1732015-06-22 01:22:40 +0200292
margarethaf70addb2015-04-27 13:17:18 +0200293 /**
294 * Relations only with/out attribute
295 * */
margaretha50c76332015-03-19 10:10:39 +0100296 @Test
297 public void testCase4 () throws IOException {
298 ki.addDoc(createFieldDoc2());
299 ki.commit();
300
301 SpanRelationQuery srq = new SpanRelationQuery(new SpanTermQuery(
302 new Term("base", ">:child-of")), true);
303
margarethaf70addb2015-04-27 13:17:18 +0200304 SpanFocusQuery fq = new SpanFocusQuery(srq, srq.getTempClassNumbers());
305 fq.setMatchTemporaryClass(true);
306 fq.setRemoveTemporaryClasses(true);
307 fq.setSorted(false);
margaretha50c76332015-03-19 10:10:39 +0100308
margarethaf70addb2015-04-27 13:17:18 +0200309 // child-of with attr func=sbj
310 SpanWithAttributeQuery wq = new SpanWithAttributeQuery(fq,
Akronbb5d1732015-06-22 01:22:40 +0200311 new SpanAttributeQuery(new SpanTermQuery(new Term("base",
312 "r@:func=sbj")), true), true);
margaretha50c76332015-03-19 10:10:39 +0100313
314 kr = ki.search(wq, (short) 20);
315 assertEquals((long) 1, kr.getTotalResults());
316 assertEquals(0, kr.getMatch(0).getStartPos()); // token
317 assertEquals(7, kr.getMatch(0).getEndPos());
318
319 // child-of without attr func=sbj
margarethaf70addb2015-04-27 13:17:18 +0200320 wq = new SpanWithAttributeQuery(fq,
margaretha50c76332015-03-19 10:10:39 +0100321 new SpanAttributeQuery(new SpanTermQuery(new Term("base",
322 "r@:func=sbj")), true, true), true);
323 kr = ki.search(wq, (short) 20);
324 assertEquals((long) 12, kr.getTotalResults());
325 }
326
327
Nils Diewaldbb33da22015-03-04 16:24:25 +0000328 /**
margarethaf70addb2015-04-27 13:17:18 +0200329 * Relation directions <br/>
330 * Relation with specific sources, return the sources
Nils Diewaldbb33da22015-03-04 16:24:25 +0000331 * */
332 @Test
margaretha50c76332015-03-19 10:10:39 +0100333 public void testCase6 () throws IOException {
Eliza Margaretha2db5e232015-03-04 10:20:01 +0000334 ki.addDoc(createFieldDoc2());
335 ki.commit();
Nils Diewaldbb33da22015-03-04 16:24:25 +0000336
Eliza Margaretha2db5e232015-03-04 10:20:01 +0000337 // return all children that are NP
margarethaf70addb2015-04-27 13:17:18 +0200338 SpanElementQuery seq1 = new SpanElementQuery("base", "np");
339 SpanClassQuery scq1 = new SpanClassQuery(seq1, (byte) 1);
340
341 SpanRelationQuery srq = new SpanRelationQuery(new SpanTermQuery(
342 new Term("base", ">:child-of")), true);
343
344 SpanRelationMatchQuery rm = new SpanRelationMatchQuery(srq, scq1, true);
345 SpanFocusQuery rv = new SpanFocusQuery(rm, (byte) 1);
346 rv.setSorted(false);
Nils Diewaldbb33da22015-03-04 16:24:25 +0000347
margarethab9ee3e52015-05-04 12:42:23 +0200348 assertEquals(
349 "focus(1: focus(#[1,2]spanSegment(spanRelation(base:>:child-of), {1: <base:np />})))",
350 rv.toString());
351
Nils Diewaldbb33da22015-03-04 16:24:25 +0000352 kr = ki.search(rv, (short) 10);
Eliza Margaretha2db5e232015-03-04 10:20:01 +0000353
354 assertEquals(4, kr.getTotalResults());
Nils Diewaldbb33da22015-03-04 16:24:25 +0000355 assertEquals(0, kr.getMatch(0).getStartPos());
356 assertEquals(1, kr.getMatch(0).getEndPos());
357 assertEquals(2, kr.getMatch(1).getStartPos());
358 assertEquals(4, kr.getMatch(1).getEndPos());
359 assertEquals(2, kr.getMatch(2).getStartPos());
360 assertEquals(7, kr.getMatch(2).getEndPos());
361 assertEquals(5, kr.getMatch(3).getStartPos());
362 assertEquals(7, kr.getMatch(3).getEndPos());
363
Eliza Margaretha2db5e232015-03-04 10:20:01 +0000364 // return all parents that are NP
margarethaf70addb2015-04-27 13:17:18 +0200365 srq = new SpanRelationQuery(new SpanTermQuery(new Term("base",
366 "<:child-of")), true);
367 rm = new SpanRelationMatchQuery(srq, scq1, true);
368 rv = new SpanFocusQuery(rm, (byte) 1);
Nils Diewaldbb33da22015-03-04 16:24:25 +0000369 kr = ki.search(rv, (short) 10);
Eliza Margaretha2db5e232015-03-04 10:20:01 +0000370
371 assertEquals(7, kr.getTotalResults());
Nils Diewaldbb33da22015-03-04 16:24:25 +0000372 assertEquals(0, kr.getMatch(0).getStartPos());
373 assertEquals(1, kr.getMatch(0).getEndPos());
374 assertEquals(2, kr.getMatch(1).getStartPos());
375 assertEquals(4, kr.getMatch(1).getEndPos());
376 assertEquals(2, kr.getMatch(2).getStartPos());
377 assertEquals(4, kr.getMatch(2).getEndPos());
378 assertEquals(2, kr.getMatch(3).getStartPos());
379 assertEquals(7, kr.getMatch(3).getEndPos());
380 assertEquals(2, kr.getMatch(4).getStartPos());
381 assertEquals(7, kr.getMatch(4).getEndPos());
382 assertEquals(5, kr.getMatch(5).getStartPos());
383 assertEquals(7, kr.getMatch(5).getEndPos());
384 assertEquals(5, kr.getMatch(6).getStartPos());
385 assertEquals(7, kr.getMatch(6).getEndPos());
386 }
Eliza Margaretha2db5e232015-03-04 10:20:01 +0000387
Akronbb5d1732015-06-22 01:22:40 +0200388
margarethaf70addb2015-04-27 13:17:18 +0200389 /**
390 * Dependency relations with attribute
391 * */
392 @Test
Akronbb5d1732015-06-22 01:22:40 +0200393 public void testCase5 () throws IOException {
margarethaf70addb2015-04-27 13:17:18 +0200394 ki.addDoc(createFieldDoc2());
395 ki.commit();
396
397 // target of a dependency relation
398 SpanRelationQuery srq = new SpanRelationQuery(new SpanTermQuery(
399 new Term("base", "<:dep")), true);
400 kr = ki.search(srq, (short) 10);
401 assertEquals((long) 6, kr.getTotalResults());
402
403 SpanFocusQuery fq = new SpanFocusQuery(srq, srq.getTempClassNumbers());
404 fq.setMatchTemporaryClass(true);
405 fq.setRemoveTemporaryClasses(true);
406 // fq.setSorted(false);
407
408 kr = ki.search(fq, (short) 10);
409 assertEquals((long) 6, kr.getTotalResults());
410 // for (Match km : kr.getMatches()) {
411 // System.out.println(km.getStartPos() + "," + km.getEndPos()
412 // + " "
413 // + km.getSnippetBrackets());
414 // }
415 SpanAttributeQuery aq = new SpanAttributeQuery(new SpanTermQuery(
416 new Term("base", "r@:func=head")), true);
417 kr = ki.search(aq, (short) 10);
418
419 // dependency relation, which is also a head
420 SpanWithAttributeQuery wq = new SpanWithAttributeQuery(fq,
421 new SpanAttributeQuery(new SpanTermQuery(new Term("base",
422 "r@:func=head")), true), true);
423
424 kr = ki.search(wq, (short) 20);
425
426 assertEquals((long) 2, kr.getTotalResults());
427 assertEquals(2, kr.getMatch(0).getStartPos());
428 assertEquals(4, kr.getMatch(0).getEndPos());
429 assertEquals(5, kr.getMatch(1).getStartPos());
430 assertEquals(7, kr.getMatch(1).getEndPos());
431
432 }
Eliza Margaretha2db5e232015-03-04 10:20:01 +0000433
Akronbb5d1732015-06-22 01:22:40 +0200434
Nils Diewaldbb33da22015-03-04 16:24:25 +0000435 /**
margarethab9ee3e52015-05-04 12:42:23 +0200436 * Relation with specific sources, return any targets
Nils Diewaldbb33da22015-03-04 16:24:25 +0000437 * */
margaretha50c76332015-03-19 10:10:39 +0100438 @Test
439 public void testCase7 () throws IOException {
440 ki.addDoc(createFieldDoc2());
441 ki.commit();
Eliza Margarethad12cabb2014-10-27 17:45:34 +0000442
margarethab9ee3e52015-05-04 12:42:23 +0200443 // match all children that are NP
margarethaf70addb2015-04-27 13:17:18 +0200444 SpanElementQuery seq1 = new SpanElementQuery("base", "np");
445 SpanClassQuery scq1 = new SpanClassQuery(seq1, (byte) 1);
446
447 SpanRelationQuery srq = new SpanRelationQuery(new SpanTermQuery(
448 new Term("base", ">:child-of")), true);
449 srq.setTargetClass((byte) 2);
450
451 SpanRelationMatchQuery rm = new SpanRelationMatchQuery(srq, scq1, true);
margarethab9ee3e52015-05-04 12:42:23 +0200452 // SpanQuery rv = new SpanFocusQuery(rm, (byte) 1);
margaretha50c76332015-03-19 10:10:39 +0100453
454 //return all parents of np
margarethab9ee3e52015-05-04 12:42:23 +0200455 SpanFocusQuery rv2 = new SpanFocusQuery(rm, (byte) 2);
margaretha50c76332015-03-19 10:10:39 +0100456 rv2.setSorted(false);
margarethab9ee3e52015-05-04 12:42:23 +0200457
458 assertEquals(
459 "focus(2: focus(#[1,2]spanSegment({2: target:spanRelation(base:>:child-of)}, {1: <base:np />})))",
460 rv2.toString());
461
margaretha50c76332015-03-19 10:10:39 +0100462 kr = ki.search(rv2, (short) 10);
463
464 assertEquals((long) 4, kr.getTotalResults());
465 assertEquals(0, kr.getMatch(0).getStartPos());
466 assertEquals(7, kr.getMatch(0).getEndPos());
467 assertEquals(1, kr.getMatch(1).getStartPos());
468 assertEquals(7, kr.getMatch(1).getEndPos());
469 assertEquals(2, kr.getMatch(2).getStartPos());
470 assertEquals(7, kr.getMatch(2).getEndPos());
471 assertEquals(4, kr.getMatch(3).getStartPos());
472 assertEquals(7, kr.getMatch(3).getEndPos());
473 // id problem (solved)
474
475 // return all parents of np that are PP
476
Nils Diewaldbb33da22015-03-04 16:24:25 +0000477 }
margaretha50c76332015-03-19 10:10:39 +0100478
479
480 /**
481 * Relations whose source/target do not embed
482 * its counterparts.
Nils Diewaldbb33da22015-03-04 16:24:25 +0000483 * */
484 @Test
485 public void testCase8 () throws IOException {
486 ki.addDoc(createFieldDoc2());
487 ki.commit();
488
489 //return source of dep relations to pos:NN
Akronbb5d1732015-06-22 01:22:40 +0200490
margarethaf70addb2015-04-27 13:17:18 +0200491 SpanTermWithIdQuery tq = new SpanTermWithIdQuery(new Term("base",
492 "pos:NN"), true);
Akronbb5d1732015-06-22 01:22:40 +0200493 SpanRelationQuery srq = new SpanRelationQuery(new SpanTermQuery(
494 new Term("base", "<:dep")), true);
margarethaf70addb2015-04-27 13:17:18 +0200495 srq.setSourceClass((byte) 1);
496 SpanRelationMatchQuery rm = new SpanRelationMatchQuery(srq, tq, true);
497 SpanQuery rv = new SpanFocusQuery(rm, (byte) 1);
Nils Diewaldbb33da22015-03-04 16:24:25 +0000498
499 kr = ki.search(rv, (short) 10);
500 assertEquals((long) 3, kr.getTotalResults());
margarethaf70addb2015-04-27 13:17:18 +0200501 assertEquals(0, kr.getMatch(0).getStartPos());
502 assertEquals(1, kr.getMatch(0).getEndPos());
Nils Diewaldbb33da22015-03-04 16:24:25 +0000503 assertEquals(1, kr.getMatch(1).getStartPos());
504 assertEquals(2, kr.getMatch(1).getEndPos());
505 assertEquals(4, kr.getMatch(2).getStartPos());
506 assertEquals(5, kr.getMatch(2).getEndPos());
507
margarethaf70addb2015-04-27 13:17:18 +0200508 // return target of dep relations from pos:NN
509 srq = new SpanRelationQuery(
Akronbb5d1732015-06-22 01:22:40 +0200510 new SpanTermQuery(new Term("base", ">:dep")), true);
margarethaf70addb2015-04-27 13:17:18 +0200511 srq.setTargetClass((byte) 1);
512 rm = new SpanRelationMatchQuery(srq, tq, true);
513 rv = new SpanFocusQuery(rm, (byte) 1);
514
Nils Diewaldbb33da22015-03-04 16:24:25 +0000515 kr = ki.search(rv, (short) 10);
516 assertEquals((long) 3, kr.getTotalResults());
517 assertEquals(2, kr.getMatch(0).getStartPos());
518 assertEquals(3, kr.getMatch(0).getEndPos());
519 assertEquals(4, kr.getMatch(1).getStartPos());
520 assertEquals(5, kr.getMatch(1).getEndPos());
521 assertEquals(5, kr.getMatch(2).getStartPos());
522 assertEquals(6, kr.getMatch(2).getEndPos());
523
524 }
525
margaretha50c76332015-03-19 10:10:39 +0100526
527 /**
margarethaf70addb2015-04-27 13:17:18 +0200528 * Relation with specific sources and return any targets <br/>
Akronbb5d1732015-06-22 01:22:40 +0200529 * Relation with specific sources and targets, return the targets
530 * <br/>
margarethaf70addb2015-04-27 13:17:18 +0200531 * Relation with specific sources and targets, return the sources
margaretha50c76332015-03-19 10:10:39 +0100532 *
533 * @throws IOException
534 * */
535 @Test
536 public void testCase9 () throws IOException {
537 ki.addDoc(createFieldDoc2());
538 ki.commit();
539
540 // return all children of np
margarethaf70addb2015-04-27 13:17:18 +0200541 SpanElementQuery seq1 = new SpanElementQuery("base", "np");
542 SpanClassQuery scq1 = new SpanClassQuery(seq1, (byte) 1);
543 SpanRelationQuery srq = new SpanRelationQuery(new SpanTermQuery(
544 new Term("base", "<:child-of")), true);
545 srq.setSourceClass((byte) 2);
546 SpanRelationMatchQuery rm = new SpanRelationMatchQuery(srq, scq1, true);
547 SpanFocusQuery rv = new SpanFocusQuery(rm, (byte) 2);
margaretha50c76332015-03-19 10:10:39 +0100548 rv.setSorted(false);
549
margarethab9ee3e52015-05-04 12:42:23 +0200550 assertEquals(
551 "focus(2: focus(#[1,2]spanSegment({2: source:spanRelation(base:<:child-of)}, {1: <base:np />})))",
552 rv.toString());
553
margaretha50c76332015-03-19 10:10:39 +0100554 kr = ki.search(rv, (short) 10);
555
556 assertEquals((long) 7, kr.getTotalResults());
557 assertEquals(0, kr.getMatch(0).getStartPos());
558 assertEquals(1, kr.getMatch(0).getEndPos());
559 assertEquals(2, kr.getMatch(1).getStartPos());
560 assertEquals(3, kr.getMatch(1).getEndPos());
561 assertEquals(2, kr.getMatch(2).getStartPos());
562 assertEquals(4, kr.getMatch(2).getEndPos());
563 assertEquals(3, kr.getMatch(3).getStartPos());
564 assertEquals(4, kr.getMatch(3).getEndPos());
565 assertEquals(4, kr.getMatch(4).getStartPos());
566 assertEquals(7, kr.getMatch(4).getEndPos());
567 assertEquals(5, kr.getMatch(5).getStartPos());
568 assertEquals(6, kr.getMatch(5).getEndPos());
569 assertEquals(6, kr.getMatch(6).getStartPos());
570 assertEquals(7, kr.getMatch(6).getEndPos());
margaretha50c76332015-03-19 10:10:39 +0100571
572 // return all children of np that are articles
margarethaf70addb2015-04-27 13:17:18 +0200573
574 SpanTermWithIdQuery tiq = new SpanTermWithIdQuery(new Term("base",
575 "pos:ART"), true);
576 SpanClassQuery scq2 = new SpanClassQuery(tiq, (byte) 2);
577
578 srq = new SpanRelationQuery(new SpanTermQuery(new Term("base",
579 ">:child-of")), true);
580 rm = new SpanRelationMatchQuery(srq, scq2, scq1, true);
581 rv = new SpanFocusQuery(rm, (byte) 2);
582
margarethab9ee3e52015-05-04 12:42:23 +0200583 assertEquals(
584 "focus(2: focus(#[1,2]spanSegment(focus(#2: spanSegment(spanRelation(base:>:child-of), {2: spanTermWithId(base:pos:ART)})), {1: <base:np />})))",
585 rv.toString());
586
margarethaf70addb2015-04-27 13:17:18 +0200587 kr = ki.search(rv, (short) 10);
margaretha50c76332015-03-19 10:10:39 +0100588
589 assertEquals((long) 2, kr.getTotalResults());
590 assertEquals(2, kr.getMatch(0).getStartPos());
591 assertEquals(3, kr.getMatch(0).getEndPos());
592 assertEquals(5, kr.getMatch(1).getStartPos());
593 assertEquals(6, kr.getMatch(1).getEndPos());
594
595 // return all nps whose children are articles
margarethab9ee3e52015-05-04 12:42:23 +0200596 SpanFocusQuery sf = new SpanFocusQuery(rm, (byte) 1);
597 assertEquals(
598 "focus(1: focus(#[1,2]spanSegment(focus(#2: spanSegment(spanRelation(base:>:child-of), {2: spanTermWithId(base:pos:ART)})), {1: <base:np />})))",
599 sf.toString());
600
margarethaca8d6222015-04-15 13:46:41 +0200601 kr = ki.search(sf, (short) 10);
margaretha50c76332015-03-19 10:10:39 +0100602
603 assertEquals((long) 2, kr.getTotalResults());
margaretha50c76332015-03-19 10:10:39 +0100604 assertEquals(2, kr.getMatch(0).getStartPos());
margarethaf70addb2015-04-27 13:17:18 +0200605 assertEquals(4, kr.getMatch(0).getEndPos());
margaretha50c76332015-03-19 10:10:39 +0100606 assertEquals(5, kr.getMatch(1).getStartPos());
margarethaf70addb2015-04-27 13:17:18 +0200607 assertEquals(7, kr.getMatch(1).getEndPos());
margaretha50c76332015-03-19 10:10:39 +0100608
609 }
610
Akronbb5d1732015-06-22 01:22:40 +0200611
margarethaf70addb2015-04-27 13:17:18 +0200612 @Test
Akronbb5d1732015-06-22 01:22:40 +0200613 public void testCase10 () throws IOException {
margarethaf70addb2015-04-27 13:17:18 +0200614 ki.addDoc(createFieldDoc2());
615 ki.commit();
616 SpanElementQuery seq1 = new SpanElementQuery("base", "np");
617 SpanElementQuery seq2 = new SpanElementQuery("base", "np");
618 SpanClassQuery scq1 = new SpanClassQuery(seq1, (byte) 1);
619 SpanClassQuery scq2 = new SpanClassQuery(seq2, (byte) 2);
620
621 SpanRelationQuery srq = new SpanRelationQuery(new SpanTermQuery(
622 new Term("base", ">:child-of")), true);
623 SpanRelationMatchQuery rq = new SpanRelationMatchQuery(srq, scq2, true);
624
625 kr = ki.search(rq, (short) 10);
626
627 assertEquals((long) 4, kr.getTotalResults());
628 assertEquals(0, kr.getMatch(0).getStartPos());
629 assertEquals(7, kr.getMatch(0).getEndPos());
630 assertEquals(1, kr.getMatch(1).getStartPos());
631 assertEquals(7, kr.getMatch(1).getEndPos());
632 assertEquals(2, kr.getMatch(2).getStartPos());
633 assertEquals(7, kr.getMatch(2).getEndPos());
634 assertEquals(4, kr.getMatch(3).getStartPos());
635 assertEquals(7, kr.getMatch(3).getEndPos());
636 }
637
Eliza Margaretha2db5e232015-03-04 10:20:01 +0000638}