diff --git a/README.md b/README.md index 908aa8f..233cc4c 100644 --- a/README.md +++ b/README.md @@ -70,6 +70,28 @@ Open **http://localhost:5173** | http://localhost:8002/docs | API | | http://localhost:7475 | Neo4j Browser | + +### Kafka → Neo4j loaders (optional) + +With the full compose stack, conflict and vessel consumers load Kafka topics into Neo4j: + +```bash +docker compose up -d kafka zookeeper neo4j graph-loader vessel-loader +``` + +| Service | Consumer | Writes | +|---------|----------|--------| +| `graph-loader` | `python -m src.consumers graph-loader` | `:Event` nodes from GDELT/conflict topics | +| `vessel-loader` | `python -m src.consumers vessel-loader` | `:Vessel` nodes (+ chokepoint links) from AIS topics | +| `rag-indexer` | `python -m src.consumers rag-indexer` | Qdrant embeddings from conflict events | + +Local one-shot (without compose services): + +```bash +make consume-graph # or: python -m src.consumers graph-loader +make consume-vessel # or: python -m src.consumers vessel-loader +``` + ### ERP tier-N demo (optional) ```bash diff --git a/docker-compose.yml b/docker-compose.yml index 238052f..1d6c54b 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -127,6 +127,39 @@ services: timeout: 5s retries: 5 + + # Graph loader — Kafka conflict events → Neo4j :Event nodes + graph-loader: + build: . + command: python -m src.consumers graph-loader --max-messages 0 + environment: + - KAFKA_BOOTSTRAP_SERVERS=kafka:29092 + - NEO4J_URI=bolt://neo4j:7687 + - NEO4J_USER=neo4j + - NEO4J_PASSWORD=${NEO4J_PASSWORD:-meridian_password} + depends_on: + kafka: + condition: service_healthy + neo4j: + condition: service_healthy + restart: unless-stopped + + # Vessel loader — AISHub vessel events → Neo4j :Vessel nodes + vessel-loader: + build: . + command: python -m src.consumers vessel-loader --max-messages 0 + environment: + - KAFKA_BOOTSTRAP_SERVERS=kafka:29092 + - NEO4J_URI=bolt://neo4j:7687 + - NEO4J_USER=neo4j + - NEO4J_PASSWORD=${NEO4J_PASSWORD:-meridian_password} + depends_on: + kafka: + condition: service_healthy + neo4j: + condition: service_healthy + restart: unless-stopped + # RAG indexer — streams Kafka conflict events into Qdrant rag-indexer: build: .