function execQuery(q, g) {
    map = [];
    return client.query(q).then(function(res, err) {
        if (err) {
            console.log('recommendation_engine: could not retrieve classes or properties: ' + err);
            return;
        }

        var uris = res.map(function(result) {
            return result.cp.value;
        });
        map[g] = uris;
        return {"graph": g, "list": uris};
    });
}
app.get('/sparql-proxy/:endpoint/:query', function(req, res) {
    var query = req.param("query");    
    var endpoint = req.param("endpoint");   
    var client = new GraphStoreClient(endpoint, null);

    client.query(query).then(function(result, err) {
         if (err) {
            console.log('visualization_backend: Could not execute query: ' + err);
            return;
        }
        console.log("SPARQL_RESULT");
        console.dir(result);
    res.send(result);
     });   
});
function query(ontology_graph, ontology_endpoint) {
    console.log("QUERY VISUALIZATION PATTERNS");

    var client = new GraphStoreClient(ontology_endpoint, null);

    var query = "";

    query += 'PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> \n';
    query += 'PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#> \n';
    query += 'PREFIX xsd: <http://www.w3.org/2001/XMLSchema#> \n';
    query += 'PREFIX vis: <http://linda-project.eu/linda-visualization#> \n';
    query += 'PREFIX visconf: <http://linda-project.eu/visualization-configuration#> \n';

    query += "SELECT  ";
    query += "?visualizationName ?optionName ?minCardinality ?maxCardinality ?scaleOfMeasurement ?dimensionRole ?associatedProperty \n ";
    query += "WHERE \n";
    query += "{ \n";
    query += "GRAPH <" + ontology_graph + "> \n";
    query += "{ \n";
    query += "?visualization a vis:Visualization .\n ";
    query += "?visualization vis:visualizationName ?visualizationName  .\n ";
    query += "?visualization vis:structureOption ?structureOption .\n ";
    query += "?structureOption vis:optionName ?optionName .\n ";
    query += "?structureOption vis:optionType ?optionType .\n ";
    query += "OPTIONAL { ?optionType vis:minCardinality ?minCardinality .}\n ";
    query += "OPTIONAL { ?optionType vis:maxCardinality ?maxCardinality .}\n ";
    query += "?optionType vis:scaleOfMeasurement ?scale .\n ";
    query += "?scale rdfs:label ?scaleOfMeasurement .\n ";
    query += "OPTIONAL {\n";
    query += " ?optionType vis:dimensionRole ?dimensionRole . \n"
    query += "} \n ";
    query += "OPTIONAL { ?optionType vis:associatedProperty ?associatedProperty . } \n ";
    query += "} \n";
    query += "} \n";

    // console.log("QUERY VISUALIZATIONS PATTERNS");
    // console.log(query);

    var patterns = {};

    return client.query(query).then(function (results, err) {

        // console.log("SPARQL RESULT VISUALIZATION PATTERNS");
        // console.dir(results);

        for (var i = 0; i < results.length; i++) {
            var option = results[i];

            var visualizationName_ = option['visualizationName']['value'];
            var optionName_ = option['optionName']['value'];

            if (patterns[visualizationName_]) {
                if (patterns[visualizationName_][optionName_]) {
                    patterns[visualizationName_][optionName_]['scalesOfMeasurement'].push(option['scaleOfMeasurement']['value']);
                } else {
                    patterns[visualizationName_][optionName_] = {
                        optionName: option['optionName']['value'],
                        scalesOfMeasurement: [option['scaleOfMeasurement']['value']],
                        dimensionRole: (option['dimensionRole'] || {})['value'],
                        associatedProperty: (option['associatedProperty'] || {})['value'],
                        minCardinality: parseInt(option['minCardinality'] || {})['value'],
                        maxCardinality: parseInt(option['maxCardinality'] || {})['value']
                    };
                }
            } else {
                patterns[visualizationName_] = {};
                patterns[visualizationName_][optionName_] = {
                    optionName: option['optionName']['value'],
                    scalesOfMeasurement: [option['scaleOfMeasurement']['value']],
                    dimensionRole: (option['dimensionRole'] || {})['value'],
                    associatedProperty: (option['associatedProperty'] || {})['value'],
                    minCardinality: parseInt(option['minCardinality'] || {})['value'],
                    maxCardinality: parseInt(option['maxCardinality'] || {})['value']
                };
            }
        }

        // console.log("VISUALIZATION PATTERNS ");
        // console.dir(JSON.stringify(patterns));
        return patterns;
    });
}