
io.redlink.sdk.impl.analysis.model.RDFStructureParser Maven / Gradle / Ivy
/**
* Licensed 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 io.redlink.sdk.impl.analysis.model;
import com.google.common.base.Optional;
import com.google.common.base.Predicate;
import com.google.common.collect.*;
import io.redlink.sdk.util.ModelRepository;
import org.openrdf.model.Literal;
import org.openrdf.model.Model;
import org.openrdf.model.Value;
import org.openrdf.model.impl.LiteralImpl;
import org.openrdf.model.vocabulary.DCTERMS;
import org.openrdf.query.*;
import org.openrdf.repository.Repository;
import org.openrdf.repository.RepositoryConnection;
import org.openrdf.repository.RepositoryException;
import java.util.*;
/**
* @author [email protected]
* @author [email protected]
*/
final class RDFStructureParser extends EnhancementsParser {
/**
*
*/
private Repository repository;
public RDFStructureParser(Model model)
throws EnhancementParserException {
try {
this.repository = ModelRepository.create(model);
} catch (RepositoryException e) {
throw new EnhancementParserException(
"There was an error initializing the Enhancement Parser", e);
}
}
public RDFStructureParser(Repository repository) {
this.repository = repository;
}
/*
* (non-Javadoc)
*
* @see
* io.redlink.sdk.impl.analysis.model.EnhancementsParser#parseLanguages()
*/
public Collection parseLanguages() throws EnhancementParserException {
Collection languages = Sets.newHashSet();
String textAnnotationsQuery = "PREFIX fise: \n"
+ "PREFIX dct: \n"
+ "SELECT * { \n"
+ " ?annotation a fise:TextAnnotation . \n"
+ " ?annotation dct:type <"
+ DCTERMS.LINGUISTIC_SYSTEM
+ "> . \n"
+ " ?annotation dct:language ?language . \n"
+ "} \n";
try {
RepositoryConnection conn = repository.getConnection();
try {
conn.begin();
TupleQueryResult textAnnotationsResults = conn.prepareTupleQuery(QueryLanguage.SPARQL, textAnnotationsQuery).evaluate();
while (textAnnotationsResults.hasNext()) {
BindingSet result = textAnnotationsResults.next();
if (result.hasBinding("language")) {
languages.add(result.getBinding("language").getValue().stringValue());
}
}
conn.commit();
} finally {
conn.close();
}
} catch (QueryEvaluationException | MalformedQueryException e) {
throw new EnhancementParserException(
"Error parsing text annotations", e);
} catch (RepositoryException e) {
throw new EnhancementParserException(
"Error querying the RDF Model obtained as Service Response",
e);
}
return languages;
}
/*
* (non-Javadoc)
*
* @see
* io.redlink.sdk.impl.analysis.model.EnhancementsParser#parseEnhancements()
*/
public Collection parseEnhancements()
throws EnhancementParserException {
Multimap relations = ArrayListMultimap.create();
Map enhancementsByUri = Maps.newHashMap();
try {
RepositoryConnection conn = repository.getConnection();
try {
conn.begin();
parseTextAnnotations(conn, relations, enhancementsByUri);
parseEntityAnnotations(conn, relations, enhancementsByUri);
for (Enhancement e : relations.keys()) {
Collection relationsUris = relations.get(e);
Collection relationsEnhans = Sets.newHashSet();
for (String uri : relationsUris) {
relationsEnhans.add(enhancementsByUri.get(uri));
}
e.setRelations(relationsEnhans);
}
conn.commit();
} finally {
conn.close();
}
} catch (RepositoryException e) {
throw new EnhancementParserException(
"Error querying the RDF Model obtained as Service Response",
e);
}
return enhancementsByUri.values();
}
/*
* (non-Javadoc)
*
* @see
* io.redlink.sdk.impl.analysis.model.EnhancementsParser#parseTextAnnotations
* ()
*/
@SuppressWarnings({"unchecked", "rawtypes"})
public Collection parseTextAnnotations()
throws EnhancementParserException {
Multimap relations = ArrayListMultimap.create();
Map enhancementsByUri = Maps.newHashMap();
try {
RepositoryConnection conn = repository.getConnection();
conn.begin();
Collection tas = parseTextAnnotations(conn,
relations, enhancementsByUri);
Collection result = (Collection) resolveRelations(
relations, conn); // Safe Casting
for (TextAnnotation ta : tas)
if (!result.contains(ta))
result.add(ta);
conn.close();
return result;
} catch (RepositoryException e) {
throw new EnhancementParserException(
"Error querying the RDF Model obtained as Service Response",
e);
}
}
private Collection parseTextAnnotations(
RepositoryConnection conn,
Multimap relations,
Map enhancementsByUri)
throws EnhancementParserException {
Collection tas = Sets.newHashSet();
String textAnnotationsQuery = "PREFIX fise: \n"
+ "PREFIX dct: \n"
+ "SELECT * { \n"
+ " ?annotation a fise:TextAnnotation . \n"
+ " OPTIONAL { ?annotation fise:confidence ?confidence } \n"
+ " OPTIONAL { ?annotation dct:type ?type} \n"
+ " OPTIONAL { ?annotation dct:language ?language} \n"
+ " OPTIONAL { ?annotation fise:start ?start ; fise:end ?end } \n"
+ " OPTIONAL { ?annotation dct:relation ?relation } \n"
+ " OPTIONAL { ?annotation fise:selection-context ?selectionContext } \n"
+ " OPTIONAL { ?annotation fise:selected-text ?selectedText } \n"
+ "} \n";
try {
TupleQueryResult textAnnotationsResults = conn.prepareTupleQuery(
QueryLanguage.SPARQL, textAnnotationsQuery).evaluate();
while (textAnnotationsResults.hasNext()) {
BindingSet result = textAnnotationsResults.next();
if (!result.hasBinding("type")
|| !result
.getBinding("type")
.getValue()
.stringValue()
.equalsIgnoreCase(
DCTERMS.LINGUISTIC_SYSTEM.stringValue())) // Filter
// Language
// Annotations
{
final String uri = result.getBinding("annotation")
.getValue().stringValue();
Enhancement textAnnotation = enhancementsByUri.get(uri);
if (textAnnotation == null) {
textAnnotation = new TextAnnotation();
enhancementsByUri.put(uri, textAnnotation);
}
setTextAnnotationData((TextAnnotation) textAnnotation,
result, relations);
if (!tas.contains(textAnnotation))
tas.add((TextAnnotation) textAnnotation);
}
}
} catch (QueryEvaluationException | MalformedQueryException e) {
throw new EnhancementParserException(
"Error parsing text annotations", e);
} catch (RepositoryException e) {
throw new EnhancementParserException(
"Error querying the RDF Model obtained as Service Response",
e);
}
return tas;
}
private void setTextAnnotationData(TextAnnotation textAnnotation,
BindingSet result, Multimap relations)
throws RepositoryException {
if (!relations.containsKey(textAnnotation)) {
setEnhancementData(textAnnotation, result);
if (result.hasBinding("start")) {
textAnnotation.setStarts(Integer.parseInt(result
.getBinding("start").getValue().stringValue()));
textAnnotation.setEnds(Integer.parseInt(result
.getBinding("end").getValue().stringValue()));
}
if (result.hasBinding("relation")) {
String nextRelationUri = result.getBinding("relation")
.getValue().stringValue();
relations.put(textAnnotation, nextRelationUri);
}
if (result.hasBinding("selectionContext")) {
textAnnotation.setSelectionContext(result
.getBinding("selectionContext").getValue()
.stringValue());
}
if (result.hasBinding("selectedText")) {
Binding selectedText = result.getBinding("selectedText");
textAnnotation.setSelectedText(selectedText.getValue()
.stringValue());
if (!result.hasBinding("language")
&& (selectedText.getValue() instanceof Literal))
textAnnotation.setLanguage(((Literal) selectedText
.getValue()).getLanguage());
}
if (result.hasBinding("type")) {
Binding type = result.getBinding("type");
textAnnotation.setType(type.getValue().stringValue());
}
} else {
if (result.hasBinding("relation")) {
String nextRelationUri = result.getBinding("relation")
.getValue().stringValue();
relations.put(textAnnotation, nextRelationUri);
}
}
}
/*
* (non-Javadoc)
*
* @see
* io.redlink.sdk.impl.analysis.model.EnhancementsParser#parseEntityAnnotations
* ()
*/
@SuppressWarnings({"unchecked", "rawtypes"})
public Collection parseEntityAnnotations()
throws EnhancementParserException {
Multimap relations = ArrayListMultimap.create();
Map enhancementsByUri = Maps.newHashMap();
try {
RepositoryConnection conn = repository.getConnection();
conn.begin();
Collection eas = parseEntityAnnotations(conn,
relations, enhancementsByUri);
Collection result = (Collection) resolveRelations(
relations, conn); // Safe Casting
for (EntityAnnotation ea : eas)
if (!result.contains(ea))
result.add(ea);
conn.close();
return result;
} catch (RepositoryException e) {
throw new EnhancementParserException(
"Error querying the RDF Model obtained as Service Response",
e);
}
}
private Collection parseEntityAnnotations(
RepositoryConnection conn,
Multimap relations,
Map enhancementsByUri)
throws EnhancementParserException {
Collection eas = Sets.newHashSet();
String entityAnnotationsQuery = "PREFIX fise: \n"
+ "PREFIX dct: \n"
+ "PREFIX entityhub: \n"
+ "SELECT * { \n"
+ " ?annotation a fise:EntityAnnotation . \n"
+ " OPTIONAL { ?annotation fise:confidence ?confidence } \n"
+ " OPTIONAL { ?language a dct:language } \n"
+ " OPTIONAL { ?annotation dct:relation ?relation } \n"
+ " OPTIONAL { ?annotation fise:entity-label ?entityLabel } \n"
+ " OPTIONAL { ?annotation fise:entity-reference ?entityReference } \n"
+ " OPTIONAL { ?annotation fise:entity-type ?entityType } \n"
+ " OPTIONAL { ?annotation entityhub:site ?site } \n" + "}";
try {
TupleQueryResult entityAnnotationsResults = conn.prepareTupleQuery(
QueryLanguage.SPARQL, entityAnnotationsQuery).evaluate();
while (entityAnnotationsResults.hasNext()) {
BindingSet result = entityAnnotationsResults.next();
final String uri = result.getBinding("annotation").getValue()
.stringValue();
Enhancement entityAnnotation = enhancementsByUri.get(uri);
if (entityAnnotation == null) {
entityAnnotation = new EntityAnnotation();
enhancementsByUri.put(uri, entityAnnotation);
}
setEntityAnnotationData((EntityAnnotation) entityAnnotation,
result, conn, relations);
if (!eas.contains(entityAnnotation))
eas.add((EntityAnnotation) entityAnnotation);
}
} catch (QueryEvaluationException | MalformedQueryException e) {
throw new EnhancementParserException(
"Error parsing text annotations", e);
} catch (RepositoryException e) {
throw new EnhancementParserException(
"Error querying the RDF Model obtained as Service Response",
e);
}
return eas;
}
private void setEntityAnnotationData(EntityAnnotation entityAnnotation,
BindingSet result, RepositoryConnection conn,
Multimap relations)
throws RepositoryException, EnhancementParserException {
if (!relations.containsKey(entityAnnotation)) {
setEnhancementData(entityAnnotation, result);
if (result.hasBinding("entityLabel")) {
Binding entityLabel = result.getBinding("entityLabel");
entityAnnotation.setEntityLabel(entityLabel.getValue()
.stringValue());
if (!result.hasBinding("language")
&& (entityLabel.getValue() instanceof Literal))
entityAnnotation.setLanguage(((Literal) entityLabel
.getValue()).getLanguage());
}
if (result.hasBinding("site")) {
entityAnnotation.setDataset(result.getBinding("site").getValue()
.stringValue());
}
if (result.hasBinding("entityReference")) {
entityAnnotation
.setEntityReference(parseEntity(conn, result
.getBinding("entityReference").getValue()
.stringValue(),
entityAnnotation.getDataset()));
}
if (result.hasBinding("relation")) {
String nextRelationUri = result.getBinding("relation")
.getValue().stringValue();
relations.put(entityAnnotation, nextRelationUri);
}
Collection types = new HashSet();
if (result.hasBinding("entityType")) {
types.add(result.getBinding("entityType").getValue()
.stringValue());
}
entityAnnotation.setEntityTypes(types);
} else {
if (result.hasBinding("relation")) {
final String nextRelationUri = result.getBinding("relation")
.getValue().stringValue();
if (!relations.containsEntry(entityAnnotation, nextRelationUri))
relations.put(entityAnnotation, nextRelationUri);
}
if (result.hasBinding("entityType")) {
final String entityType = result.getBinding("entityType")
.getValue().stringValue();
Collection types = entityAnnotation.getEntityTypes();
Optional eType = Iterables.tryFind(types,
new Predicate() {
@Override
public boolean apply(String arg0) {
return arg0.equals(entityType);
}
});
if (!eType.isPresent())
types.add(entityType);
}
}
}
private Collection resolveRelations(
Multimap relations, RepositoryConnection conn)
throws EnhancementParserException {
Queue toParse = new LinkedList();
toParse.addAll(Sets.newHashSet(relations.values()));
Map allRelations = new HashMap();
Collection initialEnhancements = relations.keys();
while (!toParse.isEmpty()) {
String nextRelation = toParse.poll();
Enhancement nextEnhancement = parseEnhancement(nextRelation, conn,
toParse, relations);
if (nextEnhancement != null)
allRelations.put(nextRelation, nextEnhancement);
}
for (Enhancement e : relations.keys()) {
Collection relationsUris = relations.get(e);
Collection nextRelEnhancements = Sets.newHashSet();
for (String uri : relationsUris)
if (uri != null)
nextRelEnhancements.add(allRelations.get(uri));
e.setRelations(nextRelEnhancements);
}
return initialEnhancements;
}
private Enhancement parseEnhancement(String nextRelation,
RepositoryConnection conn, Queue toParse,
Multimap relations)
throws EnhancementParserException {
String enhancementQuery = "PREFIX fise: \n"
+ "SELECT * { \n"
+ " <"
+ nextRelation
+ "> a fise:EntityAnnotation ; \n" + "}";
Enhancement enhancement = null;
try {
TupleQueryResult enhancementResults = conn.prepareTupleQuery(
QueryLanguage.SPARQL, enhancementQuery).evaluate();
if (enhancementResults.hasNext())
enhancement = parseEntityAnnotation(nextRelation, conn,
toParse, relations);
else
enhancement = parseTextAnnotation(nextRelation, conn, toParse,
relations);
} catch (QueryEvaluationException | MalformedQueryException e) {
throw new EnhancementParserException("Error parsing enhancement "
+ nextRelation, e);
} catch (RepositoryException e) {
throw new EnhancementParserException(
"Error parsing Enhancement Type for URI" + nextRelation, e);
}
return enhancement;
}
private Enhancement parseTextAnnotation(String taUri,
RepositoryConnection conn, Queue toParse,
Multimap relations)
throws RepositoryException, EnhancementParserException {
TextAnnotation enhancement = new TextAnnotation();
String textAnnotationQuery = "PREFIX fise: \n"
+ "PREFIX dct: \n"
+ "PREFIX entityhub: \n"
+ "SELECT * { \n OPTIONAL { <"
+ taUri
+ "> fise:confidence ?confidence } \n"
+ " OPTIONAL { <"
+ taUri
+ "> dct:language ?language } \n"
+ " OPTIONAL { <"
+ taUri
+ "> fise:start ?start ; fise:end ?end } \n"
+ " OPTIONAL { <"
+ taUri
+ "> dct:type ?type } \n"
+ " OPTIONAL { <"
+ taUri
+ "> dct:relation ?relation } \n"
+ " OPTIONAL { <"
+ taUri
+ "> fise:selection-context ?selectionContext } \n"
+ " OPTIONAL { <"
+ taUri
+ "> fise:selected-text ?selectedText } \n" + "}";
try {
TupleQueryResult textAnnotationResults = conn.prepareTupleQuery(
QueryLanguage.SPARQL, textAnnotationQuery).evaluate();
while (textAnnotationResults.hasNext()) {
BindingSet result = textAnnotationResults.next();
int i = 0;
if (i == 0) {
setEnhancementData(enhancement, result);
if (result.hasBinding("start")) {
enhancement.setStarts(Integer.parseInt(result
.getBinding("start").getValue().stringValue()));
enhancement.setEnds(Integer.parseInt(result
.getBinding("end").getValue().stringValue()));
}
if (result.hasBinding("relation")) {
String nextRelationUri = result.getBinding("relation")
.getValue().stringValue();
if (!relations.values().contains(nextRelationUri))
toParse.add(nextRelationUri);
relations.put(enhancement, nextRelationUri);
}
if (result.hasBinding("selectionContext")) {
enhancement.setSelectionContext(result
.getBinding("selectionContext").getValue()
.stringValue());
}
if (result.hasBinding("selectedText")) {
Binding selectedText = result
.getBinding("selectedText");
enhancement.setSelectedText(selectedText.getValue()
.stringValue());
if (!result.hasBinding("language")
&& (selectedText.getValue() instanceof Literal))
enhancement.setLanguage(((Literal) selectedText
.getValue()).getLanguage());
}
} else {
if (result.hasBinding("relation")) {
String nextRelationUri = result.getBinding("relation")
.getValue().stringValue();
if (!relations.values().contains(nextRelationUri))
toParse.add(nextRelationUri);
relations.put(enhancement, nextRelationUri);
}
}
i++;
}
} catch (QueryEvaluationException | MalformedQueryException e) {
throw new EnhancementParserException(
"Error parsing text annotation with URI: " + taUri, e);
}
return enhancement;
}
private EntityAnnotation parseEntityAnnotation(String eaUri,
RepositoryConnection conn, Queue toParse,
Multimap relations)
throws RepositoryException, EnhancementParserException {
EntityAnnotation enhancement = new EntityAnnotation();
String entityAnnotationsQuery = "PREFIX fise: \n"
+ "PREFIX dct: \n"
+ "PREFIX entityhub: \n"
+ "SELECT * { \n OPTIONAL { <"
+ eaUri
+ "> fise:confidence ?confidence ; \n"
+ eaUri
+ "> dct:language ?language . \n"
+ " OPTIONAL { <"
+ eaUri
+ "> dct:relation ?relation } \n"
+ " OPTIONAL { <"
+ eaUri
+ "> fise:entity-label ?entityLabel } \n"
+ " OPTIONAL { <"
+ eaUri
+ "> fise:entity-reference ?entityReference } \n"
+ " OPTIONAL { <"
+ eaUri
+ "> fise:entity-type ?entityType } \n"
+ " OPTIONAL { <"
+ eaUri + "> entityhub:site ?site } \n" + "}";
try {
TupleQueryResult entityAnnotationsResults = conn.prepareTupleQuery(
QueryLanguage.SPARQL, entityAnnotationsQuery).evaluate();
int i = 0;
while (entityAnnotationsResults.hasNext()) {
BindingSet result = entityAnnotationsResults.next();
if (i == 0) {
setEnhancementData(enhancement, result);
if (result.hasBinding("entityLabel")) {
Binding entityLabel = result.getBinding("entityLabel");
enhancement.setEntityLabel(entityLabel.getValue()
.stringValue());
if (!result.hasBinding("language")
&& (entityLabel.getValue() instanceof Literal))
enhancement.setLanguage(((Literal) entityLabel
.getValue()).getLanguage());
}
if (result.hasBinding("site")) {
enhancement.setDataset(result.getBinding("site")
.getValue().stringValue());
}
if (result.hasBinding("entityReference")) {
enhancement.setEntityReference(parseEntity(conn, result
.getBinding("entityReference").getValue()
.stringValue(),
enhancement.getDataset()));
}
if (result.hasBinding("relation")) {
String nextRelationUri = result.getBinding("relation")
.getValue().stringValue();
if (!relations.values().contains(nextRelationUri))
toParse.add(nextRelationUri);
relations.put(enhancement, nextRelationUri);
}
if (result.hasBinding("entityType")) {
Collection types = new HashSet();
types.add(result.getBinding("entityType").getValue()
.stringValue());
enhancement.setEntityTypes(types);
}
} else {
if (result.hasBinding("relation")) {
String nextRelationUri = result.getBinding("relation")
.getValue().stringValue();
Collection eRelations = relations
.get(enhancement);
if (!eRelations.contains(nextRelationUri)) {
if (!relations.values().contains(nextRelationUri))
toParse.add(nextRelationUri);
relations.put(enhancement, nextRelationUri);
}
}
if (result.hasBinding("entityType")) {
String nextType = result.getBinding("entityType")
.getValue().stringValue();
if (!enhancement.getEntityTypes().contains(nextType))
enhancement.getEntityTypes().add(nextType);
}
}
i++;
}
} catch (QueryEvaluationException | MalformedQueryException e) {
throw new EnhancementParserException(
"Error parsing entity annotation with URI: " + eaUri, e);
}
return enhancement;
}
/*
* (non-Javadoc)
*
* @see
* io.redlink.sdk.impl.analysis.model.EnhancementsParser#parseEntity(java
* .lang.String)
*/
public Entity parseEntity(String entityUri, String dataset)
throws EnhancementParserException {
try {
RepositoryConnection conn = repository.getConnection();
conn.begin();
Entity result = parseEntity(conn, entityUri, dataset);
conn.close();
return result;
} catch (RepositoryException e) {
throw new EnhancementParserException(
"Error querying the RDF Model obtained as Service Response",
e);
}
}
private Entity parseEntity(RepositoryConnection conn, String entityUri, String dataset)
throws EnhancementParserException {
String entityQuery = "SELECT ?p ?o { \n" + " <" + entityUri
+ "> ?p ?o ; \n" + "}";
Entity entity = new Entity(entityUri, dataset);
try {
TupleQueryResult entityResults = conn.prepareTupleQuery(
QueryLanguage.SPARQL, entityQuery).evaluate();
while (entityResults.hasNext()) {
BindingSet result = entityResults.next();
Value object = result.getBinding("o").getValue();
if (object instanceof LiteralImpl) {
String language = ((LiteralImpl) object).getLanguage();
if (language == null) {
entity.addPropertyValue(result.getBinding("p")
.getValue().stringValue(), object.stringValue());
} else {
entity.addPropertyValue(result.getBinding("p")
.getValue().stringValue(), language,
object.stringValue());
}
} else {
entity.addPropertyValue(result.getBinding("p").getValue()
.stringValue(), object.stringValue());
}
}
} catch (QueryEvaluationException | MalformedQueryException e) {
throw new EnhancementParserException(
"Error parsing text annotations", e);
} catch (RepositoryException e) {
throw new EnhancementParserException(
"Error querying the RDF Model obtained as Service Response",
e);
}
return entity;
}
private void setEnhancementData(Enhancement enhancement, BindingSet result) {
if (result.hasBinding("confidence")) {
enhancement.setConfidence(Double.parseDouble(result
.getBinding("confidence").getValue().stringValue()));
} else {
enhancement.setConfidence(1.0); // Rupert says this should be the default value...
}
enhancement.setLanguage(result.getBinding("language") != null ? result
.getBinding("language").getValue().stringValue() : null);
}
/*
* (non-Javadoc)
* @see io.redlink.sdk.impl.analysis.model.EnhancementsParser#parseTopicAnnotation()
*/
@SuppressWarnings({"rawtypes", "unchecked"})
@Override
public Collection parseTopicAnnotation()
throws EnhancementParserException {
Multimap relations = ArrayListMultimap.create();
Map enhancementsByUri = Maps.newHashMap();
try {
RepositoryConnection conn = repository.getConnection();
conn.begin();
Collection tas = parseTopicAnnotations(conn,
relations, enhancementsByUri);
Collection result = (Collection) resolveRelations(
relations, conn); // Safe Casting
for (TopicAnnotation ta : tas)
if (!result.contains(ta))
result.add(ta);
conn.close();
return result;
} catch (RepositoryException e) {
throw new EnhancementParserException(
"Error querying the RDF Model obtained as Service Response",
e);
}
}
private Collection parseTopicAnnotations(
RepositoryConnection conn, Multimap relations,
Map enhancementsByUri) throws EnhancementParserException {
Collection tas = Sets.newHashSet();
String topicAnnotationsQuery = "PREFIX fise: \n"
+ "PREFIX dct: \n"
+ "PREFIX entityhub: \n"
+ "SELECT * { \n"
+ " ?annotation a fise:TopicAnnotation . \n"
+ " OPTIONAL { fise:confidence ?confidence } \n"
+ " OPTIONAL { ?language a dct:language } \n"
+ " OPTIONAL { ?annotation dct:relation ?relation } \n"
+ " OPTIONAL { ?annotation fise:entity-label ?entityLabel } \n"
+ " OPTIONAL { ?annotation fise:entity-reference ?entityReference } \n"
+ " OPTIONAL { ?annotation entityhub:site ?site } \n" + "}";
try {
TupleQueryResult topicAnnotationsResults = conn.prepareTupleQuery(
QueryLanguage.SPARQL, topicAnnotationsQuery).evaluate();
while (topicAnnotationsResults.hasNext()) {
BindingSet result = topicAnnotationsResults.next();
final String uri = result.getBinding("annotation").getValue()
.stringValue();
Enhancement topicAnnotation = enhancementsByUri.get(uri);
if (topicAnnotation == null) {
topicAnnotation = new TopicAnnotation();
enhancementsByUri.put(uri, topicAnnotation);
}
setTopicAnnotationData((TopicAnnotation) topicAnnotation,
result, conn, relations);
if (!tas.contains(topicAnnotation))
tas.add((TopicAnnotation) topicAnnotation);
}
} catch (QueryEvaluationException | MalformedQueryException e) {
throw new EnhancementParserException(
"Error parsing text annotations", e);
} catch (RepositoryException e) {
throw new EnhancementParserException(
"Error querying the RDF Model obtained as Service Response",
e);
}
return tas;
}
private void setTopicAnnotationData(TopicAnnotation topicAnnotation,
BindingSet result, RepositoryConnection conn,
Multimap relations) {
if (!relations.containsKey(topicAnnotation)) {
setEnhancementData(topicAnnotation, result);
if (result.hasBinding("entityLabel")) {
Binding entityLabel = result.getBinding("entityLabel");
topicAnnotation.setTopicLabel(entityLabel.getValue()
.stringValue());
if (!result.hasBinding("language")
&& (entityLabel.getValue() instanceof Literal))
topicAnnotation.setLanguage(((Literal) entityLabel
.getValue()).getLanguage());
}
if (result.hasBinding("entityReference")) {
topicAnnotation
.setTopicReference(result
.getBinding("entityReference").getValue()
.stringValue());
}
if (result.hasBinding("relation")) {
String nextRelationUri = result.getBinding("relation")
.getValue().stringValue();
relations.put(topicAnnotation, nextRelationUri);
}
if (result.hasBinding("site")) {
topicAnnotation.setDataset(result.getBinding("site").getValue()
.stringValue());
}
} else {
if (result.hasBinding("relation")) {
final String nextRelationUri = result.getBinding("relation")
.getValue().stringValue();
if (!relations.containsEntry(topicAnnotation, nextRelationUri))
relations.put(topicAnnotation, nextRelationUri);
}
}
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy