Architecture
Multi-Database Architecture - Visual Guide

Source: data_layer/docs/ARCHITECTURE_VISUAL.md

Multi-Database Architecture - Visual Guide

System Overview

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚                    JSONL Seed Files                         β”‚
β”‚                 (Source of Truth)                           β”‚
β”‚                                                             β”‚
β”‚  β”œβ”€β”€ seeds/                                                β”‚
β”‚  β”‚   β”œβ”€β”€ ufc.json                                         β”‚
β”‚  β”‚   β”œβ”€β”€ f1.json                                          β”‚
β”‚  β”‚   └── ...                                              β”‚
β”‚  └── seed.examples-kb/data/                               β”‚
β”‚      β”œβ”€β”€ triage.jsonl                                     β”‚
β”‚      └── contract_generation.jsonl                        β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
                            ↓
                   seed_supabase_multi_db.py
                            ↓
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚              Supabase PostgreSQL (Primary DB)               β”‚
β”‚                      REQUIRED βœ…                            β”‚
β”‚                                                             β”‚
β”‚  Tables:                                                    β”‚
β”‚  β”œβ”€β”€ sport_archetypes (5 master categories)               β”‚
β”‚  β”œβ”€β”€ prospective_leagues (all leagues + sync tracking)    β”‚
β”‚  └── few_shot_examples (AI examples)                      β”‚
β”‚                                                             β”‚
β”‚  Features:                                                  β”‚
β”‚  β”œβ”€β”€ Fast queries (indexed)                               β”‚
β”‚  β”œβ”€β”€ Sync status tracking                                 β”‚
β”‚  β”œβ”€β”€ Embedding storage (JSONB)                            β”‚
β”‚  └── ACID transactions                                     β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
              ↓                          ↓
    β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”        β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
    β”‚  Neo4j Graph    β”‚        β”‚ Pinecone Vector β”‚
    β”‚    OPTIONAL     β”‚        β”‚    OPTIONAL     β”‚
    β”‚       β­•        β”‚        β”‚       β­•        β”‚
    β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜        β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
              ↓                          ↓
    β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”        β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
    β”‚ Graph Relations β”‚        β”‚ Semantic Search β”‚
    β”‚                 β”‚        β”‚                 β”‚
    β”‚ Nodes:          β”‚        β”‚ Indexes:        β”‚
    β”‚ β€’ SportArchetypeβ”‚        β”‚ β€’ altsports-    β”‚
    β”‚ β€’ League        β”‚        β”‚   leagues       β”‚
    β”‚                 β”‚        β”‚ β€’ altsports-    β”‚
    β”‚ Relationships:  β”‚        β”‚   examples      β”‚
    β”‚ β€’ BELONGS_TO_   β”‚        β”‚                 β”‚
    β”‚   ARCHETYPE     β”‚        β”‚ Features:       β”‚
    β”‚                 β”‚        β”‚ β€’ Vector search β”‚
    β”‚ Features:       β”‚        β”‚ β€’ Similarity    β”‚
    β”‚ β€’ Pattern       β”‚        β”‚ β€’ Top-K results β”‚
    β”‚   discovery     β”‚        β”‚                 β”‚
    β”‚ β€’ Archetype     β”‚        β”‚                 β”‚
    β”‚   navigation    β”‚        β”‚                 β”‚
    β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜        β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

Sport Archetype System

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚                   5 Master Sport Archetypes                 β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
         ↓           ↓           ↓           ↓           ↓
    β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”
    β”‚ Racing β”‚  β”‚ Combat β”‚  β”‚  Team  β”‚  β”‚Precisionβ”‚  β”‚ Large  β”‚
    β”‚        β”‚  β”‚        β”‚  β”‚ Sport  β”‚  β”‚        β”‚  β”‚ Field  β”‚
    β””β”€β”€β”€β”€β”€β”€β”€β”€β”˜  β””β”€β”€β”€β”€β”€β”€β”€β”€β”˜  β””β”€β”€β”€β”€β”€β”€β”€β”€β”˜  β””β”€β”€β”€β”€β”€β”€β”€β”€β”˜  β””β”€β”€β”€β”€β”€β”€β”€β”€β”˜
        ↓           ↓           ↓           ↓           ↓
    β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”
    β”‚  F1    β”‚  β”‚  UFC   β”‚  β”‚ Soccer β”‚  β”‚  Golf  β”‚  β”‚Marathonβ”‚
    β”‚ NASCAR β”‚  β”‚ Boxing β”‚  β”‚Basketballβ”‚ β”‚Archery β”‚  β”‚Triathlonβ”‚
    β”‚ Horse  β”‚  β”‚Muay Thaiβ”‚ β”‚ Hockey β”‚  β”‚ Darts  β”‚  β”‚Cycling β”‚
    β”‚ Racing β”‚  β”‚Wrestlingβ”‚ β”‚Volleyballβ”‚ β”‚Shootingβ”‚  β”‚ Ski    β”‚
    β””β”€β”€β”€β”€β”€β”€β”€β”€β”˜  β””β”€β”€β”€β”€β”€β”€β”€β”€β”˜  β””β”€β”€β”€β”€β”€β”€β”€β”€β”˜  β””β”€β”€β”€β”€β”€β”€β”€β”€β”˜  β””β”€β”€β”€β”€β”€β”€β”€β”€β”˜

