blob: 66b8a502952e65f63bbe7ab239823191959cca0c [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 org.apache.jena.assembler.Assembler;
import org.apache.jena.atlas.lib.StrUtils;
import org.apache.jena.query.*;
import org.apache.jena.query.text.assembler.TextAssembler;
import org.apache.jena.rdf.model.Model;
import org.apache.jena.rdf.model.ModelFactory;
import org.apache.jena.rdf.model.Resource;
import org.apache.jena.riot.RDFDataMgr;
import org.apache.jena.riot.Lang;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import java.io.Reader;
import java.io.StringReader;
import java.util.Arrays;
import java.util.HashSet;
import java.util.Set;
public class TestDatasetWithLuceneMultilingualTextIndex extends AbstractTestDatasetWithTextIndexBase {
private static final String SPEC_BASE = "http://example.org/spec#";
private static final String SPEC_ROOT_LOCAL = "lucene_text_dataset";
private static final String SPEC_ROOT_URI = SPEC_BASE + SPEC_ROOT_LOCAL;
private static final String SPEC;
static final String DIR = "testing/TextQuery" ;
static {
SPEC = StrUtils.strjoinNL(
"prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> ",
"prefix skos: <http://www.w3.org/2004/02/skos/core#> ",
"prefix ja: <http://jena.hpl.hp.com/2005/11/Assembler#> ",
"prefix tdb: <http://jena.hpl.hp.com/2008/tdb#>",
"prefix text: <http://jena.apache.org/text#>",
"prefix : <" + SPEC_BASE + ">",
"",
"[] ja:loadClass \"org.apache.jena.query.text.TextQuery\" .",
"text:TextDataset rdfs:subClassOf ja:RDFDataset .",
"text:TextIndexLucene rdfs:subClassOf text:TextIndex .",
":" + SPEC_ROOT_LOCAL,
" a text:TextDataset ;",
" text:dataset :dataset ;",
" text:index :indexLucene ;",
" .",
"",
":dataset",
" a tdb:DatasetTDB ;",
" tdb:location \"--mem--\" ;",
" tdb:unionDefaultGraph true ;",
".",
"",
":indexLucene",
" a text:TextIndexLucene ;",
" text:directory \"mem\" ;",
" text:storeValues true ;",
" text:multilingualSupport true ;",
" text:entityMap :entMap ;",
" .",
"",
":entMap",
" a text:EntityMap ;",
" text:entityField \"uri\" ;",
" text:defaultField \"label\" ;",
" text:langField \"lang\" ;",
" text:graphField \"graph\" ;",
" text:map (",
" [ text:field \"label\" ; text:predicate rdfs:label ]",
" [ text:field \"comment\" ; text:predicate rdfs:comment ]",
" [ text:field \"prefLabel\" ; text:predicate skos:prefLabel ]",
" ) ."
);
}
@Before
public void before() {
Reader reader = new StringReader(SPEC);
Model specModel = ModelFactory.createDefaultModel();
specModel.read(reader, "", "TURTLE");
TextAssembler.init();
Resource root = specModel.getResource(SPEC_ROOT_URI);
dataset = (Dataset) Assembler.general.open(root);
}
@After
public void after() {
dataset.close();
}
@Test
public void testNoResultsOnFirstCreateIndex(){
String turtle = "";
String queryString = StrUtils.strjoinNL(
QUERY_PROLOG,
"SELECT ?s",
"WHERE {",
" ?s text:query ( rdfs:label 'book' 'lang:en' 10 ) .",
"}"
);
doTestSearch(turtle, queryString, new HashSet<String>());
}
@Test
public void testRetrievingEnglishLocalizedResource(){
final String turtle = StrUtils.strjoinNL(
TURTLE_PROLOG,
"<" + RESOURCE_BASE + "testEnglishLocalizedResource>",
" rdfs:label 'He offered me a gift'@en",
".",
TURTLE_PROLOG,
"<" + RESOURCE_BASE + "testGermanLocalizedResource>",
" rdfs:label 'Er schluckte gift'@de",
"."
);
String queryString = StrUtils.strjoinNL(
QUERY_PROLOG,
"SELECT ?s",
"WHERE {",
" ?s text:query ( rdfs:label 'gift' 'lang:en' 10 ) .",
"}"
);
Set<String> expectedURIs = new HashSet<>() ;
expectedURIs.addAll( Arrays.asList("http://example.org/data/resource/testEnglishLocalizedResource")) ;
doTestSearch(turtle, queryString, expectedURIs);
}
@Test
public void testRetrievingGermanLocalizedResource(){
final String turtle = StrUtils.strjoinNL(
TURTLE_PROLOG,
"<" + RESOURCE_BASE + "testEnglishLocalizedResource>",
" rdfs:label 'He offered me a gift'@en",
".",
TURTLE_PROLOG,
"<" + RESOURCE_BASE + "testGermanLocalizedResource>",
" rdfs:label 'Er schluckte gift'@de",
"."
);
String queryString = StrUtils.strjoinNL(
QUERY_PROLOG,
"SELECT ?s",
"WHERE {",
" ?s text:query ( rdfs:label 'gift' 'lang:de' 10 ) .",
"}"
);
Set<String> expectedURIs = new HashSet<>() ;
expectedURIs.addAll( Arrays.asList("http://example.org/data/resource/testGermanLocalizedResource")) ;
doTestSearch(turtle, queryString, expectedURIs);
}
@Test
public void testEnglishStemming(){
final String turtle = StrUtils.strjoinNL(
TURTLE_PROLOG,
"<" + RESOURCE_BASE + "testEnglishStemming>",
" rdfs:label 'I met some engineers'@en",
"."
);
String queryString = StrUtils.strjoinNL(
QUERY_PROLOG,
"SELECT ?s",
"WHERE {",
" ?s text:query ( rdfs:label 'engineering' 'lang:en' 10 ) .",
"}"
);
Set<String> expectedURIs = new HashSet<>() ;
expectedURIs.addAll( Arrays.asList("http://example.org/data/resource/testEnglishStemming")) ;
doTestSearch(turtle, queryString, expectedURIs);
}
@Test
public void testRetrievingUnlocalizedResource(){
final String turtle = StrUtils.strjoinNL(
TURTLE_PROLOG,
"<" + RESOURCE_BASE + "testLocalizedResource>",
" rdfs:label 'A localized text'@en",
".",
"<" + RESOURCE_BASE + "testUnlocalizedResource>",
" rdfs:label 'An unlocalized text'",
"."
);
String queryString = StrUtils.strjoinNL(
QUERY_PROLOG,
"SELECT ?s",
"WHERE {",
" ?s text:query ( rdfs:label 'text' 'lang:none' 10 ) .",
"}"
);
Set<String> expectedURIs = new HashSet<>() ;
expectedURIs.addAll( Arrays.asList("http://example.org/data/resource/testUnlocalizedResource")) ;
doTestSearch(turtle, queryString, expectedURIs);
}
@Test
public void testRetrievingSKOSConcepts() {
String queryString = StrUtils.strjoinNL(
"PREFIX text: <http://jena.apache.org/text#>",
"PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>",
"PREFIX skos: <http://www.w3.org/2004/02/skos/core#>",
"SELECT ?s",
"WHERE {",
" { ?s text:query ( skos:prefLabel 'frites' 'lang:fr' ) }",
" UNION ",
" { ?s text:query ( skos:prefLabel 'Kartoffelpüree' 'lang:de' ) }" ,
"}"
);
Set<String> expectedURIs = new HashSet<>() ;
expectedURIs.addAll(Arrays.asList("http://example.com/dishes#fries",
"http://example.com/dishes#mashed")) ;
dataset.begin(ReadWrite.WRITE);
Model model = dataset.getDefaultModel();
RDFDataMgr.read(model, DIR + "/data.skos", Lang.RDFXML);
dataset.commit();
doTestQuery(dataset, "", queryString, expectedURIs, expectedURIs.size());
}
}