package doser.tools;
import java.util.HashSet;
import java.util.LinkedList;
import java.util.List;
import java.util.Set;
import org.apache.log4j.Logger;
import com.hp.hpl.jena.query.QueryException;
import com.hp.hpl.jena.query.QueryExecution;
import com.hp.hpl.jena.query.QueryExecutionFactory;
import com.hp.hpl.jena.query.QueryFactory;
import com.hp.hpl.jena.query.QuerySolution;
import com.hp.hpl.jena.query.ResultSet;
import com.hp.hpl.jena.rdf.model.Model;
import doser.entitydisambiguation.backend.DisambiguationMainService;
import doser.entitydisambiguation.table.logic.Type;
public final class RDFGraphOperations {
private static RDFGraphOperations instance = null;
public static Set<Type> getBroaderCategoriesOfCategory(final String category) {
final Model model = DisambiguationMainService.getInstance()
.getDBPediaArticleCategories();
final Set<Type> types = new HashSet<Type>();
final String query = "SELECT ?types WHERE{ <" + category
+ "> <http://www.w3.org/2004/02/skos/core#broader> ?types. }";
ResultSet results = null;
QueryExecution qexec = null;
try {
final com.hp.hpl.jena.query.Query cquery = QueryFactory
.create(query);
qexec = QueryExecutionFactory.create(cquery, model);
results = qexec.execSelect();
} catch (final QueryException e) {
Logger.getRootLogger().error(e.getStackTrace());
} finally {
if (results != null) {
while (results.hasNext()) {
final QuerySolution sol = results.nextSolution();
final String uri = sol.getResource("types").toString();
final String name = queryDbPediaCategoryLabel(uri);
final Type type = new Type(name, uri, true, 1);
types.add(type);
}
}
if (qexec != null) {
qexec.close();
}
}
return types;
}
public static Set<Type> getDbpediaCategoriesFromEntity(
final String entityUri) {
final Model model = DisambiguationMainService.getInstance()
.getDBPediaArticleCategories();
final Set<Type> types = new HashSet<Type>();
final String query = "SELECT ?types WHERE{ <" + entityUri
+ "> <http://purl.org/dc/terms/subject> ?types. }";
ResultSet results = null;
QueryExecution qexec = null;
try {
final com.hp.hpl.jena.query.Query cquery = QueryFactory
.create(query);
qexec = QueryExecutionFactory.create(cquery, model);
results = qexec.execSelect();
} catch (final QueryException e) {
Logger.getRootLogger().error(e.getStackTrace());
} finally {
if (results != null) {
while (results.hasNext()) {
final QuerySolution sol = results.nextSolution();
final String uri = sol.getResource("types").toString();
final String name = queryDbPediaCategoryLabel(uri);
final Type type = new Type(name, uri, true, 1);
types.add(type);
}
}
if (qexec != null) {
qexec.close();
}
}
return types;
}
public static Set<Type> getDbpediaCategoriesFromEntity_GER(
final String entityUri) {
final Model model = DisambiguationMainService.getInstance()
.getDBPediaArticleCategories_GER();
final Set<Type> types = new HashSet<Type>();
final String query = "SELECT ?types WHERE{ <" + entityUri
+ "> <http://purl.org/dc/terms/subject> ?types. }";
ResultSet results = null;
QueryExecution qexec = null;
try {
final com.hp.hpl.jena.query.Query cquery = QueryFactory
.create(query);
qexec = QueryExecutionFactory.create(cquery, model);
results = qexec.execSelect();
} catch (final QueryException e) {
Logger.getRootLogger().error(e.getStackTrace());
} finally {
if (results != null) {
while (results.hasNext()) {
final QuerySolution sol = results.nextSolution();
final String uri = sol.getResource("types").getURI();
// final String uri = sol.getResource("types").toString();
// RDF Hack - ToDo: Inform how to load the new dbpedia tql files correctly
String newuri = uri.split(" ")[0].replaceAll(">", "");
final String name = queryDbPediaCategoryLabel_GER(newuri);
final Type type = new Type(name, newuri, true, 1);
types.add(type);
}
}
if (qexec != null) {
qexec.close();
}
}
return types;
}
public static Set<Type> getRDFTypesFromEntity(final String entityUri) {
Set<Type> set = new HashSet<Type>();
final Model model = DisambiguationMainService.getInstance().getDBPediaInstanceTypes();
final String query = "SELECT ?types WHERE{ <" + entityUri
+ "> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> ?types. }";
ResultSet results = null;
QueryExecution qexec = null;
try {
final com.hp.hpl.jena.query.Query cquery = QueryFactory
.create(query);
qexec = QueryExecutionFactory.create(cquery, model);
results = qexec.execSelect();
} catch (final QueryException e) {
Logger.getRootLogger().error(e.getStackTrace());
} finally {
if (results != null) {
while (results.hasNext()) {
final QuerySolution sol = results.nextSolution();
final String type = sol.getResource("types").toString();
set.add(new Type("", type, true, 0));
}
}
}
return set;
}
public static String getDbPediaDescription(final String uri)
throws QueryException {
String res = null;
final Model model = DisambiguationMainService.getInstance()
.getDBPediaDescription();
final String query = "SELECT ?description WHERE{ <" + uri
+ "> <http://dbpedia.org/ontology/abstract> ?description. }";
ResultSet results = null; // NOPMD by quh on 14.02.14 10:04
QueryExecution qexec = null;
try {
final com.hp.hpl.jena.query.Query cquery = QueryFactory
.create(query);
qexec = QueryExecutionFactory.create(cquery, model);
results = qexec.execSelect();
} finally {
if ((results != null) && results.hasNext()) {
res = results.nextSolution().getLiteral("description")
.getString();
}
if (qexec != null) {
qexec.close();
}
}
return res;
}
public static List<String> getDbPediaLabel(final String uri)
throws QueryException {
final List<String> labellist = new LinkedList<String>();
final Model model = DisambiguationMainService.getInstance()
.getDBPediaLabels();
final String query = "SELECT ?label WHERE{ <" + uri
+ "> <http://www.w3.org/2000/01/rdf-schema#label> ?label. }";
ResultSet results = null; // NOPMD by quh on 14.02.14 10:04
QueryExecution qexec = null;
final com.hp.hpl.jena.query.Query cquery = QueryFactory.create(query);
qexec = QueryExecutionFactory.create(cquery, model);
results = qexec.execSelect();
if (results != null) {
while (results.hasNext()) {
final QuerySolution sol = results.nextSolution();
final String label = sol.getLiteral("label").getLexicalForm();
labellist.add(label);
}
qexec.close();
}
return labellist;
}
public static List<String> getDbPediaLabel_GER(final String uri)
throws QueryException {
final List<String> labellist = new LinkedList<String>();
final Model model = DisambiguationMainService.getInstance()
.getDBPediaLabels_GER();
final String query = "SELECT ?label WHERE{ <" + uri
+ "> <http://www.w3.org/2000/01/rdf-schema#label> ?label. }";
ResultSet results = null; // NOPMD by quh on 14.02.14 10:04
QueryExecution qexec = null;
final com.hp.hpl.jena.query.Query cquery = QueryFactory.create(query);
qexec = QueryExecutionFactory.create(cquery, model);
results = qexec.execSelect();
if (results != null) {
while (results.hasNext()) {
final QuerySolution sol = results.nextSolution();
final String label = sol.getLiteral("label").getLexicalForm();
labellist.add(label);
}
qexec.close();
}
return labellist;
}
public static List<Type> getWordnetPredecessorTypesOfDbPediaCategory(
final String dbpediaCat, final int layer) {
// Transform Uri to yago wikicategoryUri!
final String[] splitter = dbpediaCat.split(":");
final String uri = "http://yago-knowledge.org/resource/wikicategory_"
+ splitter[splitter.length - 1];
// Query the supertype of this resource!
final Model model = DisambiguationMainService.getInstance()
.getYagoTaxonomy();
final String query = "Select ?type WHERE{ <"
+ uri
+ "> <http://www.w3.org/2000/01/rdf-schema#subClassOf> ?type. }";
// System.out.println(query);
final List<Type> resultList = new LinkedList<Type>();
try {
final com.hp.hpl.jena.query.Query que = QueryFactory.create(query);
final QueryExecution qexec = QueryExecutionFactory.create(que,
model);
final ResultSet results = qexec.execSelect(); // NOPMD by quh on
// 18.02.14 15:05
while (results.hasNext()) {
final QuerySolution sol = results.nextSolution();
final String typeUri = sol.getResource("type").toString();
final String name = queryYagoCategoryLabel(typeUri);
final Type type = new Type(name, typeUri, true, layer);
resultList.add(type);
}
} catch (final QueryException e) {
Logger.getRootLogger().error(e.getStackTrace());
}
return resultList;
}
private static String queryDbPediaCategoryLabel(final String catUri) {
String res = null;
final Model model = DisambiguationMainService.getInstance()
.getDBPediaCategoryLabels();
final String query = "SELECT ?label WHERE{ <" + catUri
+ "> <http://www.w3.org/2000/01/rdf-schema#label> ?label. }";
try {
final com.hp.hpl.jena.query.Query cquery = QueryFactory
.create(query);
final QueryExecution qexec = QueryExecutionFactory.create(cquery,
model);
final ResultSet results = qexec.execSelect(); // NOPMD by quh on
// 18.02.14 15:05
while (results.hasNext()) {
final QuerySolution sol = results.nextSolution();
final String name = sol.getLiteral("label").getLexicalForm();
res = name;
}
} catch (final QueryException e) {
Logger.getRootLogger().error(e.getStackTrace());
}
return res;
}
private static String queryDbPediaCategoryLabel_GER(final String catUri) {
String res = null;
final Model model = DisambiguationMainService.getInstance()
.getDBPediaCategoryLabels_GER();
final String query = "SELECT ?label WHERE{ <" + catUri
+ "> <http://www.w3.org/2000/01/rdf-schema#label> ?label. }";
try {
final com.hp.hpl.jena.query.Query cquery = QueryFactory
.create(query);
final QueryExecution qexec = QueryExecutionFactory.create(cquery,
model);
final ResultSet results = qexec.execSelect(); // NOPMD by quh on
// 18.02.14 15:05
while (results.hasNext()) {
final QuerySolution sol = results.nextSolution();
final String name = sol.getLiteral("label").getLexicalForm();
// RDFHack ToDo: Inform how to resolve the dbpedia tql files correctly
res = name;
}
} catch (final QueryException e) {
Logger.getRootLogger().error(e.getStackTrace());
}
return res;
}
public static List<Type> queryWordnetTypePredecessor(final String uri,
final int layer) {
final List<Type> types = new LinkedList<Type>();
final Model model = DisambiguationMainService.getInstance()
.getYagoTaxonomy();
final String query = "SELECT ?types WHERE{ <"
+ uri
+ "> <http://www.w3.org/2000/01/rdf-schema#subClassOf> ?types. }";
try {
final com.hp.hpl.jena.query.Query cquery = QueryFactory
.create(query);
final QueryExecution qexec = QueryExecutionFactory.create(cquery,
model);
final ResultSet results = qexec.execSelect(); // NOPMD by quh on
// 18.02.14 15:05
while (results.hasNext()) {
final QuerySolution sol = results.nextSolution();
final String type = sol.getResource("types").toString();
final String name = queryYagoCategoryLabel(type);
types.add(new Type(name, type, true, layer));
// System.out.println("Type: "+name+" Uri: "+type);
}
} catch (final QueryException e) {
Logger.getRootLogger().error(e.getStackTrace());
}
return types;
}
public static List<Type> queryYagoCategories(final String uri) {
final Model model = DisambiguationMainService.getInstance()
.getYagoTransitiveTypes();
final List<Type> types = new LinkedList<Type>();
final String query = "SELECT ?type WHERE{ <"
+ uri
+ "> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> ?type. }";
try {
final com.hp.hpl.jena.query.Query que = QueryFactory.create(query);
final QueryExecution qexec = QueryExecutionFactory.create(que,
model);
final ResultSet results = qexec.execSelect(); // NOPMD by quh on
// 18.02.14 15:05
while (results.hasNext()) {
final QuerySolution sol = results.nextSolution();
final String name = sol.getResource("type").toString();
types.add(new Type("", name, true, 0));
}
} catch (final QueryException e) {
Logger.getRootLogger().error(e.getStackTrace());
}
return types;
}
private static String queryYagoCategoryLabel(final String catUri) {
String res = null;
final Model model = DisambiguationMainService.getInstance()
.getYagoCategoryLabels();
final String query = "SELECT ?label WHERE{ <" + catUri
+ "> <http://www.w3.org/2004/02/skos/core#> ?label. }";
try {
final com.hp.hpl.jena.query.Query que = QueryFactory.create(query);
final QueryExecution qexec = QueryExecutionFactory.create(que,
model);
final ResultSet results = qexec.execSelect(); // NOPMD by quh on
// 18.02.14 15:05
while (results.hasNext()) {
final QuerySolution sol = results.nextSolution();
final String name = sol.getLiteral("label").getLexicalForm();
res = name;
}
} catch (final QueryException e) {
Logger.getRootLogger().error(e.getStackTrace());
}
return res;
}
private RDFGraphOperations() {
super();
}
public synchronized RDFGraphOperations getInstance() {
if (instance == null) {
instance = new RDFGraphOperations();
}
return instance;
}
}