Data Flow

Seeding Flow

1. Read JSONL ──→ 2. Generate Embedding ──→ 3. Upsert Supabase
                          ↓
                   OpenAI API
                (text-embedding-3-small)
                        1536d
                          ↓
                          ↓
    β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
    ↓                                           ↓
4. Sync to Neo4j                    5. Sync to Pinecone
    ↓                                           ↓
CREATE (l:League)                    index.upsert(vector)
CREATE (a:SportArchetype)            with metadata
MERGE (l)-[:BELONGS_TO]->(a)         in namespace
    ↓                                           ↓
    ↓                                           ↓
6. Update Supabase sync status
    neo4j_sync_status = 'synced'
    pinecone_sync_status = 'synced'

Query Flow

User Query: "Find high-speed racing leagues"
                    ↓
            1. Generate embedding
                    ↓
                OpenAI API
                    ↓
                    ↓
    β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
    ↓                               ↓
2. Vector Search              3. OR Direct Query
    (Pinecone)                    (Supabase)
    ↓                               ↓
    Return league_tags              Return leagues
    ↓                               ↓
    ↓                               ↓
4. Get full data from Supabase
    WHERE league_tag IN (...)
                    ↓
                    ↓
5. (Optional) Get graph relationships
                (Neo4j)
                    ↓
    MATCH (l)-[:BELONGS_TO_ARCHETYPE]->(a)
    MATCH (sibling)-[:BELONGS_TO_ARCHETYPE]->(a)
                    ↓
                    ↓
            6. Return results to user

Database Sync Tracking

Supabase League Record:
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚ league_tag: "ufc"                           β”‚
β”‚ league_name: "Ultimate Fighting Championshipβ”‚
β”‚ sport_archetype: "combat"                   β”‚
β”‚                                             β”‚
β”‚ Neo4j Sync:                                 β”‚
β”‚ β”œβ”€β”€ neo4j_node_id: "abc123"                β”‚
β”‚ β”œβ”€β”€ neo4j_sync_status: "synced"           β”‚
β”‚ └── neo4j_synced_at: "2025-10-10T..."     β”‚
β”‚                                             β”‚
β”‚ Pinecone Sync:                              β”‚
β”‚ β”œβ”€β”€ pinecone_id: "ufc"                     β”‚
β”‚ β”œβ”€β”€ pinecone_namespace: "default"         β”‚
β”‚ β”œβ”€β”€ pinecone_sync_status: "synced"        β”‚
β”‚ └── pinecone_synced_at: "2025-10-10T..."  β”‚
β”‚                                             β”‚
β”‚ Embedding:                                  β”‚
β”‚ β”œβ”€β”€ embedding_vector: [0.123, -0.456, ...] β”‚
β”‚ β”œβ”€β”€ embedding_model: "text-embedding-3-smallβ”‚
β”‚ └── embedding_updated_at: "2025-10-10T..." β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

Graceful Degradation

Full System (All DBs Available):
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚ Supabase β”‚ βœ… Required
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
     ↓
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚  Neo4j   β”‚ βœ… Available β†’ Graph features enabled
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
     ↓
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚ Pinecone β”‚ βœ… Available β†’ Semantic search enabled
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
     ↓
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚  OpenAI  β”‚ βœ… Available β†’ Embeddings generated
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

Degraded System (Supabase Only):
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚ Supabase β”‚ βœ… Required
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
     ↓
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚  Neo4j   β”‚ ⚠️  Not available β†’ Graph features disabled
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
     ↓
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚ Pinecone β”‚ ⚠️  Not available β†’ Semantic search disabled
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
     ↓
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚  OpenAI  β”‚ ⚠️  Not available β†’ No embeddings generated
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

System still works! Just with reduced features.

File Organization

