Inspiration
One of us studies life science informatics, the other computer science, and we both work with text mining in some way. When we read the Track 1 brief, one sentence stuck with us: what did centuries of texts know about medicinal plants, and does modern science agree?
We picked Pliny the Elder's Natural History, written around 77 AD. Book 20 alone is full of garden plants that cure everything from snake bites to hair loss, and European doctors relied on texts like this for more than a thousand years. Nobody has ever checked them systematically against modern research. We wanted to know whether that is even possible, and what you find if you try.
What it does
Our pipeline takes Pliny's text and, for every remedy he describes, tells you what modern science knows about it:
- it extracts each remedy claim with Pliny's exact words,
- identifies the plant with its modern scientific name,
- translates the ancient disease into modern medical vocabulary ("dropsy" becomes edema, "quinsy" a peritonsillar abscess),
- searches the biomedical literature for studies on that plant and condition,
- and puts everything into a knowledge graph.
You can explore the results in two ways. Researchers can load the graph into Neo4j and ask their own questions in Cypher, such as "which plants did Pliny recommend for cough, and what does science say?" Everyone else can use our explorer app right in the browser, with nothing to install: pick a plant or a disease, click a remedy, and see Pliny's own words next to the modern papers that test it.
Every verdict traces back to the sentence Pliny wrote, so nothing is a black box.
How we built it
We started from the 1855 English translation on the Perseus Digital Library. The structured text turned out to be a gift: Pliny states in every chapter heading how many remedies it contains ("ORAGE: FOURTEEN REMEDIES"), which gave us a free recall check, and the 19th-century editors left 548 footnotes that identify many of the plants.
For extraction we used a small open model (qwen3:8b) running locally through Ollama. We built a gold set of 186 hand-checked claims from seven chapters, tuned our prompt on two of them and kept five aside for testing. On the four test chapters never seen during development, extraction reaches
$$ F_1 = \frac{2 \cdot P \cdot R}{P + R} = 0.82 $$
For plants, the 1855 footnotes decide where the editors were confident; the model only fills the gaps, and World Flora Online checks every name. Conditions are mapped to MeSH, the vocabulary PubMed indexes papers with, and evidence comes from Europe PMC.
The knowledge graph has five kinds of nodes: plants, conditions, claims (with Pliny's exact words and their place in the book), sources (Pliny himself, a named physician, or hearsay) and papers. A claim is about a plant, for a condition and stated by a source; a paper tests a plant and a condition. On top of that, every remedy is an arrow from plant to condition named after its verdict, so a single query shows what science says. We export it as CSV files with a Cypher load script for Neo4j, and as a self-contained explorer page hosted on GitHub Pages, which works offline too.
We used an AI coding assistant to speed up writing the code, but every stage was run, debugged and checked by us on the real data, and we reviewed the critical decisions by hand.
Challenges we ran into
Historical text fights back. Some things that went wrong along the way:
- Old names, wrong plants. Fuzzy name matching turned "Lactuca silvestris" (wild lettuce) into a plant from Thailand, and old typos in the 1855 footnotes ("Pinpinella anisum") made anise disappear. We had to make the matching much stricter and review the most frequent plants ourselves.
- Geography backfired. A rule that rejects plants not native to the Mediterranean also threw out basil and cucumber, which the Romans imported from India. Ancient trade is real.
- "Bite" means something else in dentistry. Our first literature searches matched garlic papers about root canals to "snake bites". Restricting searches to titles and abstracts fixed most of it.
- Being honest about our own numbers. When we checked the 32 remedies our pipeline marked as "supported" by hand, only 5 held up. Most were general overviews of a plant that never tested the specific use. That was humbling, but it changed how we report everything.
Accomplishments that we're proud of
- About 1,600 claims extracted, 99.8% linked to a modern plant, 94% to modern medicine.
- Five of Pliny's remedies are confirmed by modern human studies, among them onion juice for hair loss and anise for indigestion. Half have never been studied at all, which leaves 307 well-identified, untested leads.
- Claims Pliny attributes to named physicians were studied significantly more often than his own ($p \approx 0.01$), but not more often confirmed: ancient authority pointed to the right questions, not to the right answers.
- A knowledge graph of 112 plants, 351 conditions, 1,525 claims and 253 papers, explorable in Neo4j or in a browser app that anyone can open.
- The whole pipeline reproduces every result from cached data, without a GPU or internet connection.
What we learned
Language models are great at proposing, and bad at deciding. The best results came when the model suggested something and a curated source, the 1855 editors or one of us made the final call. We also learned that measuring your errors per category tells you far more than one overall accuracy score, and that "untested" is not the same as "wrong": mostly, modern science has simply never asked.
What's next
We'd like to move from has it been studied? to why might it work? Linking our plants to their compounds through COCONUT, LOTUS and BioKB/ChEBI, and from there to targets in ChEMBL, would let us rank the 307 untested remedies by how plausible they are. We also want to add the EU's EMA herbal monographs as a second opinion, and run the same pipeline on more of Pliny and on Dioscorides.