Everyone building GraphRAG tunes the same three dials: the retriever, the chunk size, the re-ranker. Then the retrieved subgraph gets serialized into the prompt with json.dumps() — and nobody measures what that step costs.

I did. It costs more than everything else you tuned.

The benchmark

I compared 10 graph serialization formats — JSON, GraphML, RDF variants, edge lists, and others — on three axes:

Token count for the same property graph