Langchain is not my favorite, so I just wrote my own abstractions.
I hosted a neo4j graph database and extracted entities from the input data. You can do this with spaCy or LLM. I then generated nodes and edges between these entities, the chunked text and the embeddings for semantic search.
This combines the power of search with higher relevance due to crawling the graph with more intention
So in our in GraphRAG-SDK we are running two phases, the first is sampling the data to suggest a schema and the second is using this schema to ground the LLM to this schema (as you suggested)
Check https://github.com/FalkorDB/GraphRAG-SDK