rework Graph to use KV.from_listing