CIRAD · 2026 internship · agentic genomics graph workbench
GenomInt
Query a genomic graph without writing Cypher.
For Ganoderma, GenomInt combines dialogue with graph exploration. I built the agent and the explorer’s backend: Neo4j queries and APIs.
At a glance
- Setting
- CIRAD internship · UMR AGAP · April–August 2026
- My work
- Pi agent · graph explorer backend (Neo4j queries and APIs) · security and deployment
- Team
- Supervisor: Létizia Camus-Kulandaivelu · interface: Théodore de Boisseson
- Next
- Closed code · research paper in preparation (co-author)
Context and scope
The Neo4j graph connects genomes, pangenes, transcripts and annotations to study Ganoderma pathogenicity. The goal: let biologists query this data directly.
Personal scope
I built the agent and the GKG Explorer backend: Neo4j queries, APIs, traversals and exports. I also worked on security and deployment. Théodore de Boisseson led the interface; we shared API contracts and integration.
The interface
01 · Choose the retrieval strategy
For retrieval, I compared a classic RAG pipeline, where a frozen index supplies one context before generation, with a fully agentic RAG: the model chooses its own tool calls, iterates and verifies. On a pangenomic graph, the comparison was decisive. The answers live in the schema and in Cypher traversals, not in text passages, so the agent drives GET_GRAPH_SCHEMA, READ_SKILL and QUERY_NEO4J as the question unfolds.
That agentic steering is paired with a small RAG system suited to pangenomic graph data: Neo4j’s native vector index, used for hybrid search. Pangene descriptions and annotations are embedded in the database; vector similarity surfaces nodes a literal query would have missed, then one or two traversals tie them back to neighbouring genomes, transcripts and annotations.
The division of labor stays strict: the vector suggests, Cypher proves. Sequence facts, such as pangene presence or core-genome membership, come from the graph, never from the model’s parameters.
- Trade-off
- Agentic retrieval spends more tool calls and tokens than a precomputed context; in exchange, every answer remains traceable to the graph nodes behind it.
02 · Serve the explorer and exports
For GKG Explorer, I built the queries and APIs behind the filters, graph and results. Filters stay server-side; pagination precedes enrichment so narrow selections do not prepare an entire chromosome.
For exports, sequences resolve in batches, FASTA segments retain their orientation and large state moves to SQLite or JSONL before the archive is assembled.
- Limit
- Row size, Neo4j buffers and ZIP files are not all byte-bounded: peak memory and load behavior remain unmeasured.
Pagination: fewer pages, not a benchmark
For 15,615 segments, page size 1,000 → 10,000.
Before · 1,000 / page 16 pages After · 10,000 / page 2 pages 14 fewer page requests; no measured time or memory gain.
03 · Constrain Cypher
The validator normalizes and tokenizes Cypher, rejects writes and inspects subqueries. QueryService adds read-only execution and a timeout; the client opens a Neo4j READ_ACCESS session.
The route enforces permissions and rate limits. These application controls do not prove least-privilege Neo4j credentials.
- Not established
- Adversarial fuzzing, penetration testing and a Neo4j privilege audit.
04 · Deploy and verify
Podman images, a compatible OCI registry, Helm and K3s. A local mirror worked around an image-format mismatch with the GitLab registry.
helm upgrade --install --atomic --wait, followed by checks of pods, services and protected routes: a repeatable procedure, not a guarantee under load.
- Still open
- Cross-replica stream resumption, load behavior and biological validation.