database/
β”œβ”€β”€ πŸ“‹ Documentation
β”‚   β”œβ”€β”€ QUICKSTART_SUPABASE.md        ⭐ Start here!
β”‚   β”œβ”€β”€ SETUP_STATUS.md                πŸ“Š Status report
β”‚   β”œβ”€β”€ SUPABASE_IMPLEMENTATION_SUMMARY.md
β”‚   β”œβ”€β”€ COMPLETION_SUMMARY.md
β”‚   β”œβ”€β”€ ARCHITECTURE_VISUAL.md         πŸ“Š This file
β”‚   └── INDEX.md                       πŸ—ΊοΈ  Navigation
β”‚
β”œβ”€β”€ πŸ”§ Scripts
β”‚   β”œβ”€β”€ seed_supabase_multi_db.py     ⭐ Unified seeding
β”‚   β”œβ”€β”€ validate_supabase_multi_db.py ⭐ Validation
β”‚   └── seed.examples.py               πŸ“ Examples
β”‚
β”œβ”€β”€ πŸ“¦ Seeds
β”‚   β”œβ”€β”€ seeds/                         🌱 League JSON files
β”‚   └── seed.examples-kb/data/         πŸ“š JSONL examples
β”‚
└── πŸ“Š Schemas
    β”œβ”€β”€ schemas/models/neo4j/          πŸ•ΈοΈ  Graph schema
    └── (SQL in QUICKSTART)            πŸ—„οΈ  Supabase tables

Command Flow

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚  1. Validate Setup                  β”‚
β”‚                                     β”‚
β”‚  $ python scripts/                  β”‚
β”‚      validate_supabase_multi_db.py  β”‚
β”‚                                     β”‚
β”‚  Checks:                            β”‚
β”‚  βœ… Environment variables           β”‚
β”‚  βœ… Database connections            β”‚
β”‚  βœ… Seed files                      β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
              ↓
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚  2. Seed Archetypes (Required)      β”‚
β”‚                                     β”‚
β”‚  $ python scripts/                  β”‚
β”‚      seed_supabase_multi_db.py      β”‚
β”‚      --archetypes                   β”‚
β”‚                                     β”‚
β”‚  Creates:                           β”‚
β”‚  ✨ 5 sport archetype records       β”‚
β”‚  ✨ Neo4j archetype nodes           β”‚
β”‚  ✨ Pinecone archetype vectors      β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
              ↓
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚  3. Seed Leagues (Optional)         β”‚
β”‚                                     β”‚
β”‚  $ python scripts/                  β”‚
β”‚      seed_supabase_multi_db.py      β”‚
β”‚      --leagues                      β”‚
β”‚                                     β”‚
β”‚  For each league JSON:              β”‚
β”‚  ✨ Insert to Supabase              β”‚
β”‚  ✨ Create Neo4j node               β”‚
β”‚  ✨ Link to archetype               β”‚
β”‚  ✨ Add to Pinecone                 β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
              ↓
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚  4. Seed Examples (Optional)        β”‚
β”‚                                     β”‚
β”‚  $ python scripts/                  β”‚
β”‚      seed_supabase_multi_db.py      β”‚
β”‚      --examples                     β”‚
β”‚                                     β”‚
β”‚  For each JSONL line:               β”‚
β”‚  ✨ Insert to Supabase              β”‚
β”‚  ✨ Add to Pinecone (by category)   β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
              ↓
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚  5. Query & Use                     β”‚
β”‚                                     β”‚
β”‚  Python:                            β”‚
β”‚  >>> from supabase import           β”‚
β”‚      create_client                  β”‚
β”‚  >>> supabase.table(...).select()   β”‚
β”‚                                     β”‚
β”‚  SQL (Supabase dashboard):          β”‚
β”‚  SELECT * FROM prospective_leagues  β”‚
β”‚  WHERE sport_archetype = 'combat'   β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

Environment Setup

.env file:
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚ Required:                           β”‚
β”‚ SUPABASE_URL=postgresql://...       β”‚
β”‚ SUPABASE_API_KEY=eyJhbGci...        β”‚
β”‚                                     β”‚
β”‚ Optional (for embeddings):          β”‚
β”‚ OPENAI_API_KEY=sk-...               β”‚
β”‚                                     β”‚
β”‚ Optional (for graph):               β”‚
β”‚ NEO4J_URI=bolt://localhost:7687     β”‚
β”‚ NEO4J_USERNAME=neo4j                β”‚
β”‚ NEO4J_PASSWORD=...                  β”‚
β”‚                                     β”‚
β”‚ Optional (for vectors):             β”‚
β”‚ PINECONE_API_KEY=...                β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

Quick Start: See QUICKSTART_SUPABASE.md

Full Index: See INDEX.md

Status: βœ… Production Ready

Platform

Documentation

Community

Support

partnership@altsportsdata.comdev@altsportsleagues.ai

2025 Β© AltSportsLeagues.ai. Powered by AI-driven sports business intelligence.

πŸ€– AI-Enhancedβ€’πŸ“Š Data-Drivenβ€’βš‘ Real-Time