package com.acuitra.stages.integrated; import java.io.IOException; import java.util.ArrayList; import java.util.List; import com.acuitra.sparql.SparqlUtils; import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; import com.google.common.collect.ListMultimap; public class NLPMapToDBpediaOntOrPropQueryStage extends NLPQueryStage { public NLPMapToDBpediaOntOrPropQueryStage(String namedEntityRecognitionURL, String sparqlEndpointURL, ListMultimap<String, String> namePredicateMapping) { super(namedEntityRecognitionURL, sparqlEndpointURL, namePredicateMapping); } protected List<String> mapPropertyToRDFPredicate(String property) { List<String> results = new ArrayList<>(); StringBuilder builder = new StringBuilder(); builder.append("PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#> "); builder.append("SELECT ?subject WHERE '{' "); builder.append("?subject rdfs:label \"{0}\" @en"); builder.append(" '}' "); String output = SparqlUtils.runQuery(this.context.getJerseyClient(), sparqlEndpointURL, builder.toString(), property); // // Result looks like this // // { // head: { // vars: [ // "subject" // ] // }, // results: { // bindings: [ // { // subject: { // type: "uri", // value: "http://dbpedia.org/resource/U.S." // } // } // ] // } // // } ObjectMapper mapper = new ObjectMapper(); try { JsonNode rootNode = mapper.readTree(output); int answerCount = rootNode.path("results").path("bindings").size(); for (int i = 0; i < answerCount; i++) { String answerValue = rootNode.path("results").path("bindings").path(i).path("subject").path("value").asText(); if (!answerValue.startsWith("<")) { answerValue = "<" + answerValue; } if (!answerValue.endsWith(">")) { answerValue = answerValue + ">"; } results.add(answerValue); } return results; } catch (IOException e) { throw new RuntimeException(e); } } }