50 String OUTSTRING =
"";
52 if (maxhits !=
null) {
53 limit = Integer.parseInt(maxhits);
55 String url = ConfigProperties.getPropertyParam(
"api") +
"/v1/sparql";
56 String sparql =
"PREFIX skos: <http://www.w3.org/2004/02/skos/core#> PREFIX ls: <http://labeling.link/docs/ls/core#> PREFIX dc: <http://purl.org/dc/elements/1.1/> "
57 +
"SELECT ?Subject ?id ?prefLabels ?scopeNote ?BroaderPreferredTerm ?BroaderPreferred ?NarrowerPreferredTerm ?NarrowerPreferred ?schemeTitle ?scheme WHERE { "
59 +
"?Subject dc:identifier ?id . "
60 +
"?Subject skos:inScheme ?scheme . "
61 +
"?scheme dc:title ?schemeTitle . "
62 +
"?Subject skos:prefLabel ?prefLabel . "
63 +
"?Subject skos:prefLabel ?prefLabels . "
64 +
"?Subject ls:thumbnail ?preferredLabel . "
65 +
"OPTIONAL { ?Subject skos:scopeNote ?scopeNote . } "
66 +
"OPTIONAL {?Subject skos:broader ?BroaderPreferred . ?BroaderPreferred ls:thumbnail ?BroaderPreferredTerm.} "
67 +
"OPTIONAL {?Subject skos:narrower ?NarrowerPreferred . ?NarrowerPreferred ls:thumbnail ?NarrowerPreferredTerm .} ";
69 if (fields.contains(
"prefLabel")) {
70 sparql +=
"FILTER(regex(?prefLabel, '" + searchword +
"', 'i')) ";
71 }
else if (fields.contains(
"scopeNote")) {
72 sparql +=
"FILTER(regex(?scopeNote, '" + searchword +
"', 'i')) ";
74 sparql +=
"FILTER(regex(?prefLabel, '" + searchword +
"', 'i') || regex(?scopeNote, '" + searchword +
"', 'i')) ";
77 sparql +=
"FILTER(regex(?prefLabel, '" + searchword +
"', 'i') || regex(?scopeNote, '" + searchword +
"', 'i')) ";
79 if (vocabulary !=
null) {
80 sparql +=
"FILTER(?scheme=<http://" + ConfigProperties.getPropertyParam(
"host") +
"/item/vocabulary/" + vocabulary +
">) ";
83 sparql +=
"?scheme ls:hasReleaseType ls:Public . ";
85 sparql +=
"} ORDER BY ASC(?preferredLabel)";
86 URL obj =
new URL(url);
87 HttpURLConnection con = (HttpURLConnection) obj.openConnection();
88 con.setRequestMethod(
"GET");
89 con.setRequestProperty(
"Accept",
"application/sparql-results+json");
90 String urlParameters =
"query=" + sparql;
93 con.setDoOutput(
true);
94 DataOutputStream wr =
new DataOutputStream(con.getOutputStream());
95 wr.writeBytes(urlParameters);
98 BufferedReader in =
new BufferedReader(
new InputStreamReader(con.getInputStream(),
"UTF8"));
100 StringBuilder response =
new StringBuilder();
101 while ((inputLine = in.readLine()) !=
null) {
102 response.append(inputLine);
106 JSONArray outArray =
new JSONArray();
108 JSONObject jsonObject = (JSONObject)
new JSONParser().parse(response.toString());
109 JSONObject resultsObject = (JSONObject) jsonObject.get(
"results");
110 JSONArray bindingsArray = (JSONArray) resultsObject.get(
"bindings");
112 HashSet<String> uris =
new HashSet<String>();
113 for (Object element : bindingsArray) {
114 JSONObject tmpElement = (JSONObject) element;
115 JSONObject subject = (JSONObject) tmpElement.get(
"Subject");
116 String subjectValue = (String) subject.get(
"value");
117 uris.add(subjectValue);
120 Map<String, SuggestionItem> autosuggests =
new HashMap<String, SuggestionItem>();
121 for (String element : uris) {
122 autosuggests.put(element,
new SuggestionItem(element));
125 for (Object element : bindingsArray) {
126 JSONObject tmpElement = (JSONObject) element;
128 JSONObject subject = (JSONObject) tmpElement.get(
"Subject");
129 String subjectValue = (String) subject.get(
"value");
131 SuggestionItem tmpAutosuggest = autosuggests.get(subjectValue);
133 JSONObject idObject = (JSONObject) tmpElement.get(
"id");
134 String idValue = (String) idObject.get(
"value");
135 tmpAutosuggest.setId(idValue);
137 JSONObject labelObject = (JSONObject) tmpElement.get(
"prefLabels");
138 String labelValue = (String) labelObject.get(
"value");
139 String labelLang = (String) labelObject.get(
"xml:lang");
140 tmpAutosuggest.setLabel(labelValue +
"@" + labelLang);
142 JSONObject schemeObject = (JSONObject) tmpElement.get(
"schemeTitle");
143 String schemeValue = (String) schemeObject.get(
"value");
144 String schemeLang = (String) schemeObject.get(
"xml:lang");
145 tmpAutosuggest.setSchemeTitle(schemeValue +
"@" + schemeLang);
146 JSONObject schemeURIObject = (JSONObject) tmpElement.get(
"scheme");
147 String schemeURIValue = (String) schemeURIObject.get(
"value");
148 tmpAutosuggest.setSchemeURI(schemeURIValue);
150 JSONObject scopeNoteObject = (JSONObject) tmpElement.get(
"scopeNote");
151 if (scopeNoteObject !=
null) {
152 String scopeNoteValue = (String) scopeNoteObject.get(
"value");
153 String scopeNoteLang = (String) scopeNoteObject.get(
"xml:lang");
154 tmpAutosuggest.setDescription(scopeNoteValue +
"@" + scopeNoteLang);
157 String broaderVL =
"";
158 String broaderURI =
"";
159 JSONObject broaderObject = (JSONObject) tmpElement.get(
"BroaderPreferredTerm");
160 if (broaderObject !=
null) {
161 String broaderValue = (String) broaderObject.get(
"value");
162 String broaderLang = (String) broaderObject.get(
"xml:lang");
163 broaderVL = broaderValue.replace(
"<",
"").replace(
">",
"") +
"@" + broaderLang.replace(
"<",
"").replace(
">",
"");
165 JSONObject broaderURIObject = (JSONObject) tmpElement.get(
"BroaderPreferred");
166 if (broaderURIObject !=
null) {
167 broaderURI = (String) broaderURIObject.get(
"value");
169 if (!broaderURI.equals(
"")) {
170 HashMap<String, String> hstmpBroader =
new HashMap<String, String>();
171 hstmpBroader.put(broaderURI, broaderVL);
172 tmpAutosuggest.setBroaderTerm(hstmpBroader);
175 String narrowerVL =
"";
176 String narrowerURI =
"";
177 JSONObject narrowerObject = (JSONObject) tmpElement.get(
"NarrowerPreferredTerm");
178 if (narrowerObject !=
null) {
179 String narrowerValue = (String) narrowerObject.get(
"value");
180 String narrowerLang = (String) narrowerObject.get(
"xml:lang");
181 narrowerVL = narrowerValue.replace(
"<",
"").replace(
">",
"") +
"@" + narrowerLang.replace(
"<",
"").replace(
">",
"");
183 JSONObject narrowerURIObject = (JSONObject) tmpElement.get(
"NarrowerPreferred");
184 if (narrowerURIObject !=
null) {
185 narrowerURI = (String) narrowerURIObject.get(
"value");
187 if (!narrowerURI.equals(
"")) {
188 HashMap<String, String> hstmpNarrower =
new HashMap<String, String>();
189 hstmpNarrower.put(narrowerURI, narrowerVL);
190 tmpAutosuggest.setNarrowerTerm(hstmpNarrower);
195 for (Map.Entry<String, SuggestionItem> entry : autosuggests.entrySet()) {
197 JSONObject similarityObject =
new JSONObject();
198 SuggestionItem tmpAS = entry.getValue();
199 JSONObject suggestionObject =
new JSONObject();
201 suggestionObject.put(
"uri", tmpAS.getURL());
202 suggestionObject.put(
"id", tmpAS.getId());
204 JSONArray prefLabelArray =
new JSONArray();
205 List<Double> prefLabelSimilarity =
new ArrayList();
206 for (String item : tmpAS.getLabels()) {
207 String[] splitItem = item.split(
"@");
208 JSONObject jo =
new JSONObject();
209 jo.put(
"label", splitItem[0]);
210 jo.put(
"lang", splitItem[1]);
211 prefLabelArray.add(jo);
212 prefLabelSimilarity.add(Similarity.NormalizedLevenshtein(searchword, splitItem[0]));
214 suggestionObject.put(
"prefLabels", prefLabelArray);
215 similarityObject.put(
"label", Collections.min(prefLabelSimilarity));
217 String[] splitVocabItem = tmpAS.getSchemeTitle().split(
"@");
218 if (splitVocabItem.length > 1) {
219 JSONObject joVoc =
new JSONObject();
220 joVoc.put(
"label", splitVocabItem[0]);
221 joVoc.put(
"lang", splitVocabItem[1]);
222 joVoc.put(
"uri", tmpAS.getSchemeURI());
223 suggestionObject.put(
"vocab", joVoc);
226 for (String item : tmpAS.getDescriptions()) {
227 String[] splitItem = item.split(
"@");
228 JSONObject jo =
new JSONObject();
229 jo.put(
"note", splitItem[0]);
230 jo.put(
"lang", splitItem[1]);
231 suggestionObject.put(
"scopeNote", jo);
232 similarityObject.put(
"scopeNote", Similarity.NormalizedLevenshtein(searchword, splitItem[0]));
235 Set broaderTerms = tmpAS.getBroaderTerms();
236 JSONArray broaderArrayNew =
new JSONArray();
237 if (broaderTerms.size() > 0) {
238 for (Object element : broaderTerms) {
239 Map hm = (Map) element;
240 Iterator entries = hm.entrySet().iterator();
241 while (entries.hasNext()) {
242 Map.Entry thisEntry = (Map.Entry) entries.next();
243 String key = (String) thisEntry.getKey();
244 String value = (String) thisEntry.getValue();
245 JSONObject broaderObjectTmp =
new JSONObject();
246 broaderObjectTmp.put(
"uri", key);
247 broaderObjectTmp.put(
"label", value);
248 broaderArrayNew.add(broaderObjectTmp);
252 suggestionObject.put(
"broaderTerms", broaderArrayNew);
254 Set narrowerTerms = tmpAS.getNarrowerTerms();
255 JSONArray narrowerArrayNew =
new JSONArray();
256 if (narrowerTerms.size() > 0) {
257 for (Object element : narrowerTerms) {
258 Map hm = (Map) element;
259 Iterator entries = hm.entrySet().iterator();
260 while (entries.hasNext()) {
261 Map.Entry thisEntry = (Map.Entry) entries.next();
262 String key = (String) thisEntry.getKey();
263 String value = (String) thisEntry.getValue();
264 JSONObject narrowerObjectTmp =
new JSONObject();
265 narrowerObjectTmp.put(
"uri", key);
266 narrowerObjectTmp.put(
"label", value);
267 narrowerArrayNew.add(narrowerObjectTmp);
271 suggestionObject.put(
"narrowerTerms", narrowerArrayNew);
273 suggestionObject.put(
"similarityNormalizedLevenshtein", similarityObject);
275 outArray.add(suggestionObject);
279 OUTSTRING = outArray.toString();
280 if (acceptEncoding.contains(
"gzip")) {
282 final String OUTSTRING_FINAL = OUTSTRING;
283 StreamingOutput stream;
284 stream =
new StreamingOutput() {
286 public void write(OutputStream output)
throws IOException, WebApplicationException {
288 output =
GZIP(OUTSTRING_FINAL, output);
290 System.out.println(e.toString());
294 return Response.ok(stream).header(
"Content-Type",
"application/json;charset=UTF-8").header(
"Content-Encoding",
"gzip").build();
296 return Response.ok(OUTSTRING).header(
"Content-Type",
"application/json;charset=UTF-8").build();
299 return Response.status(Response.Status.INTERNAL_SERVER_ERROR).entity(Logging.getMessageJSON(e,
"v1.rest.SearchResource"))
300 .header(
"Content-Type",
"application/json;charset=UTF-8").build();