def translate_and_execute_query(self, query, n_top=200): """ Generates candidate answers for the given query. :param query: Query to generate answer candidates for. :param n_top: The number of top candidates to keep. The top is determined using the provided scorer object. :return: A list of TranslationResult objects. """ TranslationResult = collections.namedtuple('TranslationResult', ['query_candidate', 'query_results_str'], verbose=False) start_time = time.time() # Parse query. results = [] queries_candidates = self.generate_candidates(query) logger.info("Ranking %s query candidates" % len(queries_candidates)) ranker = self.get_scorer() ranked_candidates = ranker.rank_query_candidates(queries_candidates) logger.info("Fetching results for all candidates.") n_total_results = 0 if len(ranked_candidates) > n_top: logger.info("Truncating returned candidates to %s." % n_top) for query_candidate in ranked_candidates[:n_top]: query_results_str = query_candidate.get_results_text() n_total_results += len(query_results_str) result = TranslationResult(query_candidate, query_results_str) results.append(result) logger.info("Fetched a total of %s results in %.2f ms." % (n_total_results, (time.time() - start_time))) logger.info("Done translating and executing: %s." % query) return results
def rank_candidates(query, ranker): """Rerank candidates of single query. :rtype query: EvaluationQuery :param query: :param scorer: :return: """ query.eval_candidates = ranker.rank_query_candidates( query.eval_candidates, key=lambda x: x.query_candidate) return query
def rank_candidates(query, ranker): """Rerank candidates of single query. :rtype query: EvaluationQuery :param query: :param scorer: :return: """ query.eval_candidates = ranker.rank_query_candidates(query.eval_candidates, key=lambda x: x.query_candidate) return query
def translate_and_execute_query_sq1(self, query, n_top=200): """ Translates the query and returns a list of namedtuples of type TranslationResult. Answering subquestion 1 :param query: :return: """ TranslationResult = collections.namedtuple( 'TranslationResult', ['query_candidate', 'query_result_rows'], verbose=False) # Parse query. results = [] num_sparql_queries = self.sparql_backend.num_queries_executed sparql_query_time = self.sparql_backend.total_query_time queries_candidates = self.translate_query(query) translation_time = (self.sparql_backend.total_query_time - sparql_query_time) * 1000 num_sparql_queries = self.sparql_backend.num_queries_executed - num_sparql_queries avg_query_time = translation_time / (num_sparql_queries + 0.001) logger.info("Translation executed %s queries in %.2f ms." " Average: %.2f ms." % (num_sparql_queries, translation_time, avg_query_time)) logger.info("Ranking %s query candidates" % len(queries_candidates)) ranker = self.scorer ranked_candidates = ranker.rank_query_candidates(queries_candidates) logger.info("Fetching results for all candidates.") sparql_query_time = self.sparql_backend.total_query_time n_total_results = 0 if len(ranked_candidates) > n_top: logger.info("Truncating returned candidates to %s." % n_top) for query_candidate in ranked_candidates[:n_top]: query_result = query_candidate.get_result_sq1(include_name=True) logger.info("query_candidate: %s." % query_candidate) logger.info("query_result: %s." % query_result) n_total_results += sum([len(rows) for rows in query_result]) result = TranslationResult(query_candidate, query_result) results.append(result) # This assumes that each query candidate uses the same SPARQL backend # instance which should be the case at the moment. result_fetch_time = (self.sparql_backend.total_query_time - sparql_query_time) * 1000 avg_result_fetch_time = result_fetch_time / (len(results) + 0.001) logger.info("Fetched a total of %s results in %s queries in %.2f ms." " Avg per query: %.2f ms." % (n_total_results, len(results), result_fetch_time, avg_result_fetch_time)) logger.info("Done translating and executing: %s." % query) return results
def translate_and_execute_query(self, query, n_top = 200): """ Translates the query and returns a list of namedtuples of type TranslationResult. :param query: :return: """ TranslationResult = collections.namedtuple('TranslationResult', ['query_candidate', 'query_result_rows'], verbose = False) # Parse query. results = [] num_sparql_queries = self.sparql_backend.num_queries_executed sparql_query_time = self.sparql_backend.total_query_time queries_candidates = self.translate_query(query) translation_time = (self.sparql_backend.total_query_time - sparql_query_time) * 1000 num_sparql_queries = self.sparql_backend.num_queries_executed - num_sparql_queries avg_query_time = translation_time / (num_sparql_queries + 0.001) logger.info("Translation executed %s queries in %.2f ms." " Average: %.2f ms." % (num_sparql_queries, translation_time, avg_query_time)) logger.info("Ranking %s query candidates" % len(queries_candidates)) ranker = self.scorer ranked_candidates = ranker.rank_query_candidates(queries_candidates) logger.info("Fetching results for all candidates.") sparql_query_time = self.sparql_backend.total_query_time n_total_results = 0 if len(ranked_candidates) > n_top: logger.info("Truncating returned candidates to %s." % n_top) for query_candidate in ranked_candidates[:n_top]: query_result = query_candidate.get_result(include_name = True) n_total_results += sum([len(rows) for rows in query_result]) result = TranslationResult(query_candidate, query_result) results.append(result) # This assumes that each query candidate uses the same SPARQL backend # instance which should be the case at the moment. result_fetch_time = (self.sparql_backend.total_query_time - sparql_query_time) * 1000 avg_result_fetch_time = result_fetch_time / (len(results) + 0.001) logger.info("Fetched a total of %s results in %s queries in %.2f ms." " Avg per query: %.2f ms." % (n_total_results, len(results), result_fetch_time, avg_result_fetch_time)) logger.info("Done translating and executing: %s." % query) return results