/// <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); }