Semantic Query Caching for Hetereogeneous Databases