blob: cb7d43b9bcaaebe5bcfbfbf06740874288e39977 [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.stanbol.enhancer.ldpath;
import static org.apache.stanbol.enhancer.servicesapi.rdf.Properties.DC_RELATION;
import static org.apache.stanbol.enhancer.servicesapi.rdf.Properties.ENHANCER_CONFIDENCE;
import static org.apache.stanbol.enhancer.servicesapi.rdf.Properties.ENHANCER_ENTITY_REFERENCE;
import static org.apache.stanbol.enhancer.servicesapi.rdf.Properties.ENHANCER_EXTRACTED_FROM;
import static org.apache.stanbol.enhancer.servicesapi.rdf.Properties.RDF_TYPE;
import static org.apache.stanbol.enhancer.servicesapi.rdf.TechnicalClasses.ENHANCER_ENHANCEMENT;
import static org.apache.stanbol.enhancer.servicesapi.rdf.TechnicalClasses.ENHANCER_ENTITYANNOTATION;
import static org.apache.stanbol.enhancer.servicesapi.rdf.TechnicalClasses.ENHANCER_TEXTANNOTATION;
import static org.apache.stanbol.enhancer.servicesapi.rdf.TechnicalClasses.ENHANCER_TOPICANNOTATION;
import org.apache.clerezza.rdf.core.Resource;
import org.apache.stanbol.enhancer.ldpath.function.ContentFunction;
import org.apache.stanbol.enhancer.ldpath.function.PathFunction;
import org.apache.stanbol.enhancer.ldpath.function.SuggestionFunction;
import org.apache.stanbol.enhancer.ldpath.utils.Utils;
import org.apache.stanbol.enhancer.servicesapi.rdf.NamespaceEnum;
import at.newmedialab.ldpath.api.functions.SelectorFunction;
import at.newmedialab.ldpath.api.selectors.NodeSelector;
import at.newmedialab.ldpath.model.Constants;
import at.newmedialab.ldpath.parser.Configuration;
import at.newmedialab.ldpath.parser.DefaultConfiguration;
import at.newmedialab.ldpath.parser.ParseException;
/**
* Defines defaults for LDPath
*/
public final class EnhancerLDPath {
private EnhancerLDPath(){}
private static Configuration<Resource> CONFIG;
/**
* The LDPath configuration including the <ul>
* <li> Namespaces defined by the {@link NamespaceEnum}
* <li> the LDPath functions for the Stanbol Enhancement Structure
* </ul>
* @return the LDPath configuration for the Stanbol Enhancer
*/
public static final Configuration<Resource> getConfig(){
if(CONFIG == null){
CONFIG = new DefaultConfiguration<Resource>();
//add the namespaces
for(NamespaceEnum ns : NamespaceEnum.values()){
CONFIG.addNamespace(ns.getPrefix(), ns.getNamespace());
}
//now add the functions
addFunction(CONFIG, new ContentFunction());
String path;
NodeSelector<Resource> selector;
//TextAnnotations
path = String.format("^%s[%s is %s]",
ENHANCER_EXTRACTED_FROM,RDF_TYPE,ENHANCER_TEXTANNOTATION);
try {
selector = Utils.parseSelector(path);
} catch (ParseException e) {
throw new IllegalStateException("Unable to parse the ld-path selector '" +
path + "'used to select all TextAnnotations of a contentItem!", e);
}
addFunction(CONFIG, new PathFunction<Resource>(
"textAnnotation",selector));
//EntityAnnotations
path = String.format("^%s[%s is %s]",
ENHANCER_EXTRACTED_FROM,RDF_TYPE,ENHANCER_ENTITYANNOTATION);
try {
selector = Utils.parseSelector(path);
} catch (ParseException e) {
throw new IllegalStateException("Unable to parse the ld-path selector '" +
path + "'used to select all EntityAnnotations of a contentItem!", e);
}
addFunction(CONFIG,new PathFunction<Resource>(
"entityAnnotation", selector));
//TopicAnnotations
path = String.format("^%s[%s is %s]",
ENHANCER_EXTRACTED_FROM,RDF_TYPE,ENHANCER_TOPICANNOTATION);
try {
selector = Utils.parseSelector(path);
} catch (ParseException e) {
throw new IllegalStateException("Unable to parse the ld-path selector '" +
path + "'used to select all TopicAnnotations of a contentItem!", e);
}
addFunction(CONFIG,new PathFunction<Resource>(
"topicAnnotation",selector));
//Enhancements
path = String.format("^%s[%s is %s]",
ENHANCER_EXTRACTED_FROM,RDF_TYPE,ENHANCER_ENHANCEMENT);
try {
selector = Utils.parseSelector(path);
} catch (ParseException e) {
throw new IllegalStateException("Unable to parse the ld-path selector '" +
path + "'used to select all Enhancements of a contentItem!", e);
}
addFunction(CONFIG,new PathFunction<Resource>(
"enhancement",selector));
//Suggested EntityAnnotations for Text/TopicAnnotations
//(1) to select the suggestions
NodeSelector<Resource> linkedEntityAnnotations;
path = String.format("^%s[%s is %s]",
DC_RELATION,RDF_TYPE,ENHANCER_ENTITYANNOTATION,ENHANCER_CONFIDENCE);
try {
linkedEntityAnnotations = Utils.parseSelector(path);
} catch (ParseException e) {
throw new IllegalStateException("Unable to parse the ld-path selector '" +
path + "'used to select all entity suggestions for an Enhancement!", e);
}
//(2) to select the confidence value of Enhancements
NodeSelector<Resource> confidenceSelector;
path = ENHANCER_CONFIDENCE.toString();
try {
confidenceSelector = Utils.parseSelector(path);
} catch (ParseException e) {
throw new IllegalStateException("Unable to parse the ld-path selector '" +
path + "'used to select the confidence of suggestions!", e);
}
//The resultSelector is NULL because this directly returns the EntityAnnotations
addFunction(CONFIG,new SuggestionFunction("suggestion",linkedEntityAnnotations,confidenceSelector,null));
//Suggested Entities for Text/TopicAnnotations
//The suggestion and confidence selectors can be the same as above,
//but we need an additional result selector
NodeSelector<Resource> entityReferenceSelector;
path = ENHANCER_ENTITY_REFERENCE.toString();
try {
entityReferenceSelector = Utils.parseSelector(path);
} catch (ParseException e) {
throw new IllegalStateException("Unable to parse the ld-path selector '" +
path + "'used to select the entity referenced by a EntityAnnotation!", e);
}
addFunction(CONFIG, new SuggestionFunction("suggestedEntity",
linkedEntityAnnotations,confidenceSelector,entityReferenceSelector));
}
return CONFIG;
}
private static <Node> void addFunction(Configuration<Node> config, SelectorFunction<Node> function) {
config.addFunction(Constants.NS_LMF_FUNCS + function.getPathExpression(null), function);
}
}