Techniques for processing complex natural language inputs are described. A complex natural language input may be semantically tagged and parsed to identify individual clauses in the complex natural language input. An execution graph may be generated to represent the clauses and their dependencies. Nodes of the execution graph may be processed using NLU processing and/or a knowledge graph or other information storage and retrieval techniques, and results of such processing may be used to update clause variables with specific entities in the execution graph.