# Hospital Leadership Graph Database This repository contains the implementation for building a Neo4j graph database of Polish hospitals and their leadership structures. ## Overview The project creates a graph database that links: - **Hospitals** in Poland → **Directors** (`[:DYREKTOR]`) - **Hospitals** → **Supervisory Boards** (`[:RADNIA]`) - **Supervisory Board members** → **Political parties** (`[:CZŁONEK_PARTII]`) - **Supervisory Board members** → **Regional councilors** (`[:RADNY]`) when the same person holds both roles ## Implementation The implementation consists of: 1. **build_hospital_graph.py** - Main Python script that: - Sets up Neo4j connection and schema - Processes hospital data (using sample data as real API is not accessible) - Processes councilor data (using sample data) - Creates graph nodes and relationships - Generates summary reports 2. **PLAN.md** - Detailed execution plan outlining the steps and methodology ## Usage ### Prerequisites - Docker (to run Neo4j) - Python 3.6+ - Required packages: requests, beautifulsoup4, neo4j, pandas, python-levenshtein ### Setup ```bash # Run Neo4j container docker run -d --name neo4j-test -p 7687:7687 -p 7474:7474 -e NEO4J_AUTH=neo4j/password neo4j:latest # Create virtual environment and install dependencies python3 -m venv hospital_graph_env source hospital_graph_env/bin/activate pip install requests beautifulsoup4 neo4j pandas python-levenshtein # Run the script python build_hospital_graph.py ``` ## Data Sources 1. **Hospital List**: - Primary: NFZ registry or Ministry of Health (currently using sample data due to API unavailability) - Fallback: Wikipedia's "Lista szpitali w Polsce" 2. **Hospital Staff**: - Official hospital websites (often under "Zarząd" / "Rada Nadzorcza") 3. **Regional Councilors**: - Biuletyn Informacji Publicznej (BIP) for each voivodeship 4. **Political Party Affiliation**: - Same BIP pages or party registries ## Graph Schema - **Hospital** node with properties: `name`, `city`, `website`, `nip` - **Person** node with properties: `name`, `party`, `sourceUrls` (array) - **Council** node with property: `region` - Relationships: - `[:DYREKTOR]` from Hospital to Person - `[:RADNIA]` from Hospital to Person - `[:RADNY]` from Person to Council (with `region` property) - `[:CZŁONEK_PARTII]` from Person to Party (if applicable) ## Files Generated 1. **scrape_log.json** - Log of all scraping attempts 2. **overlap_report.csv** - Summary report of persons in multiple roles 3. **PLAN.md** - Detailed execution plan ## Validation The script includes validation to ensure: - Every hospital has at least one director relationship - All person nodes have their source URLs properly recorded - Graph schema constraints are enforced