blob: d6e85cd949d2903240c33490f879a8c2f8135aa0 [file] [log] [blame]
/**
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.apache.jena.query.text;
import static org.junit.Assert.assertTrue;
import java.util.Arrays ;
import java.util.HashSet ;
import java.util.Map ;
import java.util.Set ;
import org.apache.jena.atlas.lib.StrUtils ;
import org.junit.Test ;
/*
* This abstract class defines a collection of test methods for testing
* test searches. Its subclasses create a dataset using the index to
* to be tested and then call the test methods in this class to run
* the actual tests.
*/
public abstract class AbstractTestDatasetWithTextIndex extends AbstractTestDatasetWithTextIndexBase {
@Test
public void testOneSimpleResult() {
final String turtle = StrUtils.strjoinNL(
TURTLE_PROLOG,
"<" + RESOURCE_BASE + "testOneSimpleResult>",
" rdfs:label 'bar testOneSimpleResult barfoo foo'",
"."
);
String queryString = StrUtils.strjoinNL(
QUERY_PROLOG,
"SELECT ?s",
"WHERE {",
" ?s text:query ( rdfs:label 'testOneSimpleResult' 10 ) .",
"}"
);
Set<String> expectedURIs = new HashSet<>() ;
expectedURIs.addAll( Arrays.asList("http://example.org/data/resource/testOneSimpleResult")) ;
doTestSearch(turtle, queryString, expectedURIs);
}
static final String R_S1 = RESOURCE_BASE + "s1" ;
static final String R_S2 = RESOURCE_BASE + "s2" ;
static final String PF_DATA = StrUtils.strjoinNL(
TURTLE_PROLOG,
"<" + R_S1 + "> rdfs:label 'text' .",
"<" + R_S2 + "> rdfs:label 'fuzz' ."
);
@Test
public void propertyFunctionText_1() {
final String turtle = PF_DATA ;
String queryString = StrUtils.strjoinNL(
QUERY_PROLOG,
"SELECT ?s",
"WHERE {",
" ?s text:query (rdfs:label 'text') .",
"}"
);
Set<String> expectedURIs = new HashSet<>();
expectedURIs.addAll( Arrays.asList( R_S1 ) ) ;
doTestSearch(turtle, queryString, expectedURIs);
}
@Test
public void propertyFunctionText_1_dft() {
// As before but using default field.
final String turtle = PF_DATA ;
String queryString = StrUtils.strjoinNL(
QUERY_PROLOG,
"SELECT ?s",
"WHERE {",
" ?s text:query ('text') .",
"}"
);
Set<String> expectedURIs = new HashSet<>();
expectedURIs.addAll( Arrays.asList( R_S1 ) ) ;
doTestSearch(turtle, queryString, expectedURIs);
}
@Test
public void propertyFunctionText_1_score() {
// As before but capturing the score in a variable.
final String turtle = PF_DATA ;
String queryString = StrUtils.strjoinNL(
QUERY_PROLOG,
"SELECT ?s ?score",
"WHERE {",
" (?s ?score) text:query ('text') .",
"}"
);
Set<String> expectedURIs = new HashSet<>();
expectedURIs.addAll( Arrays.asList( R_S1 ) ) ;
doTestSearchWithScores(turtle, queryString, expectedURIs);
}
@Test
public void propertyFunctionText_2() {
final String turtle = PF_DATA ;
String queryString = StrUtils.strjoinNL(
QUERY_PROLOG,
"SELECT ?s",
"WHERE {",
" ?s text:query ( rdfs:label 'text') .",
" ?s rdfs:label 'text' .",
"}"
);
Set<String> expectedURIs = new HashSet<>();
expectedURIs.addAll( Arrays.asList( R_S1 ) ) ;
doTestSearch(turtle, queryString, expectedURIs);
}
@Test
public void propertyFunctionText_2_dft() {
final String turtle = PF_DATA ;
String queryString = StrUtils.strjoinNL(
QUERY_PROLOG,
"SELECT ?s",
"WHERE {",
" ?s text:query ('text') .",
" ?s rdfs:label 'text' .",
"}"
);
Set<String> expectedURIs = new HashSet<>();
expectedURIs.addAll( Arrays.asList( R_S1 ) ) ;
doTestSearch(turtle, queryString, expectedURIs);
}
@Test
public void propertyFunctionText_2_score() {
// As before but capturing the score in a variable.
final String turtle = PF_DATA ;
String queryString = StrUtils.strjoinNL(
QUERY_PROLOG,
"SELECT ?s ?score",
"WHERE {",
" (?s ?score) text:query ('text') .",
" ?s rdfs:label 'text' .",
"}"
);
Set<String> expectedURIs = new HashSet<>();
expectedURIs.addAll( Arrays.asList( R_S1 ) ) ;
doTestSearchWithScores(turtle, queryString, expectedURIs);
}
@Test
public void propertyFunctionText_3() {
final String turtle = PF_DATA ;
String queryString = StrUtils.strjoinNL(
QUERY_PROLOG,
"SELECT ?s",
"WHERE {",
" ?s rdfs:label 'text' .",
" ?s text:query ( rdfs:label 'text') .",
"}"
);
Set<String> expectedURIs = new HashSet<>();
expectedURIs.addAll( Arrays.asList( R_S1 ) ) ;
doTestSearch(turtle, queryString, expectedURIs);
}
@Test
public void propertyFunctionText_3_dft() {
final String turtle = PF_DATA ;
String queryString = StrUtils.strjoinNL(
QUERY_PROLOG,
"SELECT ?s",
"WHERE {",
" ?s rdfs:label 'text' .",
" ?s text:query ('text') .",
"}"
);
Set<String> expectedURIs = new HashSet<>();
expectedURIs.addAll( Arrays.asList( R_S1 ) ) ;
doTestSearch(turtle, queryString, expectedURIs);
}
@Test
public void propertyFunctionText_3_score() {
// As before but capturing the score in a variable.
final String turtle = PF_DATA ;
String queryString = StrUtils.strjoinNL(
QUERY_PROLOG,
"SELECT ?s ?score",
"WHERE {",
" ?s rdfs:label 'text' .",
" (?s ?score) text:query ('text') .",
"}"
);
Set<String> expectedURIs = new HashSet<>();
expectedURIs.addAll( Arrays.asList( R_S1 ) ) ;
doTestSearchWithScores(turtle, queryString, expectedURIs);
}
@Test
public void propertyFunctionText_4() {
final String turtle = PF_DATA ;
String queryString = StrUtils.strjoinNL(
QUERY_PROLOG,
"SELECT ?s",
"WHERE {",
" ?s rdfs:label 'text' .",
" ?s text:query ( rdfs:label 'fuzz') .",
"}"
);
Set<String> expectedURIs = new HashSet<>();
doTestSearch(turtle, queryString, expectedURIs);
}
@Test
public void propertyFunctionText_5() {
final String turtle = PF_DATA ;
String queryString = StrUtils.strjoinNL(
QUERY_PROLOG,
"SELECT ?s",
"WHERE {",
" BIND('text' AS ?t)",
" ?s text:query ( rdfs:label ?t) .",
"}"
);
Set<String> expectedURIs = new HashSet<>();
expectedURIs.addAll( Arrays.asList( R_S1 ) ) ;
doTestSearch(turtle, queryString, expectedURIs);
}
@Test
public void propertyFunctionText_6() {
final String turtle = PF_DATA ;
String queryString = StrUtils.strjoinNL(
QUERY_PROLOG,
"SELECT ?s",
"WHERE {",
" BIND(rdfs:label AS ?P)",
" ?s text:query ( ?P 'text') .",
"}"
);
Set<String> expectedURIs = new HashSet<>();
expectedURIs.addAll( Arrays.asList( R_S1 ) ) ;
doTestSearch(turtle, queryString, expectedURIs);
}
@Test
public void propertyFunctionText_7() {
final String turtle = PF_DATA ;
String queryString = StrUtils.strjoinNL(
QUERY_PROLOG,
"SELECT ?s",
"WHERE {",
" BIND(1 AS ?C)",
" ?s text:query ( rdfs:label 'text' ?C) .",
"}"
);
Set<String> expectedURIs = new HashSet<>();
expectedURIs.addAll( Arrays.asList( R_S1 ) ) ;
doTestSearch(turtle, queryString, expectedURIs);
}
@Test
public void propertyFunctionText_8() {
final String turtle = PF_DATA ;
String queryString = StrUtils.strjoinNL(
QUERY_PROLOG,
"SELECT ?s",
"WHERE {",
" ?s rdfs:label 'text' .",
" ?s text:query 'text' .",
" ?s rdfs:label 'text' .",
"}"
);
Set<String> expectedURIs = new HashSet<>();
expectedURIs.addAll( Arrays.asList( R_S1 ) ) ;
doTestSearch(turtle, queryString, expectedURIs);
}
@Test
public void testMultipleResults() {
String label = "testMultipleResults";
final String turtle = StrUtils.strjoinNL(
TURTLE_PROLOG,
"<" + RESOURCE_BASE + label +"1>",
" rdfs:label '" + label + "1'",
".",
"<" + RESOURCE_BASE + label + "2>",
" rdfs:label '" + label + "2'",
"."
);
String queryString = StrUtils.strjoinNL(
QUERY_PROLOG,
"SELECT ?s",
"WHERE {",
" ?s text:query ( rdfs:label '" + label + "?' 10 ) .",
"}"
);
Set<String> expectedURIs = new HashSet<>() ;
expectedURIs.addAll( Arrays.asList(
"http://example.org/data/resource/" + label + "1",
"http://example.org/data/resource/" + label + "2"
));
doTestSearch(turtle, queryString, expectedURIs);
}
@Test
public void testMultipleResults_dft() {
String label = "testMultipleResults";
final String turtle = StrUtils.strjoinNL(
TURTLE_PROLOG,
"<" + RESOURCE_BASE + label +"1>",
" rdfs:label '" + label + "1'",
".",
"<" + RESOURCE_BASE + label + "2>",
" rdfs:label '" + label + "2'",
"."
);
String queryString = StrUtils.strjoinNL(
QUERY_PROLOG,
"SELECT ?s",
"WHERE {",
" ?s text:query ('" + label + "?' 10 ) .",
"}"
);
Set<String> expectedURIs = new HashSet<>() ;
expectedURIs.addAll( Arrays.asList(
"http://example.org/data/resource/" + label + "1",
"http://example.org/data/resource/" + label + "2"
));
doTestSearch(turtle, queryString, expectedURIs);
}
@Test
public void testMultipleResults_score() {
final String turtle = StrUtils.strjoinNL(
TURTLE_PROLOG,
"<" + RESOURCE_BASE + "brownfox>",
" rdfs:label 'The quick brown fox jumped over the lazy dog.'",
".",
"<" + RESOURCE_BASE + "redfox>",
" rdfs:label 'red fox'",
"."
);
String queryString = StrUtils.strjoinNL(
QUERY_PROLOG,
"SELECT ?s ?score",
"WHERE {",
" (?s ?score) text:query ( rdfs:label 'brown fox' 10 ) .",
"}"
);
Set<String> expectedURIs = new HashSet<>();
expectedURIs.addAll( Arrays.asList(
RESOURCE_BASE + "brownfox",
RESOURCE_BASE + "redfox"
));
Map<String,Float> scores = doTestSearchWithScores(turtle, queryString, expectedURIs);
// the entry for ("The quick brown fox...") should have a higher score since it's a better match
assertTrue(scores.get(RESOURCE_BASE + "brownfox") > scores.get(RESOURCE_BASE + "redfox"));
}
@Test
public void testSearchCorrectField() {
String label = "tscf";
String label2 = "tscfo";
final String turtle = StrUtils.strjoinNL(
TURTLE_PROLOG,
"<" + RESOURCE_BASE + label +"1>",
" rdfs:label '" + label + "a' ; ",
" rdfs:comment '" + label2 + "a' ;",
".",
"<" + RESOURCE_BASE + label + "2>",
" rdfs:label '" + label2 + "b' ; ",
" rdfs:comment '" + label + "b' ; ",
"."
);
String queryStringLabel = StrUtils.strjoinNL(
QUERY_PROLOG,
"SELECT ?s",
"WHERE {",
" ?s text:query ( rdfs:label '" + label + "?' 10 ) .",
"}"
);
String queryStringComment = StrUtils.strjoinNL(
QUERY_PROLOG,
"SELECT ?s",
"WHERE {",
" ?s text:query ( rdfs:comment '" + label + "?' 10 ) .",
"}"
);
Set<String> expectedURIsLabel = new HashSet<>() ;
expectedURIsLabel.addAll( Arrays.asList(
"http://example.org/data/resource/" + label + "1"
));
Set<String> expectedURIsComment = new HashSet<>() ;
expectedURIsComment.addAll( Arrays.asList(
"http://example.org/data/resource/" + label + "2"
));
doTestSearch("label:", turtle, queryStringLabel, expectedURIsLabel);
doTestSearch("comment:", turtle, queryStringComment, expectedURIsComment);
}
@Test
public void testSearchDefaultField() {
String label = "testSearchDefaultField";
String label2 = "testSearchDefaultFieldOther";
final String turtle = StrUtils.strjoinNL(
TURTLE_PROLOG,
"<" + RESOURCE_BASE + label +"1>",
" rdfs:label '" + label + "1' ; ",
" rdfs:comment '" + label2 + "1' ;",
".",
"<" + RESOURCE_BASE + label + "2>",
" rdfs:label '" + label2 + "2' ; ",
" rdfs:comment '" + label + "2' ; ",
"."
);
String queryString = StrUtils.strjoinNL(
QUERY_PROLOG,
"SELECT ?s",
"WHERE {",
" ?s text:query ( rdfs:label '" + label + "?' 10 ) .",
"}"
);
Set<String> expectedURIs = new HashSet<>() ;
expectedURIs.addAll( Arrays.asList(
"http://example.org/data/resource/" + label + "1"
));
doTestSearch("default field:", turtle, queryString, expectedURIs);
}
@Test
public void testSearchDefaultField_dft() {
String label = "testSearchDefaultField";
String label2 = "testSearchDefaultFieldOther";
final String turtle = StrUtils.strjoinNL(
TURTLE_PROLOG,
"<" + RESOURCE_BASE + label +"1>",
" rdfs:label '" + label + "1' ; ",
" rdfs:comment '" + label2 + "1' ;",
".",
"<" + RESOURCE_BASE + label + "2>",
" rdfs:label '" + label2 + "2' ; ",
" rdfs:comment '" + label + "2' ; ",
"."
);
String queryString = StrUtils.strjoinNL(
QUERY_PROLOG,
"SELECT ?s",
"WHERE {",
" ?s text:query ('" + label + "?' 10 ) .",
"}"
);
Set<String> expectedURIs = new HashSet<>() ;
expectedURIs.addAll( Arrays.asList(
"http://example.org/data/resource/" + label + "1"
));
doTestSearch("default field:", turtle, queryString, expectedURIs);
}
@Test
public void testSearchLimitsResults() {
String label = "testSearchLimitsResults";
final String turtle = StrUtils.strjoinNL(
TURTLE_PROLOG,
"<" + RESOURCE_BASE + label + "1>",
" rdfs:label '" + label + "' ;",
".",
"<" + RESOURCE_BASE + label + "2>",
" rdfs:label '" + label + "' ;",
".",
"<" + RESOURCE_BASE + label + "3>",
" rdfs:label '" + label + "' ;",
".",
"<" + RESOURCE_BASE + label + "4>",
" rdfs:label '" + label + "' ;",
"."
);
String queryString = StrUtils.strjoinNL(
QUERY_PROLOG,
"SELECT ?s",
"WHERE {",
" ?s text:query ( '" + label + "' 3 ) .",
"}"
);
Set<String> expectedURIs = new HashSet<>() ;
expectedURIs.addAll( Arrays.asList(
"http://example.org/data/resource/" + label + "1",
"http://example.org/data/resource/" + label + "2",
"http://example.org/data/resource/" + label + "3",
"http://example.org/data/resource/" + label + "4"
));
doTestSearch("default field:", turtle, queryString, expectedURIs, 3 );
}
}