public String getPersonaggiStoriciJSON() {
    logger.info("ListaPersonaggi JSON");

    String res = "";

    Sparql sp = new Sparql(queryPersonaggiStorici, endpoint);
    JSONObject result = new JSONObject(sp.returnJSON());
    JSONArray jarray = result.getJSONObject("results").getJSONArray("bindings");
    JSONArray arrayRisultati = new JSONArray(); // riscrivamo i risultati in maniera piu bella
    for (int i = 0; i < jarray.length(); i++) {
      JSONObject row = new JSONObject();
      String uri = jarray.getJSONObject(i).getJSONObject("person").getString("value");
      String name = jarray.getJSONObject(i).getJSONObject("name").getString("value");
      String job = "";
      if (jarray.getJSONObject(i).has("job"))
        job = jarray.getJSONObject(i).getJSONObject("job").getString("value");
      row.accumulate("URI", uri);
      row.accumulate("name", name);
      row.accumulate("icona", Place.returnJobIcona(job));
      row.accumulate(
          "detailEndpoint",
          ServerTomcat
              + infoPersonaggio
              + uri.replace("http://www.trentinocultura.net/asp_cat/main.asp?", ""));
      arrayRisultati.put(row);
    }
    logger.info("Restituiti " + arrayRisultati.length() + " personaggi storici");

    // return sp.returnJSON();
    return arrayRisultati.toString();
  }
  public JSONArray getHotelJSON(double latitudine, double longitudine, double prec) {
    logger.info(
        "RicercaHotel JSON "
            + "richiesta per lat:"
            + latitudine
            + " long:"
            + longitudine
            + " precisione: "
            + prec);
    String query =
        "PREFIX geo: <http://www.w3.org/2003/01/geo/wgs84_pos#>\n"
            + "PREFIX schema: <http://schema.org/>\n"
            + "PREFIX foaf: <http://xmlns.com/foaf/0.1/>\n"
            + "\n"
            + "SELECT DISTINCT ?h ?name ?category ?lat ?long ?comment ?phone ?loc ?via ?sito ?mail\n"
            + "FROM <http://data.fusepool.info:8181/ldp/trentino-point-of-interest-ttl>\n"
            + "WHERE {\n"
            + "  VALUES ?category{\n"
            + "    \"Bed & Breakfast\"\n"
            + " 	\"Hotel\"\n"
            + "        }\n"
            + "  ?h schema:category ?category;\n"
            + " 		rdfs:label  ?name;\n"
            + " 		geo:lat ?lat;\n"
            + " 		geo:long ?long.\n"
            + "	OPTIONAL{ ?h rdfs:comment ?comment.\n"
            + "               FILTER LANGMATCHES(LANG(?comment),  \"IT\")}\n"
            + "  OPTIONAL { ?h  foaf:homepage ?sito. }\n"
            + "  OPTIONAL { ?h  foaf:mbox ?mail. }\n"
            + "  OPTIONAL { ?h foaf:phone ?phone. }\n"
            + "  OPTIONAL { ?h  schema:streetAddress ?address .\n"
            + "             ?address  schema:addressLocality ?loc;\n"
            + "                       schema:streetAddress ?via.\n"
            + "           }\n"
            + "FILTER (?lat >= \""
            + (latitudine - prec)
            + "\"^^xsd:double && ?lat <= \""
            + (latitudine + prec)
            + "\"^^xsd:double && ?long >= \""
            + (longitudine - prec)
            + "\"^^xsd:double && ?long <= \""
            + (longitudine + prec)
            + "\"^^xsd:double)\n"
            + "  }";

    Sparql sp = new Sparql(query, endpoint);
    // array dei risultati finali
    JSONArray res = new JSONArray();
    // mettiamo tutti i risultati in questo JSONArray
    JSONArray jarrayRes =
        (new JSONObject(sp.returnJSON())).getJSONObject("results").getJSONArray("bindings");
    String[] campiHotel = {
      "name", "category", "lat", "long", "comment", "phone", "loc", "via", "sito", "mail"
    };
    for (int i = 0; i < jarrayRes.length(); i++) {
      JSONObject hotel = jarrayRes.getJSONObject(i);
      JSONObject json = new JSONObject();
      for (String c : campiHotel) {
        if (hotel.has(c)) {
          if (c.equals("name")) {
            if (Place.extractStar(hotel.getJSONObject(c).getString("value"))
                > 0) // se ha almeno 1 stella senno che cazz d hotel è aaaaaaa forse è un B&B
            json.put("stelle", Place.extractStar(hotel.getJSONObject(c).getString("value")));
            json.put(c, Place.removeStar(hotel.getJSONObject(c).getString("value")));
          } else {
            if (c.equals("lat") || c.equals("long")) {
              json.put(c, (hotel.getJSONObject(c).getDouble("value")));
            } else {
              json.put(c, String.valueOf(hotel.getJSONObject(c).get("value")));
            }
          }
        }
      }
      res.put(json);
    }
    logger.info(
        "RicercaHotel JSON "
            + "richiesta per lat:"
            + latitudine
            + " long:"
            + longitudine
            + " precisione: "
            + prec
            + " restituiti: "
            + jarrayRes.length()
            + " hotel");
    return res;
  }
  public JSONArray getLuoghiInteresse(double latitudine, double longitudine, double prec) {
    logger.info(
        "RicercaLuoghi JSON "
            + "richiesta per lat:"
            + latitudine
            + " long:"
            + longitudine
            + " precisione: "
            + prec);
    String query =
        "PREFIX geo: <http://www.w3.org/2003/01/geo/wgs84_pos#>\n"
            + "PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>\n"
            + "PREFIX schema: <http://schema.org/>\n"
            + "PREFIX dct: <http://purl.org/dc/terms/>\n"
            + "\n"
            + "SELECT DISTINCT ?label ?lat ?long ?description\n"
            + "FROM <http://data.fusepool.info:8181/ldp/trentino-architectural-cultural-heritage-enriched-ttl>\n"
            + "WHERE {\n"
            + "  ?building a schema:TouristAttraction ;\n"
            + "              rdfs:label ?label;\n"
            + "              dct:description ?description; \n"
            + "              geo:lat ?lat ;\n"
            + "              geo:long ?long .\n"
            + "              \n"
            + "  FILTER (?lat >= \""
            + (latitudine - prec)
            + "\"^^xsd:double && ?lat <= \""
            + (latitudine + prec)
            + "\"^^xsd:double && ?long >= \""
            + (longitudine - prec)
            + "\"^^xsd:double && ?long <= \""
            + (longitudine + prec)
            + "\"^^xsd:double)\n"
            + "  FILTER (!sameTerm(\"CASA\", ?description))"
            + "}";
    Sparql sp = new Sparql(query, endpoint);
    JSONArray res = new JSONArray();
    JSONArray jarrayRes =
        (new JSONObject(sp.returnJSON())).getJSONObject("results").getJSONArray("bindings");

    for (int i = 0; i < jarrayRes.length(); i++) {
      JSONObject json = new JSONObject();
      json.accumulate(
          "description",
          jarrayRes.getJSONObject(i).getJSONObject("description").getString("value"));
      json.accumulate(
          "label", jarrayRes.getJSONObject(i).getJSONObject("label").getString("value"));
      json.accumulate("long", jarrayRes.getJSONObject(i).getJSONObject("long").getDouble("value"));
      json.accumulate("lat", jarrayRes.getJSONObject(i).getJSONObject("lat").getDouble("value"));
      res.put(json);
    }
    logger.info(
        "RicercaLuoghi JSON "
            + "richiesta per lat:"
            + latitudine
            + " long:"
            + longitudine
            + " precisione: "
            + prec
            + " restituiti: "
            + jarrayRes.length()
            + " luoghi");
    return res;
  }
  public JSONArray getRistorantiJSON(double latitudine, double longitudine, double prec) {
    logger.info(
        "RicercaRistoranti JSON "
            + "richiesta per lat:"
            + latitudine
            + " long:"
            + longitudine
            + " precisione: "
            + prec);

    // credenziali YELP
    String CONSUMER_KEY = "Q87CAjXrI_s3k1LbbIEe9Q";
    String CONSUMER_SECRET = "9TflxKNwqGLNZ9IW_qJbd3SPc_4";
    String TOKEN = "nHwsQ0V0eok71taAjSZ_f4sE7DPe28Te";
    String TOKEN_SECRET = "8HwHjAYPqdGN-6dPW8OsPx7D3g0";
    // oggetto yelpApi
    YelpAPI yelpApi = new YelpAPI(CONSUMER_KEY, CONSUMER_SECRET, TOKEN, TOKEN_SECRET);

    String query =
        "PREFIX xsd: <http://www.w3.org/2001/XMLSchema#>\n"
            + "PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>\n"
            + "PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>\n"
            + "PREFIX schema: <http://schema.org/>\n"
            + "\n"
            + "SELECT ?name ?locality ?street ?locality ?lat ?long \n"
            + "FROM <http://data.fusepool.info:8181/ldp/trentino-restaurants-1/osterie-csv-csv-transformed-1>\n"
            + "{\n"
            + "  ?restaurant a schema:Restaurant ;  \n"
            + "         schema:name ?name ;\n"
            + "         schema:address ?address ;\n"
            + "         schema:geo ?geo .\n"
            + " \n"
            + "  ?geo a schema:GeoCoordinates ;\n"
            + "         schema:latitude ?lat ;\n"
            + "         schema:longitude ?long .\n"
            + " \n"
            + "  ?address a schema:PostalAddress ;\n"
            + "         schema:streetAddress ?street ;\n"
            + "         schema:addressLocality ?locality .\n"
            + " \n"
            + "FILTER (?lat >= \""
            + (latitudine - prec)
            + "\"^^xsd:double && ?lat <= \""
            + (latitudine + prec)
            + "\"^^xsd:double && ?long >= \""
            + (longitudine - prec)
            + "\"^^xsd:double && ?long <= \""
            + (longitudine + prec)
            + "\"^^xsd:double)\n"
            + "} ORDER BY ?lat";

    Sparql sp = new Sparql(query, endpoint);

    JSONArray res = new JSONArray();
    JSONArray jarrayRes =
        (new JSONObject(sp.returnJSON())).getJSONObject("results").getJSONArray("bindings");

    // dati da recuperare da yelp
    String[] datiYelp = {"rating", "snippet_text", "image_url", "phone"};

    for (int i = 0; i < jarrayRes.length(); i++) {
      JSONObject json = new JSONObject();
      json.accumulate("name", jarrayRes.getJSONObject(i).getJSONObject("name").getString("value"));
      json.accumulate(
          "street", jarrayRes.getJSONObject(i).getJSONObject("street").getString("value"));
      json.accumulate(
          "citta", jarrayRes.getJSONObject(i).getJSONObject("locality").getString("value"));
      json.accumulate("lat", jarrayRes.getJSONObject(i).getJSONObject("lat").getDouble("value"));
      json.accumulate("long", jarrayRes.getJSONObject(i).getJSONObject("long").getDouble("value"));
      JSONObject ristor =
          yelpApi.searchRistorante(
              yelpApi,
              jarrayRes.getJSONObject(i).getJSONObject("name").getString("value"),
              jarrayRes.getJSONObject(i).getJSONObject("lat").getString("value")
                  + ","
                  + jarrayRes.getJSONObject(i).getJSONObject("long").getString("value"));
      for (String d : datiYelp) {
        if (ristor.has(d)) json.put(d, String.valueOf(ristor.get(d)));
      }
      res.put(json);
    }
    logger.info(
        "RicercaRistoranti JSON "
            + "richiesta per lat:"
            + latitudine
            + " long:"
            + longitudine
            + " precisione: "
            + prec
            + " restituiti: "
            + jarrayRes.length()
            + " ristoranti");
    return res;
  } // fine getRistorantiJSON
  public String getInfoPersonaggioJSON(String URI) {
    logger.info("InfoPersonaggioJSON " + "richiesto:" + URI);

    String queryPersonaggio =
        "PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>\n"
            + "PREFIX schema: <http://schema.org/>\n"
            + "PREFIX dbo: <http://www.dbpedia.org/ontology/>\n"
            + "PREFIX fam: <http://vocab.fusepool.info/fam#>\n"
            + "\n"
            + "SELECT ?name ?title ?birthPlace ?deathPlace ?sameAs ?description \n"
            + "FROM <http://data.fusepool.info:8181/ldp/historical-characters/personaggi_storici_trentino-refine-csv-csv-transformed>\n"
            + "WHERE {\n"
            + "<"
            + URI
            + "> schema:name ?name."
            + "OPTIONAL { <"
            + URI
            + "> schema:jobTitle ?title }"
            + "OPTIONAL { <"
            + URI
            + "> schema:birthPlace ?birthPlace }"
            + "OPTIONAL { <"
            + URI
            + "> schema:deathPlace ?deathPlace }"
            + "OPTIONAL { <"
            + URI
            + "> schema:sameAs ?sameAs }"
            + "OPTIONAL { <"
            + URI
            + "> schema:description ?description }"
            + "}";

    Sparql sp = new Sparql(queryPersonaggio, endpoint);
    JSONObject result = new JSONObject(sp.returnJSON());
    JSONArray jarray = result.getJSONObject("results").getJSONArray("bindings");

    String queryReference =
        "PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>\n"
            + "PREFIX schema: <http://schema.org/>\n"
            + "PREFIX dbo: <http://www.dbpedia.org/ontology/>\n"
            + "PREFIX fam: <http://vocab.fusepool.info/fam#>\n"
            + "\n"
            + "SELECT ?ref\n"
            + "FROM <http://data.fusepool.info:8181/ldp/historical-characters/personaggi_storici_trentino-refine-csv-csv-transformed>\n"
            + "WHERE {\n"
            + "  <"
            + URI
            + "> a schema:Person ;\n"
            + "            fam:entity-reference ?ref .\n"
            + "}";

    sp = new Sparql(queryReference, endpoint);
    JSONObject resultReference = new JSONObject(sp.returnJSON());
    JSONArray jarrayReference = resultReference.getJSONObject("results").getJSONArray("bindings");
    JSONArray reference = new JSONArray(); // il jsonArray dei Reference
    // analizziamo se ci sono reference
    Set<String> listaReference = new HashSet<String>();
    if (jarrayReference.length() > 0) {
      int contaRef = 0;
      for (int i = 0; i < jarrayReference.length(); i++) {
        String ref =
            Place.converterWikiToDBpedia(
                jarrayReference.getJSONObject(i).getJSONObject("ref").getString("value"));
        listaReference.add(ref);
        reference.put(contaRef++, ref);
      }
    }
    JSONObject json = jarray.getJSONObject(0);
    JSONObject res = new JSONObject();

    String[] head = {"title", "name", "birthPlace", "deathPlace", "sameAs", "description"};
    for (int i = 0; i < head.length; i++) {
      if (i == 2) {
        if (json.has("birthPlace")) {
          listaReference.add((json.getJSONObject("birthPlace").getString("value")));
          res.put(
              "birthPlace",
              Place.removeDBpedia(json.getJSONObject("birthPlace").getString("value")));
          reference.put(reference.length(), json.getJSONObject("birthPlace").getString("value"));
        }
      } else if (i == 3) {
        if (json.has("deathPlace")) {
          listaReference.add((json.getJSONObject(head[i]).getString("value")));
          res.accumulate(
              "deathPlace",
              Place.removeDBpedia(json.getJSONObject("deathPlace").getString("value")));
          reference.put(reference.length(), json.getJSONObject("deathPlace").getString("value"));
        }
      } else {
        if (json.has(head[i]))
          res.accumulate(head[i], json.getJSONObject(head[i]).getString("value"));
      }
    }

    if (jarrayReference.length() > 0) res.put("reference", reference);

    // res.put("controllo",listaReference.toString());

    JSONArray placeArray = new JSONArray(); // qui andranno i reference solo in Trentino
    // recuperiamo i posti del trentino
    List<String> placeTrentino = (new Place()).getTrentinoPlace();
    // controlliamo se i reference del personaggio sono in Trentino
    int contaRef = 0;
    if (listaReference.size() > 0) {
      Place pl = new Place();

      for (String s : listaReference) {
        if (placeTrentino.contains(s)) placeArray.put(contaRef++, pl.getGeo(s));
      }
    }
    if (placeArray.length() > 0)
      // res.accumulate("place", placeArray);
      res.put("place", placeArray);
    logger.info("Restituito InfoPersonaggio JSON " + json.has("name"));
    return res.toString();
  } // fine getInfoPersonaggioJSON()