Hypertree Decompositions and Tractable Queries