SportMind
A table can rank scorers. A graph can walk from a player to a team, a ring, and an award, and a separate model can give a win chance without the chat inventing one.
- Neo4j
- Weaviate
- LlamaIndex
- XGBoost
- FastAPI
- React
- 10seasons, 2013-14 to 2022-23
- 6,246document chunks in chat
- 658player forecast models
Why a graph and a document store
Roster facts, awards, and game results are relationships. Match reports and notes are prose. One index would force both through the same door.
- Ten seasons, about 1,400 players and 12,800 regular-season and playoff games, loaded into Neo4j.
- 6,246 document chunks embedded in Weaviate, searched with BM25 and dense retrieval together, then reranked.
How a question is routed
The orchestrator classifies intent first. A relationship question becomes Cypher. A passage question goes to the vector store. The prose store is not asked to invent a percentage.
- Generation tries Groq, then falls back to Gemini. Repeated questions hit an LRU cache.
- The React app streams the answer, draws a player or team neighbourhood, and can show all 30 teams.
- A markdown note can be indexed into the same store and asked about in chat.
Forecasts
Win probability is its own model because a box score is not a document. Player forecasts are short-memory models, one per player and stat, so a recent scoring run can move the next estimate.
- XGBoost win model, isotonic calibration, features cut down to form, rest, head-to-head, and venue.
- 658 EWMA models: 94 players by 7 box-score metrics. On the held-out season, points miss by about 5 and assists by about 1.6.
- A sample read: Warriors at home against the Celtics, 54% to 46%. LeBron’s next points estimate 31.1 against a recent 32.4.