Finding the papers that cite EDI datasets
2026-10-18
Data citations!
EDI is looking for ways to do this automagically…
Numbers 2 & 3 pull data from multiple sources, including Crossref, PubMed, OpenAIRE, and more…
First a basic example with 2 DOIs, then a more complex example:
knb-lter-nes)After downloading the package, navigate there and create a synced python environment with uv
Resolved 24 packages in 26ms
Checked 11 packages in 5ms
Now run uv run python3 (or python if that works on your system) to get to the Python interpreter and enter these commands:
datacite_events: querying 2 DOIs...
openalex: querying 2 DOIs...
opencitations: querying 2 DOIs...
openalex: done (2 answered, 0 failed).
opencitations: done (2 answered, 0 failed).
datacite_events: done (2 answered, 0 failed).
(but a pretty small one)
EDI DOIs all look like 10.6073/pasta/<hash>, so the DOI doesn’t say which scope it’s in.
from dataset_citation_finder import find_citations
dois = open("knb-lter-nes_dois.txt").read().split()
cited = find_citations(
dois, db_path="nes_demo.sqlite",
sources=["datacite_events", "openalex", "opencitations"],
email="gmaurer@nmsu.edu",
# api_keys={"openalex": "..."}, # optional, raises rate limit
)datacite_events: querying 71 DOIs...
openalex: querying 71 DOIs...
opencitations: querying 71 DOIs...
opencitations: done (71 answered, 0 failed).
openalex: done (71 answered, 0 failed).
datacite_events: done (71 answered, 0 failed).
| Table | Contents |
|---|---|
citations |
one row per source’s report of a citation, with first & last seen dates |
queried |
one row per DOI/source and when each pair was last checked |
| Stat | n |
|---|---|
| At least one citation | 29 |
| Total unique citations | 58 |
| Found by | Citations |
|---|---|
| DataCite Events only | 25 |
| OpenAlex only | 4 |
| All sources | 5 |
Not everything gets cited, but we should make sure whether a database answered first.
42 # DOIs in the scope that have never been cited
This is how to export the citations (58 rows, 1 for each cited dataset)
from dataset_citation_finder import find_citations, read_citations
db = "nes_demo.sqlite"
# 1. Get your DOI list and the time of the last check from the store.
queried = read_citations(db, table="queried")
dois = queried["cited_doi"].unique().tolist()
last_run = queried["queried_at"].max()
# 2. Re-check every DOI against every source.
df = find_citations(dois, db_path=db, email="you@example.org")
# 3. Citations found for the first time in this run.
new = df[df["first_seen"] > last_run]
len(new)This small scope takes a few minutes, but we can improve performance a bit with API keys.
| Scope | DOIs |
|---|---|
knb-lter-nes |
71 |
knb-lter-ble |
132 |
knb-lter-kbs |
188 |
knb-lter-cap |
510 |
knb-lter-sev |
626 |
Theoretically we can do all of EDI, but it is ~83k DOIs, so will probably need to run on a server.
Should EDI populate DataCite events and Openalex/OpenCitations records automatically?
Remember that EDIutils has a function to add new citations.