Publication Timeline KG¶
Track the lifecycle of biomedical research from preprint to peer-reviewed publication. Identify which fields are accelerating, which journals are fastest to review, and which author networks drive rapid translation.
Motivation¶
A preprint posted on bioRxiv may take 3 months or 3 years to appear in a peer-reviewed journal — or never. This variation signals where the field is investing review effort:
- Fast conversion (< 6 months) = active, well-funded areas with dedicated reviewer pools
- Slow conversion (> 1 year) = niche topics, understaffed review pipelines, or paradigm-shifting work requiring extended scrutiny
- No conversion = negative results, incremental work, or preprints that serve as the final record
By building a knowledge graph of this lifecycle, we can:
- Identify emerging research fronts (topics accelerating toward publication)
- Benchmark journal review speeds per topic area
- Map author collaboration networks and their publication velocity
- Prioritize data sources for the main KG (published = higher confidence)
Schema¶
flowchart LR
PP[Preprint] -->|PUBLISHED_AS\ndays_to_publication| PUB[Publication]
PP -->|AUTHORED_BY| A[Author]
PUB -->|AUTHORED_BY| A
PUB -->|PUBLISHED_IN| J[Journal]
PP -->|TAGGED_WITH| T[Topic]
PUB -->|TAGGED_WITH| T
PP -->|CITES| PP2[Preprint/Publication]
A -->|COLLABORATES_WITH| A2[Author]
Node Types¶
| Node | Key Properties |
|---|---|
| Preprint | doi, title, posted_date, category, abstract, version |
| Publication | doi, title, journal, published_date, pmid, pmcid |
| Author | name, orcid, institution |
| Journal | name, issn, sjr_score, sjr_quartile, h_index, subject_area |
| Topic | name, category |
Relationship Types¶
| Relationship | Properties | Meaning |
|---|---|---|
| PUBLISHED_AS | days_to_publication, days_to_acceptance | Preprint became this journal article |
| AUTHORED_BY | position (first/last/middle), is_corresponding | Who wrote it |
| PUBLISHED_IN | — | Which journal accepted it |
| TAGGED_WITH | — | Topic/keyword assignment |
| CITES | context | Reference links between papers |
| COLLABORATES_WITH | paper_count | Co-authorship (2+ shared papers) |
Data Sources¶
| Source | What it provides | Access |
|---|---|---|
| Europe PMC | Preprint search (indexes bioRxiv), metadata, keywords | Free API, no auth |
| Crossref | DOI resolution, publication dates, is-preprint-of relations |
Free API, no auth |
| bioRxiv API | Preprint details, category, versions | Free API, no auth |
| Scimago (SJR) | Journal impact scores, quartiles, h-index | Manual CSV download |
Usage¶
Interactive (TUI)¶
uv run bioingest
# Select: ⑥ Publication Timeline
# Enter queries: EGFR, IL-6, TP53
# Or type: gary (loads 276 entities from eval golden dataset)
# Set max preprints per query: 20
# → Outputs JSON to data/extractions/pub_timeline/
Programmatic¶
from bioingest.pub_timeline.pipeline import build_pub_timeline_kg, save_kg
from pathlib import Path
kg = build_pub_timeline_kg(
queries=["EGFR", "IL-6", "TP53", "BRCA1"],
max_per_query=50,
data_dir=Path("data"),
)
save_kg(kg, Path("data/extractions/pub_timeline/my_run.json"))
# Analyze
preprints = [n for n in kg["nodes"] if n["type"] == "Preprint"]
pub_rels = [r for r in kg["relationships"] if r["type"] == "PUBLISHED_AS"]
days = [r["days_to_publication"] for r in pub_rels if r.get("days_to_publication")]
print(f"Median time to publication: {sorted(days)[len(days)//2]} days")
Derived Metrics¶
| Metric | Definition | Use Case |
|---|---|---|
| median_days_to_publication | Median calendar days from preprint to journal, per topic | Compare review speed across fields |
| acceleration_score | Slope of days-to-publication over time (negative = speeding up) | Identify emerging fields |
| preprint_conversion_rate | Fraction of preprints eventually published | Signal topic maturity |
| journal_review_speed | Per-journal median days to publication | Benchmark journal responsiveness |
| author_velocity | Average days-to-publication for an author's papers | Identify fast-publishing networks |
Example Results¶
From a test run (EGFR + TP53, 10 preprints):
| Metric | Value |
|---|---|
| Preprints fetched | 10 |
| Published in journal | 4 (40%) |
| Median days to publication | 248 |
| Range | 194–305 days |
| Unique authors | 93 |
| Journals | 4 |
Output Format¶
JSON file with:
{
"nodes": [
{"id": "preprint:10.1101/...", "type": "Preprint", "title": "...", "posted_date": "2023-01-15"},
{"id": "publication:10.1038/...", "type": "Publication", "journal": "Nature", "published_date": "2023-08-20"},
{"id": "author:jane_doe", "type": "Author", "name": "Jane Doe", "orcid": "0000-0001-..."},
{"id": "journal:nature", "type": "Journal", "sjr_score": 14.2, "sjr_quartile": "Q1"},
{"id": "topic:egfr", "type": "Topic", "name": "EGFR"}
],
"relationships": [
{"source": "preprint:10.1101/...", "target": "publication:10.1038/...", "type": "PUBLISHED_AS", "days_to_publication": 217}
],
"metadata": {
"total_preprints": 100,
"total_publications": 42,
"conversion_rate": 0.42,
"generated_at": "2026-06-30T11:00:00"
}
}
Roadmap¶
- [x] Core pipeline: fetch preprints, resolve publications via Crossref, build KG JSON
- [x] TUI integration with Gary's entity list
- [x] SJR journal enrichment (optional)
- [ ] CITES edges from reference extraction (OCR/VLM on full-text PDFs)
- [ ] Run on full 276-entity list (large-scale analysis)
- [ ] Compute acceleration_score per topic over time
- [ ] Write to Neptune (from JSON output)
- [ ] Visualization: time-to-publication heatmap by topic x year