Repo: bioinsight-graph (primary product)
Ecosystem: ECOSYSTEM_CONTEXT.md (compact handoff) · PORTFOLIO_ROADMAP.md (full cross-repo plan)
Sibling roadmaps: embabel-mcp ROADMAP · kg-rag-demo ROADMAP
No code in this doc — use task IDs when opening issues or PRs.
Disease–target knowledge graph (Neo4j + FastAPI + React). Credibility = public data + stable IDs + evidence on edges + provenance — not “hypergraph RAG” branding. GraphRAG-style structure is the base; next step is decomposed evidence and APIs that support planned multi-hop retrieval (MCP/agents consume this).
Inspired by (do not reimplement): PRoH — dynamic planning; UniAI-GraphRAG — ontology-guided structure + dual-channel retrieval. Here = curated ontology-backed graph + evidence bundles + API hops.
BioInsight’s target–disease graph comes from bulk public ingest, not schema-free LLM triple extraction. Ontology = industry IDs + typed relations + evidence constraints — not a separate hypergraph product.
| Do | Don’t |
|---|---|
| Open Targets–style ETL with evidence fields | Replace ingest with PubMed LLM extraction at scale |
| ENSG / EFO / MONDO validation on load | LangChain GraphRAG community pipeline as core architecture |
Document schema in docs/ONTOLOGY_SCHEMA.md |
Claim “production GraphRAG” without citable data underneath |
| ID | Item |
|---|---|
| ✓ 0.1 | PROVENANCE.md |
| ✓ 0.2 | GET /api/v1/meta |
| ✓ 0.3 | UI footer: data version + disclaimer |
| ✓ — | Search, gene detail, force graph, compare API, Docker/CI, architecture docs |
| ID | Task | Done when |
|---|---|---|
| ✓ 1.1 | Document chosen Open Targets (or equivalent) bulk ingest source + licence in PROVENANCE.md |
Source URL + version pinned |
| ✓ 1.2 | Neo4j: evidence_type, source, score (and optional study ref) on ASSOCIATED_WITH |
Schema migration documented |
| ✓ 1.3 | ETL v2: defensible slice (≥500 genes, thousands of associations) | /stats reflects scale |
| ✓ 1.4 | Ranked gene–disease endpoints return evidence breakdown per association | API tests + OpenAPI |
| ✓ 1.5 | CI fixtures from frozen subset of ingest | Reproducible CI without full download |
| ID | Task | Done when |
|---|---|---|
| ✓ 2.0 | docs/ONTOLOGY_SCHEMA.md — entity types, relation types, ID rules (S=(E,R,Φ) style) |
Matches Neo4j model + API |
| ✓ 2.1 | Ingest: Ensembl ENSG + EFO/MONDO on diseases | Validation on load (app/identifiers.py, ETL --strict) |
| ✓ 2.2 | GET /genes/{id}/external-links (Ensembl, Open Targets, UniProt) |
All demo genes resolve |
| ✓ 2.3 | UI: “Open in Ensembl / Open Targets” on gene page | Links live |
| ✓ 2.4 | GET /resolve — ontology-aware gene/disease resolution |
MCP resolve_identifier + OpenAPI |
| ✓ 3.1 | UI: evidence chart (by type) on gene detail | Matches API breakdown |
| ✓ 3.2 | UI: disease page → top targets | Disease-centric workflow |
| ✓ 3.3 | UI: compare genes (wire compare API) | Side-by-side diseases |
| ✓ 3.4 | POST /genes/batch-lookup |
Batch in OpenAPI |
| ✓ 3.5 | GET /export/gene-report (TSV/JSON + provenance columns) |
Download works |
| ✓ 3.6 | Refresh README screenshots/GIF | scripts/capture_media.mjs (search, graph, compare, disease, GIF) |
| ID | Task | Done when |
|---|---|---|
| ✓ 4.3 | docs/PLATFORM.md — all services, ports, compose order |
One doc runs stack |
| ✓ 4.4 | Notebook: one gene → graph queries + (optional) literature pointer | notebooks/one_gene_exploration.ipynb |
| ✓ 5.2 | Tutorial: public data → Neo4j → API | GETTING_STARTED.md |
| ✓ 5.3 | docs/BENCHMARKS.md — nodes/edges, ingest time, search p95 |
Graph size + ingest measured; latency harness scripts/benchmark_api.py |
| ✓ 0.4 | README: associations ≠ causation (if not already prominent) | Non-goals visible |
| ID | Task | Done when |
|---|---|---|
| ✓ G0 | GAPFORGE.md — COU, risk tiers L0–L3, taxonomy, non-goals | Design doc merged |
| ✓ G1 | Neo4j Program/Drug/Trial/GapHypothesis/Review + PROV edges | init.cypher + ontology docs |
| ✓ G2 | Flurizan educational case seed | data/gapforge/flurizan_case.json + seed_gapforge.py |
| ✓ G2b | Astegolimab COPD educational case (Phase 2b→3 miss) | astegolimab_case.json; seed loads all data/gapforge/*.json |
| ✓ G3 | API: programs, gaps, critic, reviews, review-bundle | /api/v1/programs, /gaps, /reviews |
| ✓ G4 | UI: /programs, /program/:id, /gaps/review |
HITL queue ships |
| ✓ G5 | embabel-mcp GapForge tools + research_program_gaps |
plan/dossier/propose/critic/export |
| ✓ G6 | Discern I/O weighing + HITL gate in UI | docs/DISCERN.md, /api/v1/discern, review-queue panel |
| ✓ G7 | Persist Discern on gap nodes for approve gate | POST /gaps/{id}/discern stores discern_json; UI + MCP |
| ✓ G8 | OntoHarness L2 semantic gate + RDF bridge + MCP + demo pack | POST /gaps/{id}/ontology-validate, HITL OntologyValidationPanel, persist approved_rdf_turtle, GET /export/approved-rdf, docker-compose.full.yml, embabel-mcp OntoHarness tools, ONTOHARNESS_DEMO.md + demo-recordings/ |
Companion data plane: kg-rag ClinicalTrials + PeerLens filter (kg-rag docs). Semantic gate: OntoHarness sidecar (v0.5 bridge).
| Endpoint / field | Why |
|---|---|
/meta |
data_version, sources, disclaimer (exists) |
| Evidence arrays on ranked associations | Hyperedge-like facts without a hypergraph DB |
GET /resolve |
Ontology-aware symbol/name → canonical id for agents |
/genes/{id}/external-links |
Federated identity story |
Stable /api/v1 + OpenAPI |
MCP and UI share contract |
| Export with provenance columns | Auditable analyst handoff |
- Replacing Ensembl, gnomAD, or Open Targets Platform
- Clinical diagnostics / treatment recommendations
- Causal claims from association scores alone
- Ingest via thousands of per-entity HTTP calls (use bulk)
- Embedding a PRoH-style hypergraph RAG engine in this repo
- LLM-primary graph for target–disease associations (use kg-rag for text-derived facts only)
- Towards AI — Neo4j + LangChain GraphRAG — stack patterns only
- ML6 — biomedical KG with LLMs — applies to kg-rag, not main ingest
- Production ontologies for GraphRAG (Medium)
- DeepSense — ontology-driven GraphRAG
- 1.1 → 1.5 (data + evidence)
- 2.1 → 2.3 (IDs + links)
- 3.1 → 3.3 (UI depth)
- 4.3, 5.3 (ops + benchmarks)
Update ✓ rows as you ship. Phase numbers match PORTFOLIO_ROADMAP.md.