/** * find specific answer to a query in the cache * @param query input query * @param ans sought specific answer to the query * @return found answer if any, otherwise empty answer */ public ConceptMap getAnswer(Q query, ConceptMap ans){ if(ans.isEmpty()) return ans; CacheEntry<Q, QueryAnswers> match = this.getEntry(query); if (match != null) { Q equivalentQuery = match.query(); MultiUnifier multiUnifier = equivalentQuery.getMultiUnifier(query); //NB: only used when checking for materialised answer duplicates ConceptMap answer = match.cachedElement().stream() .flatMap(a -> a.unify(multiUnifier)) .filter(a -> a.containsAll(ans)) .findFirst().orElse(null); if (answer != null) return answer; } //TODO should it create a cache entry? List<ConceptMap> answers = ReasonerQueries.create(query, ans).getQuery().execute(); return answers.isEmpty()? new ConceptMapImpl() : answers.iterator().next(); } }