/// <summary>
        /// Method to query the Luis.ai
        /// </summary>
        /// <param name="query">String: Users search query</param>
        /// <returns>LuisJSONModel: Object containing luis.ai data</returns>
        public static async Task <LuisJsonModel> CallLuisAsync(string query)
        {
            LuisJsonModel data = new LuisJsonModel();

            using (HttpClient client = new HttpClient())
            {
                string luisUrl             = WebConfigurationManager.AppSettings["LUIS_Url"];
                string luisId              = WebConfigurationManager.AppSettings["LUIS_Id"];
                string luisSubscriptionKey = WebConfigurationManager.AppSettings["LUIS_Subscription_Key"];
                string luisQuery           = Uri.EscapeDataString(query);

                string requestUri = String.Format("{0}{1}?subscription-key={2}&verbose=true&q={3}", luisUrl, luisId, luisSubscriptionKey, luisQuery);
                Console.WriteLine(requestUri);

                HttpResponseMessage msg = await client.GetAsync(requestUri);

                if (msg.IsSuccessStatusCode)
                {
                    var jsonDataResponse = await msg.Content.ReadAsStringAsync();

                    Debug.WriteLine(jsonDataResponse);
                    data = JsonConvert.DeserializeObject <LuisJsonModel>(jsonDataResponse);
                }
            }
            return(data);
        }
        /// <summary>
        /// Method used to gather new data
        /// </summary>
        /// <param name="query">String: users search query</param>
        private async Task GatherNewDataAsync(string query)
        {
            //Luis.ai report
            LuisJsonModel luisJson = await Utilities.CallLuisAsync(query);

            //Create Sparql query from luis report
            string sparqlQuery = Utilities.ExtractLuisData(luisJson);

            //Dbpedia data
            SparqlResultSet resultSetMovieSearch = Utilities.QueryDbpedia(sparqlQuery);

            //Add to database
            LoopValuesToDatabase(query, resultSetMovieSearch);
        }
        /// <summary>
        /// Method to extract data from the Luis.ai JSON file
        /// </summary>
        /// <param name="luisJson">LuisJSONModel: Method used to extract data from the LuisJSONModel</param>
        /// <returns>String: Custom SPARQL query</returns>
        public static string ExtractLuisData(LuisJsonModel luisJson)
        {
            int    numberOfItems = 0;
            string genre         = "";
            int    year          = 0;
            string exactDate     = "";

            foreach (var i in luisJson.Entities)
            {
                switch (i.Type)
                {
                case "builtin.number":
                    if (int.TryParse(i.Resolution.Value, out int number))
                    {
                        if (number < 1000)
                        {
                            numberOfItems = number;
                        }
                    }
                    break;

                case "genre":
                    genre = i.entity;
                    break;

                case "builtin.datetime.date":
                    if (DateTime.TryParse(i.entity, out DateTime exactDateTime))
                    {
                        exactDate = exactDateTime.ToString();
                    }
                    else if (int.TryParse(i.entity, out int yearDateTime) && (i.entity.Length == 4))
                    {
                        year = yearDateTime;
                    }
                    break;
                }
            }
            return(CreateSparqlQuery(numberOfItems, genre, year, exactDate));
        }
        public void ExtractLuisDataTest()
        {
            string limit      = $"LIMIT({10})";
            string genreMatch = $"FILTER ( regex (str(?genre), '{"crime"}', 'i'))";
            string dateMatch  = String.Format("FILTER ((?releaseDate >= '{0}-01-01'^^xsd:date) && (?releaseDate < '{0}-12-31'^^xsd:date))", 2012);

            string queryPattern =
                "PREFIX xsd: <http://www.w3.org/2001/XMLSchema#> " +
                "PREFIX db: <http://dbpedia.org/ontology/> " +
                "PREFIX prop: <http://dbpedia.org/property/> " +
                "SELECT ?movieLink ?title ?genreLink ?genre ?releaseDate " +
                "WHERE {{ " +
                "?movieLink rdf:type db:Film; " +
                "foaf:name ?title. " +
                "OPTIONAL {{ ?movieLink prop:genre ?genreLink. " +
                "?genreLink rdfs:label ?genre. " +
                "FILTER(lang(?genre) = 'en') }}. " +
                "OPTIONAL {{ ?movieLink <http://dbpedia.org/ontology/releaseDate> ?releaseDate }}. " +

                "{0}" +
                "{1}" +
                "FILTER(lang(?title) = 'en') " +
                "}}" +
                "ORDER BY DESC(?releaseDate)" +
                "{2}";
            string expected = String.Format(queryPattern, genreMatch, dateMatch, limit);

            var directory = Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().Location);
            var file      = $"{directory}\\Classes\\TestItems\\test2LuisData.json";

            LuisJsonModel data = JsonConvert.DeserializeObject <LuisJsonModel>(File.ReadAllText(file));

            string output = Utilities.ExtractLuisData(data);

            Assert.AreEqual(expected, output);
        }