/** * Converts a map of results to a String JSON representation for it * * @param map a map that matches properties with an ArrayList of values * @return the JSON representation for the map, as a String */ private String mapToString(Map<String, ArrayList<String>> map) { StringBuilder result = new StringBuilder("{"); for (Map.Entry<String, ArrayList<String>> entry : map.entrySet()) { ArrayList<String> value = entry.getValue(); if (value.size() == 1) result.append(String.format("\"%s\" : %s,\n", entry.getKey(), value.get(0))); else result.append(String.format("\"%s\" : %s,\n", entry.getKey(), value.toString())); } result.setCharAt(result.length() - 2, '}'); return result.toString(); }
// convert InputStream to String private static String getStringFromInputStream(InputStream is) { BufferedReader br = null; StringBuilder sb = new StringBuilder(); String line; try { br = new BufferedReader(new InputStreamReader(is)); while ((line = br.readLine()) != null) { sb.append(line + "\n"); } } catch (IOException e) { e.printStackTrace(); } finally { if (br != null) { try { br.close(); } catch (IOException e) { e.printStackTrace(); } } } return sb.toString(); }
/** * Build a query returning all triples in which members of uris are the subjects of the triplets. * * <p>If toDescribeURIs is true the query will automatically add logic to retrieve the labels * directly from the SPARQL endpoint. * * @param uris URIs for queried resources * @return a CONSTRUCT query string */ private String getSyncQueryStr(Iterable<String> uris) { StringBuilder uriSetStrBuilder = new StringBuilder(); String delimiter = ""; uriSetStrBuilder.append("("); for (String uri : uris) { uriSetStrBuilder.append(delimiter).append(String.format("<%s>", uri)); delimiter = ", "; } uriSetStrBuilder.append(")"); String uriSet = uriSetStrBuilder.toString(); /* Get base triplets having any element from uris as subject */ StringBuilder queryBuilder = new StringBuilder(); queryBuilder .append("CONSTRUCT { ?s ?p ?o } WHERE {") .append("{?s ?p ?o") .append(String.format(" . FILTER (?s in %s )", uriSet)); /* Perform uri label resolution only if desired */ if (uriDescriptionList.isEmpty()) { queryBuilder.append("}}"); return queryBuilder.toString(); } /* Filter out properties having a label */ int index = 0; for (String prop : uriDescriptionList) { index++; String filterTemplate = " . OPTIONAL { ?o <%s> ?o%d } " + " . FILTER(!BOUND(?o%d))"; queryBuilder.append(String.format(filterTemplate, prop, index, index)); } queryBuilder.append("}"); /* We need this redundant clause as UNION queries can't handle sub-selects * without a prior clause. */ String redundantClause = "<http://www.w3.org/2000/01/rdf-schema#Class> " + "a <http://www.w3.org/2000/01/rdf-schema#Class>"; /* Add labels for filtered out properties */ for (String prop : uriDescriptionList) { /* Resolve ?o as str(?label) for the resource ?res * label is taken as being ?res <prop> ?label * * We need to take str(?label) in order to drop * language references of the terms so that the document * is indexed with a language present only in it's top-level * properties. * * As some Virtuoso versions do not allow the usage * of BIND so we have to create a sub-select in order to bind * ?o to str(?label) * * The sub-select works only with a prior clause. * We are using a redundant clause that is always true */ String partQueryTemplate = " UNION " + "{ " + redundantClause + " . " + "{ SELECT ?s ?p (str(?label) as ?o) { " + " ?s ?p ?res" + " . FILTER (?s in %s)" + " . ?res <%s> ?label }}}"; queryBuilder.append(String.format(partQueryTemplate, uriSet, prop)); } queryBuilder.append("}"); return queryBuilder.toString(); }