@wentorai/research-plugins 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +204 -0
- package/curated/analysis/README.md +64 -0
- package/curated/domains/README.md +104 -0
- package/curated/literature/README.md +53 -0
- package/curated/research/README.md +62 -0
- package/curated/tools/README.md +87 -0
- package/curated/writing/README.md +61 -0
- package/index.ts +39 -0
- package/mcp-configs/academic-db/ChatSpatial.json +17 -0
- package/mcp-configs/academic-db/academia-mcp.json +17 -0
- package/mcp-configs/academic-db/academic-paper-explorer.json +17 -0
- package/mcp-configs/academic-db/academic-search-mcp-server.json +17 -0
- package/mcp-configs/academic-db/agentinterviews-mcp.json +17 -0
- package/mcp-configs/academic-db/all-in-mcp.json +17 -0
- package/mcp-configs/academic-db/apple-health-mcp.json +17 -0
- package/mcp-configs/academic-db/arxiv-latex-mcp.json +17 -0
- package/mcp-configs/academic-db/arxiv-mcp-server.json +17 -0
- package/mcp-configs/academic-db/bgpt-mcp.json +17 -0
- package/mcp-configs/academic-db/biomcp.json +17 -0
- package/mcp-configs/academic-db/biothings-mcp.json +17 -0
- package/mcp-configs/academic-db/catalysishub-mcp-server.json +17 -0
- package/mcp-configs/academic-db/clinicaltrialsgov-mcp-server.json +17 -0
- package/mcp-configs/academic-db/deep-research-mcp.json +17 -0
- package/mcp-configs/academic-db/dicom-mcp.json +17 -0
- package/mcp-configs/academic-db/enrichr-mcp-server.json +17 -0
- package/mcp-configs/academic-db/fec-mcp-server.json +17 -0
- package/mcp-configs/academic-db/fhir-mcp-server-themomentum.json +17 -0
- package/mcp-configs/academic-db/fhir-mcp.json +19 -0
- package/mcp-configs/academic-db/gget-mcp.json +17 -0
- package/mcp-configs/academic-db/google-researcher-mcp.json +17 -0
- package/mcp-configs/academic-db/idea-reality-mcp.json +17 -0
- package/mcp-configs/academic-db/legiscan-mcp.json +19 -0
- package/mcp-configs/academic-db/lex.json +17 -0
- package/mcp-configs/ai-platform/Adaptive-Graph-of-Thoughts-MCP-server.json +17 -0
- package/mcp-configs/ai-platform/ai-counsel.json +17 -0
- package/mcp-configs/ai-platform/atlas-mcp-server.json +17 -0
- package/mcp-configs/ai-platform/counsel-mcp.json +17 -0
- package/mcp-configs/ai-platform/cross-llm-mcp.json +17 -0
- package/mcp-configs/ai-platform/gptr-mcp.json +17 -0
- package/mcp-configs/browser/decipher-research-agent.json +17 -0
- package/mcp-configs/browser/deep-research.json +17 -0
- package/mcp-configs/browser/everything-claude-code.json +17 -0
- package/mcp-configs/browser/gpt-researcher.json +17 -0
- package/mcp-configs/browser/heurist-agent-framework.json +17 -0
- package/mcp-configs/data-platform/4everland-hosting-mcp.json +17 -0
- package/mcp-configs/data-platform/context-keeper.json +17 -0
- package/mcp-configs/data-platform/context7.json +19 -0
- package/mcp-configs/data-platform/contextstream-mcp.json +17 -0
- package/mcp-configs/data-platform/email-mcp.json +17 -0
- package/mcp-configs/note-knowledge/ApeRAG.json +17 -0
- package/mcp-configs/note-knowledge/In-Memoria.json +17 -0
- package/mcp-configs/note-knowledge/agent-memory.json +17 -0
- package/mcp-configs/note-knowledge/aimemo.json +17 -0
- package/mcp-configs/note-knowledge/biel-mcp.json +19 -0
- package/mcp-configs/note-knowledge/cognee.json +17 -0
- package/mcp-configs/note-knowledge/context-awesome.json +17 -0
- package/mcp-configs/note-knowledge/context-mcp.json +17 -0
- package/mcp-configs/note-knowledge/conversation-handoff-mcp.json +17 -0
- package/mcp-configs/note-knowledge/cortex.json +17 -0
- package/mcp-configs/note-knowledge/devrag.json +17 -0
- package/mcp-configs/note-knowledge/easy-obsidian-mcp.json +17 -0
- package/mcp-configs/note-knowledge/engram.json +17 -0
- package/mcp-configs/note-knowledge/gnosis-mcp.json +17 -0
- package/mcp-configs/note-knowledge/graphlit-mcp-server.json +19 -0
- package/mcp-configs/reference-mgr/arxiv-cli.json +17 -0
- package/mcp-configs/reference-mgr/arxiv-search-mcp.json +17 -0
- package/mcp-configs/reference-mgr/chiken.json +17 -0
- package/mcp-configs/reference-mgr/claude-scholar.json +17 -0
- package/mcp-configs/reference-mgr/devonthink-mcp.json +17 -0
- package/mcp-configs/registry.json +447 -0
- package/openclaw.plugin.json +21 -0
- package/package.json +61 -0
- package/skills/analysis/dataviz/color-accessibility-guide/SKILL.md +230 -0
- package/skills/analysis/dataviz/geospatial-viz-guide/SKILL.md +218 -0
- package/skills/analysis/dataviz/interactive-viz-guide/SKILL.md +287 -0
- package/skills/analysis/dataviz/network-visualization-guide/SKILL.md +195 -0
- package/skills/analysis/dataviz/publication-figures-guide/SKILL.md +238 -0
- package/skills/analysis/dataviz/python-dataviz-guide/SKILL.md +195 -0
- package/skills/analysis/econometrics/causal-inference-guide/SKILL.md +197 -0
- package/skills/analysis/econometrics/iv-regression-guide/SKILL.md +198 -0
- package/skills/analysis/econometrics/panel-data-guide/SKILL.md +274 -0
- package/skills/analysis/econometrics/robustness-checks/SKILL.md +250 -0
- package/skills/analysis/econometrics/stata-regression/SKILL.md +117 -0
- package/skills/analysis/econometrics/time-series-guide/SKILL.md +235 -0
- package/skills/analysis/statistics/bayesian-statistics-guide/SKILL.md +221 -0
- package/skills/analysis/statistics/hypothesis-testing-guide/SKILL.md +210 -0
- package/skills/analysis/statistics/meta-analysis-guide/SKILL.md +206 -0
- package/skills/analysis/statistics/nonparametric-tests-guide/SKILL.md +221 -0
- package/skills/analysis/statistics/power-analysis-guide/SKILL.md +240 -0
- package/skills/analysis/statistics/sem-guide/SKILL.md +231 -0
- package/skills/analysis/statistics/survival-analysis-guide/SKILL.md +195 -0
- package/skills/analysis/wrangling/missing-data-handling/SKILL.md +224 -0
- package/skills/analysis/wrangling/pandas-data-wrangling/SKILL.md +242 -0
- package/skills/analysis/wrangling/questionnaire-design-guide/SKILL.md +234 -0
- package/skills/analysis/wrangling/text-mining-guide/SKILL.md +225 -0
- package/skills/domains/ai-ml/computer-vision-guide/SKILL.md +213 -0
- package/skills/domains/ai-ml/deep-learning-papers-guide/SKILL.md +200 -0
- package/skills/domains/ai-ml/llm-evaluation-guide/SKILL.md +194 -0
- package/skills/domains/ai-ml/prompt-engineering-research/SKILL.md +233 -0
- package/skills/domains/ai-ml/reinforcement-learning-guide/SKILL.md +254 -0
- package/skills/domains/ai-ml/transformer-architecture-guide/SKILL.md +233 -0
- package/skills/domains/biomedical/clinical-research-guide/SKILL.md +232 -0
- package/skills/domains/biomedical/clinicaltrials-api/SKILL.md +177 -0
- package/skills/domains/biomedical/epidemiology-guide/SKILL.md +200 -0
- package/skills/domains/biomedical/genomics-analysis-guide/SKILL.md +270 -0
- package/skills/domains/business/market-analysis-guide/SKILL.md +112 -0
- package/skills/domains/business/strategic-management-guide/SKILL.md +154 -0
- package/skills/domains/chemistry/computational-chemistry-guide/SKILL.md +266 -0
- package/skills/domains/chemistry/retrosynthesis-guide/SKILL.md +215 -0
- package/skills/domains/cs/algorithms-complexity-guide/SKILL.md +194 -0
- package/skills/domains/cs/dblp-api/SKILL.md +129 -0
- package/skills/domains/cs/software-engineering-research/SKILL.md +218 -0
- package/skills/domains/ecology/biodiversity-data-guide/SKILL.md +296 -0
- package/skills/domains/ecology/conservation-biology-guide/SKILL.md +198 -0
- package/skills/domains/ecology/gbif-api/SKILL.md +158 -0
- package/skills/domains/ecology/inaturalist-api/SKILL.md +173 -0
- package/skills/domains/economics/behavioral-economics-guide/SKILL.md +239 -0
- package/skills/domains/economics/development-economics-guide/SKILL.md +181 -0
- package/skills/domains/economics/fred-api/SKILL.md +189 -0
- package/skills/domains/education/curriculum-design-guide/SKILL.md +144 -0
- package/skills/domains/education/learning-science-guide/SKILL.md +150 -0
- package/skills/domains/finance/financial-data-analysis/SKILL.md +152 -0
- package/skills/domains/finance/quantitative-finance-guide/SKILL.md +151 -0
- package/skills/domains/geoscience/climate-science-guide/SKILL.md +158 -0
- package/skills/domains/geoscience/gis-remote-sensing-guide/SKILL.md +129 -0
- package/skills/domains/humanities/digital-humanities-guide/SKILL.md +181 -0
- package/skills/domains/humanities/philosophy-research-guide/SKILL.md +148 -0
- package/skills/domains/law/courtlistener-api/SKILL.md +213 -0
- package/skills/domains/law/legal-research-guide/SKILL.md +250 -0
- package/skills/domains/math/linear-algebra-applications/SKILL.md +227 -0
- package/skills/domains/math/numerical-methods-guide/SKILL.md +236 -0
- package/skills/domains/math/oeis-api/SKILL.md +158 -0
- package/skills/domains/pharma/clinical-pharmacology-guide/SKILL.md +165 -0
- package/skills/domains/pharma/drug-development-guide/SKILL.md +177 -0
- package/skills/domains/physics/computational-physics-guide/SKILL.md +300 -0
- package/skills/domains/physics/nasa-ads-api/SKILL.md +150 -0
- package/skills/domains/physics/quantum-computing-guide/SKILL.md +234 -0
- package/skills/domains/social-science/social-research-methods/SKILL.md +194 -0
- package/skills/domains/social-science/survey-research-guide/SKILL.md +182 -0
- package/skills/literature/discovery/citation-alert-guide/SKILL.md +154 -0
- package/skills/literature/discovery/conference-proceedings-guide/SKILL.md +142 -0
- package/skills/literature/discovery/literature-mapping-guide/SKILL.md +175 -0
- package/skills/literature/discovery/paper-tracking-guide/SKILL.md +211 -0
- package/skills/literature/discovery/rss-paper-feeds/SKILL.md +214 -0
- package/skills/literature/discovery/semantic-scholar-recs-guide/SKILL.md +164 -0
- package/skills/literature/fulltext/doaj-api/SKILL.md +120 -0
- package/skills/literature/fulltext/interlibrary-loan-guide/SKILL.md +163 -0
- package/skills/literature/fulltext/open-access-guide/SKILL.md +183 -0
- package/skills/literature/fulltext/pmc-oai-api/SKILL.md +184 -0
- package/skills/literature/fulltext/preprint-servers-guide/SKILL.md +128 -0
- package/skills/literature/fulltext/repository-harvesting-guide/SKILL.md +207 -0
- package/skills/literature/fulltext/unpaywall-api/SKILL.md +113 -0
- package/skills/literature/metadata/altmetrics-guide/SKILL.md +132 -0
- package/skills/literature/metadata/citation-network-guide/SKILL.md +236 -0
- package/skills/literature/metadata/crossref-api/SKILL.md +133 -0
- package/skills/literature/metadata/datacite-api/SKILL.md +126 -0
- package/skills/literature/metadata/doi-resolution-guide/SKILL.md +168 -0
- package/skills/literature/metadata/h-index-guide/SKILL.md +183 -0
- package/skills/literature/metadata/journal-metrics-guide/SKILL.md +188 -0
- package/skills/literature/metadata/opencitations-api/SKILL.md +128 -0
- package/skills/literature/metadata/orcid-api/SKILL.md +136 -0
- package/skills/literature/metadata/orcid-integration-guide/SKILL.md +178 -0
- package/skills/literature/search/arxiv-api/SKILL.md +95 -0
- package/skills/literature/search/biorxiv-api/SKILL.md +123 -0
- package/skills/literature/search/boolean-search-guide/SKILL.md +199 -0
- package/skills/literature/search/citation-chaining-guide/SKILL.md +148 -0
- package/skills/literature/search/database-comparison-guide/SKILL.md +100 -0
- package/skills/literature/search/europe-pmc-api/SKILL.md +120 -0
- package/skills/literature/search/google-scholar-guide/SKILL.md +182 -0
- package/skills/literature/search/mesh-terms-guide/SKILL.md +164 -0
- package/skills/literature/search/openalex-api/SKILL.md +134 -0
- package/skills/literature/search/pubmed-api/SKILL.md +130 -0
- package/skills/literature/search/scientify-literature-survey/SKILL.md +203 -0
- package/skills/literature/search/semantic-scholar-api/SKILL.md +134 -0
- package/skills/literature/search/systematic-search-strategy/SKILL.md +214 -0
- package/skills/research/automation/ai-scientist-guide/SKILL.md +228 -0
- package/skills/research/automation/data-collection-automation/SKILL.md +248 -0
- package/skills/research/automation/research-workflow-automation/SKILL.md +266 -0
- package/skills/research/deep-research/meta-synthesis-guide/SKILL.md +174 -0
- package/skills/research/deep-research/research-cog/SKILL.md +153 -0
- package/skills/research/deep-research/scoping-review-guide/SKILL.md +217 -0
- package/skills/research/deep-research/systematic-review-guide/SKILL.md +250 -0
- package/skills/research/funding/figshare-api/SKILL.md +163 -0
- package/skills/research/funding/grant-writing-guide/SKILL.md +233 -0
- package/skills/research/funding/nsf-grant-guide/SKILL.md +206 -0
- package/skills/research/funding/open-science-guide/SKILL.md +255 -0
- package/skills/research/funding/zenodo-api/SKILL.md +174 -0
- package/skills/research/methodology/action-research-guide/SKILL.md +201 -0
- package/skills/research/methodology/experimental-design-guide/SKILL.md +236 -0
- package/skills/research/methodology/grad-school-guide/SKILL.md +182 -0
- package/skills/research/methodology/grounded-theory-guide/SKILL.md +171 -0
- package/skills/research/methodology/mixed-methods-guide/SKILL.md +208 -0
- package/skills/research/methodology/qualitative-research-guide/SKILL.md +234 -0
- package/skills/research/methodology/scientify-idea-generation/SKILL.md +222 -0
- package/skills/research/paper-review/paper-reading-assistant/SKILL.md +266 -0
- package/skills/research/paper-review/peer-review-guide/SKILL.md +227 -0
- package/skills/research/paper-review/rebuttal-writing-guide/SKILL.md +185 -0
- package/skills/research/paper-review/scientify-write-review-paper/SKILL.md +209 -0
- package/skills/tools/code-exec/jupyter-notebook-guide/SKILL.md +178 -0
- package/skills/tools/code-exec/python-reproducibility-guide/SKILL.md +341 -0
- package/skills/tools/code-exec/r-reproducibility-guide/SKILL.md +236 -0
- package/skills/tools/code-exec/sandbox-execution-guide/SKILL.md +221 -0
- package/skills/tools/diagram/mermaid-diagram-guide/SKILL.md +269 -0
- package/skills/tools/diagram/plantuml-guide/SKILL.md +397 -0
- package/skills/tools/diagram/scientific-illustration-guide/SKILL.md +225 -0
- package/skills/tools/document/anystyle-api/SKILL.md +199 -0
- package/skills/tools/document/grobid-pdf-parsing/SKILL.md +294 -0
- package/skills/tools/document/markdown-academic-guide/SKILL.md +217 -0
- package/skills/tools/document/pdf-extraction-guide/SKILL.md +321 -0
- package/skills/tools/knowledge-graph/knowledge-graph-construction/SKILL.md +306 -0
- package/skills/tools/knowledge-graph/ontology-design-guide/SKILL.md +214 -0
- package/skills/tools/knowledge-graph/rag-methodology-guide/SKILL.md +325 -0
- package/skills/tools/ocr-translate/formula-recognition-guide/SKILL.md +367 -0
- package/skills/tools/ocr-translate/handwriting-recognition-guide/SKILL.md +211 -0
- package/skills/tools/ocr-translate/latex-ocr-guide/SKILL.md +204 -0
- package/skills/tools/ocr-translate/multilingual-research-guide/SKILL.md +234 -0
- package/skills/tools/scraping/academic-web-scraping/SKILL.md +326 -0
- package/skills/tools/scraping/api-data-collection-guide/SKILL.md +301 -0
- package/skills/tools/scraping/web-scraping-ethics-guide/SKILL.md +250 -0
- package/skills/writing/citation/bibtex-management-guide/SKILL.md +246 -0
- package/skills/writing/citation/citation-style-guide/SKILL.md +248 -0
- package/skills/writing/citation/reference-manager-comparison/SKILL.md +208 -0
- package/skills/writing/citation/zotero-api/SKILL.md +188 -0
- package/skills/writing/composition/abstract-writing-guide/SKILL.md +188 -0
- package/skills/writing/composition/discussion-writing-guide/SKILL.md +194 -0
- package/skills/writing/composition/introduction-writing-guide/SKILL.md +194 -0
- package/skills/writing/composition/literature-review-writing/SKILL.md +196 -0
- package/skills/writing/composition/methods-section-guide/SKILL.md +185 -0
- package/skills/writing/composition/response-to-reviewers/SKILL.md +215 -0
- package/skills/writing/composition/scientific-writing-guide/SKILL.md +152 -0
- package/skills/writing/latex/bibliography-management-guide/SKILL.md +206 -0
- package/skills/writing/latex/latex-drawing-guide/SKILL.md +234 -0
- package/skills/writing/latex/latex-ecosystem-guide/SKILL.md +240 -0
- package/skills/writing/latex/math-typesetting-guide/SKILL.md +231 -0
- package/skills/writing/latex/overleaf-collaboration-guide/SKILL.md +211 -0
- package/skills/writing/latex/tikz-diagrams-guide/SKILL.md +211 -0
- package/skills/writing/polish/academic-translation-guide/SKILL.md +175 -0
- package/skills/writing/polish/academic-writing-refiner/SKILL.md +143 -0
- package/skills/writing/polish/ai-writing-humanizer/SKILL.md +178 -0
- package/skills/writing/polish/grammar-checker-guide/SKILL.md +184 -0
- package/skills/writing/polish/plagiarism-detection-guide/SKILL.md +167 -0
- package/skills/writing/templates/beamer-presentation-guide/SKILL.md +263 -0
- package/skills/writing/templates/conference-paper-template/SKILL.md +219 -0
- package/skills/writing/templates/thesis-template-guide/SKILL.md +200 -0
- package/skills/writing/templates/thesis-writing-guide/SKILL.md +220 -0
- package/src/tools/arxiv.ts +131 -0
- package/src/tools/crossref.ts +112 -0
- package/src/tools/openalex.ts +174 -0
- package/src/tools/pubmed.ts +166 -0
- package/src/tools/semantic-scholar.ts +108 -0
- package/src/tools/unpaywall.ts +58 -0
|
@@ -0,0 +1,236 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: citation-network-guide
|
|
3
|
+
description: "Analyze citation networks, impact metrics, and bibliometric patterns"
|
|
4
|
+
metadata:
|
|
5
|
+
openclaw:
|
|
6
|
+
emoji: "🕸"
|
|
7
|
+
category: "literature"
|
|
8
|
+
subcategory: "metadata"
|
|
9
|
+
keywords: ["citation statistics", "citation tracking", "citation analysis", "citation network", "altmetrics"]
|
|
10
|
+
source: "N/A"
|
|
11
|
+
---
|
|
12
|
+
|
|
13
|
+
# Citation Network Analysis Guide
|
|
14
|
+
|
|
15
|
+
## Overview
|
|
16
|
+
|
|
17
|
+
Citation networks encode the intellectual structure of scientific fields. By analyzing who cites whom, how ideas propagate, and where research clusters form, researchers can identify foundational papers, emerging trends, influential authors, and gaps in the literature that represent opportunities for new contributions.
|
|
18
|
+
|
|
19
|
+
This guide covers the theory and practice of citation network analysis: building networks from bibliographic data, computing standard metrics (h-index, impact factor, PageRank, betweenness centrality), visualizing network structure, and interpreting results. It also covers altmetrics -- alternative impact measures that capture attention beyond traditional citations.
|
|
20
|
+
|
|
21
|
+
Whether you are conducting a systematic literature review, mapping a new research area, evaluating potential collaborators, or assessing the impact of your own work, citation network analysis provides quantitative tools to complement qualitative judgment.
|
|
22
|
+
|
|
23
|
+
## Core Concepts
|
|
24
|
+
|
|
25
|
+
### Types of Citation Networks
|
|
26
|
+
|
|
27
|
+
| Network Type | Nodes | Edges | Question Answered |
|
|
28
|
+
|-------------|-------|-------|-------------------|
|
|
29
|
+
| Direct citation | Papers | Paper A cites Paper B | Which papers directly build on each other? |
|
|
30
|
+
| Co-citation | Papers | A and B are both cited by C | Which papers are perceived as related? |
|
|
31
|
+
| Bibliographic coupling | Papers | A and B both cite C | Which papers share intellectual foundations? |
|
|
32
|
+
| Author co-citation | Authors | Two authors are frequently co-cited | Which researchers are seen as working in the same area? |
|
|
33
|
+
| Author collaboration | Authors | Two authors co-authored a paper | Who works together? |
|
|
34
|
+
|
|
35
|
+
### Key Metrics
|
|
36
|
+
|
|
37
|
+
| Metric | Level | Definition | Interpretation |
|
|
38
|
+
|--------|-------|-----------|----------------|
|
|
39
|
+
| Citation count | Paper | Number of times cited | Raw impact |
|
|
40
|
+
| h-index | Author | h papers with >= h citations | Sustained productivity |
|
|
41
|
+
| Impact Factor | Journal | Mean citations to recent articles | Journal prestige |
|
|
42
|
+
| PageRank | Paper/Author | Iterative importance based on network position | Influence (weighted by citing paper importance) |
|
|
43
|
+
| Betweenness centrality | Paper | Frequency on shortest paths between other nodes | Bridging role between subfields |
|
|
44
|
+
| Burst detection | Paper/Term | Sudden increase in citations/usage | Emerging topic |
|
|
45
|
+
|
|
46
|
+
## Building Citation Networks
|
|
47
|
+
|
|
48
|
+
### Data Sources
|
|
49
|
+
|
|
50
|
+
| Source | Coverage | API | Cost |
|
|
51
|
+
|--------|----------|-----|------|
|
|
52
|
+
| Semantic Scholar | 200M+ papers, CS/biomed focus | REST API, free | Free (rate limited) |
|
|
53
|
+
| OpenAlex | 250M+ works, all disciplines | REST API, free | Free |
|
|
54
|
+
| Crossref | 140M+ DOIs | REST API | Free |
|
|
55
|
+
| Web of Science | Curated, multi-disciplinary | Institutional | Licensed |
|
|
56
|
+
| Scopus | 90M+ records | REST API | Licensed |
|
|
57
|
+
|
|
58
|
+
### Fetching Data with OpenAlex
|
|
59
|
+
|
|
60
|
+
```python
|
|
61
|
+
import requests
|
|
62
|
+
import networkx as nx
|
|
63
|
+
|
|
64
|
+
def get_citations(doi, max_results=100):
|
|
65
|
+
"""Fetch papers that cite a given DOI using OpenAlex."""
|
|
66
|
+
work_url = f"https://api.openalex.org/works/doi:{doi}"
|
|
67
|
+
resp = requests.get(work_url)
|
|
68
|
+
work = resp.json()
|
|
69
|
+
openalex_id = work['id']
|
|
70
|
+
|
|
71
|
+
# Get citing works
|
|
72
|
+
citing_url = (
|
|
73
|
+
f"https://api.openalex.org/works"
|
|
74
|
+
f"?filter=cites:{openalex_id}"
|
|
75
|
+
f"&per_page={max_results}"
|
|
76
|
+
f"&sort=cited_by_count:desc"
|
|
77
|
+
)
|
|
78
|
+
citing_resp = requests.get(citing_url)
|
|
79
|
+
citing_works = citing_resp.json()['results']
|
|
80
|
+
|
|
81
|
+
return [{
|
|
82
|
+
'id': w['id'],
|
|
83
|
+
'title': w['title'],
|
|
84
|
+
'year': w['publication_year'],
|
|
85
|
+
'cited_by_count': w['cited_by_count'],
|
|
86
|
+
'authors': [a['author']['display_name']
|
|
87
|
+
for a in w.get('authorships', [])]
|
|
88
|
+
} for w in citing_works]
|
|
89
|
+
```
|
|
90
|
+
|
|
91
|
+
### Building the Network with NetworkX
|
|
92
|
+
|
|
93
|
+
```python
|
|
94
|
+
import networkx as nx
|
|
95
|
+
|
|
96
|
+
def build_citation_network(seed_doi, depth=2):
|
|
97
|
+
"""Build a citation network to specified depth from a seed paper."""
|
|
98
|
+
G = nx.DiGraph()
|
|
99
|
+
visited = set()
|
|
100
|
+
queue = [(seed_doi, 0)]
|
|
101
|
+
|
|
102
|
+
while queue:
|
|
103
|
+
doi, level = queue.pop(0)
|
|
104
|
+
if doi in visited or level > depth:
|
|
105
|
+
continue
|
|
106
|
+
visited.add(doi)
|
|
107
|
+
|
|
108
|
+
citations = get_citations(doi, max_results=20)
|
|
109
|
+
for paper in citations:
|
|
110
|
+
G.add_node(paper['id'],
|
|
111
|
+
title=paper['title'],
|
|
112
|
+
year=paper['year'],
|
|
113
|
+
citations=paper['cited_by_count'])
|
|
114
|
+
G.add_edge(paper['id'], doi) # citing -> cited
|
|
115
|
+
|
|
116
|
+
if level + 1 <= depth:
|
|
117
|
+
queue.append((paper['id'], level + 1))
|
|
118
|
+
|
|
119
|
+
return G
|
|
120
|
+
|
|
121
|
+
# Build and analyze
|
|
122
|
+
G = build_citation_network("10.1234/example", depth=2)
|
|
123
|
+
print(f"Nodes: {G.number_of_nodes()}, Edges: {G.number_of_edges()}")
|
|
124
|
+
```
|
|
125
|
+
|
|
126
|
+
## Network Analysis
|
|
127
|
+
|
|
128
|
+
### Computing Centrality Metrics
|
|
129
|
+
|
|
130
|
+
```python
|
|
131
|
+
# PageRank (most important papers in the network)
|
|
132
|
+
pagerank = nx.pagerank(G, alpha=0.85)
|
|
133
|
+
top_papers = sorted(pagerank.items(), key=lambda x: x[1], reverse=True)[:10]
|
|
134
|
+
|
|
135
|
+
for paper_id, score in top_papers:
|
|
136
|
+
title = G.nodes[paper_id].get('title', 'Unknown')
|
|
137
|
+
print(f" PR={score:.4f}: {title[:80]}")
|
|
138
|
+
|
|
139
|
+
# Betweenness centrality (bridge papers)
|
|
140
|
+
betweenness = nx.betweenness_centrality(G)
|
|
141
|
+
bridges = sorted(betweenness.items(), key=lambda x: x[1], reverse=True)[:10]
|
|
142
|
+
|
|
143
|
+
# Community detection (research clusters)
|
|
144
|
+
from networkx.algorithms.community import greedy_modularity_communities
|
|
145
|
+
communities = list(greedy_modularity_communities(G.to_undirected()))
|
|
146
|
+
print(f"Detected {len(communities)} research clusters")
|
|
147
|
+
```
|
|
148
|
+
|
|
149
|
+
### Co-Citation Analysis
|
|
150
|
+
|
|
151
|
+
```python
|
|
152
|
+
def build_cocitation_network(papers_with_refs):
|
|
153
|
+
"""Build co-citation network from papers with their reference lists."""
|
|
154
|
+
from itertools import combinations
|
|
155
|
+
G = nx.Graph()
|
|
156
|
+
|
|
157
|
+
for paper in papers_with_refs:
|
|
158
|
+
refs = paper['references']
|
|
159
|
+
for a, b in combinations(refs, 2):
|
|
160
|
+
if G.has_edge(a, b):
|
|
161
|
+
G[a][b]['weight'] += 1
|
|
162
|
+
else:
|
|
163
|
+
G.add_edge(a, b, weight=1)
|
|
164
|
+
|
|
165
|
+
return G
|
|
166
|
+
```
|
|
167
|
+
|
|
168
|
+
## Visualization
|
|
169
|
+
|
|
170
|
+
### Using pyvis for Interactive Visualization
|
|
171
|
+
|
|
172
|
+
```python
|
|
173
|
+
from pyvis.network import Network
|
|
174
|
+
|
|
175
|
+
def visualize_citation_network(G, output='citation_network.html'):
|
|
176
|
+
net = Network(height='800px', width='100%', directed=True)
|
|
177
|
+
|
|
178
|
+
for node in G.nodes():
|
|
179
|
+
title = G.nodes[node].get('title', str(node))[:60]
|
|
180
|
+
size = min(5 + G.nodes[node].get('citations', 0) * 0.1, 40)
|
|
181
|
+
net.add_node(str(node), label=title, size=size,
|
|
182
|
+
title=G.nodes[node].get('title', ''))
|
|
183
|
+
|
|
184
|
+
for u, v in G.edges():
|
|
185
|
+
net.add_edge(str(u), str(v))
|
|
186
|
+
|
|
187
|
+
net.set_options("""
|
|
188
|
+
var options = {
|
|
189
|
+
"physics": {"barnesHut": {"gravitationalConstant": -3000}},
|
|
190
|
+
"nodes": {"font": {"size": 10}}
|
|
191
|
+
}
|
|
192
|
+
""")
|
|
193
|
+
net.save_graph(output)
|
|
194
|
+
print(f"Saved to {output}")
|
|
195
|
+
```
|
|
196
|
+
|
|
197
|
+
### Using VOSviewer
|
|
198
|
+
|
|
199
|
+
VOSviewer is a dedicated bibliometric visualization tool:
|
|
200
|
+
|
|
201
|
+
1. Export records from Web of Science or Scopus in CSV format.
|
|
202
|
+
2. Open VOSviewer and select "Create a map based on bibliographic data."
|
|
203
|
+
3. Choose analysis type: co-citation, bibliographic coupling, or co-authorship.
|
|
204
|
+
4. Adjust parameters (minimum citations, cluster resolution).
|
|
205
|
+
5. Export high-resolution images for publications.
|
|
206
|
+
|
|
207
|
+
## Altmetrics
|
|
208
|
+
|
|
209
|
+
Traditional citations take years to accumulate. Altmetrics capture immediate attention:
|
|
210
|
+
|
|
211
|
+
| Metric | Source | Speed | What It Measures |
|
|
212
|
+
|--------|--------|-------|-----------------|
|
|
213
|
+
| Altmetric Attention Score | altmetric.com | Hours | Media, social, policy mentions |
|
|
214
|
+
| PlumX metrics | Elsevier | Days | Usage, captures, mentions, social |
|
|
215
|
+
| Downloads | Publisher | Immediate | Reader interest |
|
|
216
|
+
| Twitter/X mentions | Social media | Immediate | Public discourse |
|
|
217
|
+
| Wikipedia citations | Wikipedia | Weeks | Encyclopedic significance |
|
|
218
|
+
| Policy document citations | Overton | Months | Policy relevance |
|
|
219
|
+
|
|
220
|
+
## Best Practices
|
|
221
|
+
|
|
222
|
+
- **Combine multiple data sources.** No single database has complete coverage. Merge OpenAlex and Semantic Scholar for best results.
|
|
223
|
+
- **Normalize by field and age.** A 2024 paper in biology and a 2024 paper in mathematics have very different citation rate baselines.
|
|
224
|
+
- **Use relative indicators.** Field-Weighted Citation Impact (FWCI) accounts for disciplinary differences.
|
|
225
|
+
- **Do not equate citations with quality.** Retracted papers sometimes have high citation counts. Controversial papers accumulate criticism citations.
|
|
226
|
+
- **Report network metrics alongside standard citations.** PageRank and betweenness reveal influence that raw counts miss.
|
|
227
|
+
- **Update analyses periodically.** Citation networks change as new papers are published.
|
|
228
|
+
|
|
229
|
+
## References
|
|
230
|
+
|
|
231
|
+
- [OpenAlex API](https://docs.openalex.org/) -- Free, open bibliographic data
|
|
232
|
+
- [Semantic Scholar API](https://api.semanticscholar.org/) -- AI-powered paper data
|
|
233
|
+
- [VOSviewer](https://www.vosviewer.com/) -- Bibliometric visualization tool
|
|
234
|
+
- [bibliometrix R package](https://www.bibliometrix.org/) -- Comprehensive bibliometric analysis
|
|
235
|
+
- [Altmetric](https://www.altmetric.com/) -- Alternative impact metrics
|
|
236
|
+
- [NetworkX Documentation](https://networkx.org/) -- Python graph analysis library
|
|
@@ -0,0 +1,133 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: crossref-api
|
|
3
|
+
description: "Resolve DOIs and retrieve publication metadata from CrossRef registry"
|
|
4
|
+
metadata:
|
|
5
|
+
openclaw:
|
|
6
|
+
emoji: "🔍"
|
|
7
|
+
category: "literature"
|
|
8
|
+
subcategory: "metadata"
|
|
9
|
+
keywords: ["DOI resolution", "digital object identifier", "CrossRef", "citation statistics", "citation tracking"]
|
|
10
|
+
source: "https://api.crossref.org"
|
|
11
|
+
---
|
|
12
|
+
|
|
13
|
+
# CrossRef API Guide
|
|
14
|
+
|
|
15
|
+
## Overview
|
|
16
|
+
|
|
17
|
+
CrossRef is the official DOI registration agency for scholarly publishing, maintaining metadata for over 150 million content items including journal articles, books, conference proceedings, preprints, and datasets. The CrossRef REST API provides free, open access to this metadata, making it the authoritative source for resolving Digital Object Identifiers (DOIs) and retrieving standardized publication records.
|
|
18
|
+
|
|
19
|
+
Publishers deposit metadata with CrossRef when they register DOIs for their content. This makes the CrossRef API a reliable source for bibliographic information, citation counts, licensing data, funder acknowledgments, and links to full-text resources. The API is used extensively in reference management, citation analysis, and research information systems.
|
|
20
|
+
|
|
21
|
+
The API is free and requires no authentication. Users who include a `mailto` parameter in their requests are placed in the "polite pool" which provides faster and more reliable service.
|
|
22
|
+
|
|
23
|
+
## Authentication
|
|
24
|
+
|
|
25
|
+
No authentication required. For best performance, include your email to access the polite pool:
|
|
26
|
+
|
|
27
|
+
```
|
|
28
|
+
https://api.crossref.org/works?mailto=your@email.com
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
Users in the polite pool receive prioritized responses and are not subject to the same rate limiting as anonymous users. CrossRef Plus subscribers get additional benefits including guaranteed uptime and higher throughput.
|
|
32
|
+
|
|
33
|
+
## Core Endpoints
|
|
34
|
+
|
|
35
|
+
### Works: Query Publication Metadata
|
|
36
|
+
|
|
37
|
+
- **URL**: `GET https://api.crossref.org/works`
|
|
38
|
+
- **Parameters**:
|
|
39
|
+
| Param | Type | Required | Description |
|
|
40
|
+
|-------|------|----------|-------------|
|
|
41
|
+
| query | string | No | Free-text query across all metadata fields |
|
|
42
|
+
| query.title | string | No | Search specifically in titles |
|
|
43
|
+
| query.author | string | No | Search specifically by author name |
|
|
44
|
+
| filter | string | No | Structured filters (e.g., from-pub-date:2024, type:journal-article) |
|
|
45
|
+
| sort | string | No | Sort field: relevance, published, is-referenced-by-count |
|
|
46
|
+
| order | string | No | asc or desc |
|
|
47
|
+
| rows | integer | No | Results per page (default: 20, max: 1000) |
|
|
48
|
+
| offset | integer | No | Pagination offset |
|
|
49
|
+
| mailto | string | No | Email for polite pool |
|
|
50
|
+
- **Example**:
|
|
51
|
+
```bash
|
|
52
|
+
curl "https://api.crossref.org/works?query.title=attention+is+all+you+need&rows=5&mailto=user@example.com"
|
|
53
|
+
```
|
|
54
|
+
- **Response**: JSON with `message.items` array containing `DOI`, `title`, `author`, `published`, `is-referenced-by-count`, `reference`, `license`, and `link` fields.
|
|
55
|
+
|
|
56
|
+
### Works by DOI: Direct DOI Resolution
|
|
57
|
+
|
|
58
|
+
- **URL**: `GET https://api.crossref.org/works/{doi}`
|
|
59
|
+
- **Parameters**:
|
|
60
|
+
| Param | Type | Required | Description |
|
|
61
|
+
|-------|------|----------|-------------|
|
|
62
|
+
| doi | string | Yes | The DOI to resolve (URL path parameter) |
|
|
63
|
+
| mailto | string | No | Email for polite pool |
|
|
64
|
+
- **Example**:
|
|
65
|
+
```bash
|
|
66
|
+
curl "https://api.crossref.org/works/10.1038/s41586-021-03819-2?mailto=user@example.com"
|
|
67
|
+
```
|
|
68
|
+
- **Response**: JSON with complete metadata record for the DOI, including all registered bibliographic information.
|
|
69
|
+
|
|
70
|
+
### Members: Publisher Information
|
|
71
|
+
|
|
72
|
+
- **URL**: `GET https://api.crossref.org/members`
|
|
73
|
+
- **Parameters**:
|
|
74
|
+
| Param | Type | Required | Description |
|
|
75
|
+
|-------|------|----------|-------------|
|
|
76
|
+
| query | string | No | Publisher name search |
|
|
77
|
+
| rows | integer | No | Results per page |
|
|
78
|
+
- **Example**:
|
|
79
|
+
```bash
|
|
80
|
+
curl "https://api.crossref.org/members?query=springer&rows=5&mailto=user@example.com"
|
|
81
|
+
```
|
|
82
|
+
- **Response**: JSON with publisher metadata including member ID, name, prefix list, and coverage statistics.
|
|
83
|
+
|
|
84
|
+
### Journals: Journal Metadata
|
|
85
|
+
|
|
86
|
+
- **URL**: `GET https://api.crossref.org/journals`
|
|
87
|
+
- **Parameters**:
|
|
88
|
+
| Param | Type | Required | Description |
|
|
89
|
+
|-------|------|----------|-------------|
|
|
90
|
+
| query | string | No | Journal title search |
|
|
91
|
+
| rows | integer | No | Results per page |
|
|
92
|
+
- **Example**:
|
|
93
|
+
```bash
|
|
94
|
+
curl "https://api.crossref.org/journals?query=nature+machine+intelligence&rows=5&mailto=user@example.com"
|
|
95
|
+
```
|
|
96
|
+
- **Response**: JSON with journal information including ISSN, title, publisher, subject, and coverage counts.
|
|
97
|
+
|
|
98
|
+
## Rate Limits
|
|
99
|
+
|
|
100
|
+
Anonymous users: no hard limit but throttled under load. Polite pool users (with `mailto`): prioritized access with no published rate cap. CrossRef Plus subscribers: guaranteed uptime with SLA. The API returns HTTP 429 when overloaded. Use exponential backoff and always include `mailto` for production applications. For bulk metadata retrieval, CrossRef provides database snapshots and the Public Data File.
|
|
101
|
+
|
|
102
|
+
## Common Patterns
|
|
103
|
+
|
|
104
|
+
### Validate and Enrich a Reference List
|
|
105
|
+
|
|
106
|
+
Resolve a list of DOIs to get standardized metadata:
|
|
107
|
+
|
|
108
|
+
```bash
|
|
109
|
+
# Single DOI resolution with full metadata
|
|
110
|
+
curl "https://api.crossref.org/works/10.1145/3292500.3330672?mailto=user@example.com"
|
|
111
|
+
```
|
|
112
|
+
|
|
113
|
+
### Find Recent Highly-Cited Papers in a Field
|
|
114
|
+
|
|
115
|
+
Filter by publication date and sort by citation count:
|
|
116
|
+
|
|
117
|
+
```bash
|
|
118
|
+
curl "https://api.crossref.org/works?filter=from-pub-date:2023,type:journal-article&query=machine+learning&sort=is-referenced-by-count&order=desc&rows=20&mailto=user@example.com"
|
|
119
|
+
```
|
|
120
|
+
|
|
121
|
+
### Track Citation Growth
|
|
122
|
+
|
|
123
|
+
Monitor citation counts for a specific DOI over time:
|
|
124
|
+
|
|
125
|
+
```bash
|
|
126
|
+
curl "https://api.crossref.org/works/10.1038/s41586-021-03819-2?mailto=user@example.com" | jq '.message["is-referenced-by-count"]'
|
|
127
|
+
```
|
|
128
|
+
|
|
129
|
+
## References
|
|
130
|
+
|
|
131
|
+
- Official documentation: https://api.crossref.org
|
|
132
|
+
- API documentation: https://api.crossref.org/swagger-ui/index.html
|
|
133
|
+
- CrossRef metadata best practices: https://www.crossref.org/documentation/
|
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: datacite-api
|
|
3
|
+
description: "Resolve dataset DOIs and query research data metadata via DataCite"
|
|
4
|
+
metadata:
|
|
5
|
+
openclaw:
|
|
6
|
+
emoji: "🔍"
|
|
7
|
+
category: "literature"
|
|
8
|
+
subcategory: "metadata"
|
|
9
|
+
keywords: ["DOI resolution", "digital object identifier", "FAIR data principles", "data sharing"]
|
|
10
|
+
source: "https://support.datacite.org/docs/api"
|
|
11
|
+
---
|
|
12
|
+
|
|
13
|
+
# DataCite API Guide
|
|
14
|
+
|
|
15
|
+
## Overview
|
|
16
|
+
|
|
17
|
+
DataCite is a leading global DOI registration agency focused on research data. While CrossRef primarily handles DOIs for publications, DataCite specializes in assigning persistent identifiers to datasets, software, samples, instruments, and other research outputs. DataCite has registered over 50 million DOIs from thousands of data repositories worldwide.
|
|
18
|
+
|
|
19
|
+
The DataCite REST API provides access to metadata for all DataCite DOIs. It is essential for researchers and developers working with research data discovery, data citation, FAIR (Findable, Accessible, Interoperable, Reusable) data practices, and repository integration. The metadata follows the DataCite Metadata Schema, which is designed specifically for describing research data and includes fields for resource types, funding references, geolocation, and related identifiers.
|
|
20
|
+
|
|
21
|
+
The API is free, open, and requires no authentication. It returns JSON responses following the JSON:API specification, with robust filtering, faceting, and pagination support.
|
|
22
|
+
|
|
23
|
+
## Authentication
|
|
24
|
+
|
|
25
|
+
No authentication required. The DataCite API is fully open and free to use. No API key, registration, or email is needed. For write operations (DOI registration and metadata updates), authentication via DataCite member credentials is required, but read-only access is completely open.
|
|
26
|
+
|
|
27
|
+
## Core Endpoints
|
|
28
|
+
|
|
29
|
+
### DOIs: Search and Retrieve Dataset Metadata
|
|
30
|
+
|
|
31
|
+
- **URL**: `GET https://api.datacite.org/dois`
|
|
32
|
+
- **Parameters**:
|
|
33
|
+
| Param | Type | Required | Description |
|
|
34
|
+
|-------|------|----------|-------------|
|
|
35
|
+
| query | string | No | Full-text search query |
|
|
36
|
+
| resource-type-id | string | No | Filter by resource type (dataset, software, text, etc.) |
|
|
37
|
+
| affiliation-id | string | No | Filter by creator affiliation ROR ID |
|
|
38
|
+
| registered | string | No | Filter by registration year (e.g., 2024) |
|
|
39
|
+
| page[size] | integer | No | Results per page (default: 25, max: 1000) |
|
|
40
|
+
| page[number] | integer | No | Page number for pagination |
|
|
41
|
+
| sort | string | No | Sort field: relevance, created, -created, updated |
|
|
42
|
+
- **Example**:
|
|
43
|
+
```bash
|
|
44
|
+
curl "https://api.datacite.org/dois?query=climate+change+dataset&resource-type-id=dataset&page[size]=10&sort=-created"
|
|
45
|
+
```
|
|
46
|
+
- **Response**: JSON:API formatted response with `data` array containing DOI records. Each record has `attributes` with `doi`, `titles`, `creators`, `publisher`, `publicationYear`, `resourceType`, `descriptions`, `subjects`, `dates`, `relatedIdentifiers`, `fundingReferences`, and `geoLocations`.
|
|
47
|
+
|
|
48
|
+
### Single DOI: Direct Lookup
|
|
49
|
+
|
|
50
|
+
- **URL**: `GET https://api.datacite.org/dois/{doi}`
|
|
51
|
+
- **Parameters**:
|
|
52
|
+
| Param | Type | Required | Description |
|
|
53
|
+
|-------|------|----------|-------------|
|
|
54
|
+
| doi | string | Yes | The full DOI (e.g., 10.5281/zenodo.1234567) |
|
|
55
|
+
- **Example**:
|
|
56
|
+
```bash
|
|
57
|
+
curl "https://api.datacite.org/dois/10.5281/zenodo.3678171"
|
|
58
|
+
```
|
|
59
|
+
- **Response**: JSON:API response with complete metadata for the specified DOI, including all DataCite Metadata Schema fields.
|
|
60
|
+
|
|
61
|
+
### Providers: Data Repository Information
|
|
62
|
+
|
|
63
|
+
- **URL**: `GET https://api.datacite.org/providers`
|
|
64
|
+
- **Parameters**:
|
|
65
|
+
| Param | Type | Required | Description |
|
|
66
|
+
|-------|------|----------|-------------|
|
|
67
|
+
| query | string | No | Search provider name or description |
|
|
68
|
+
| region | string | No | Filter by region (e.g., EMEA, Americas, Asia Pacific) |
|
|
69
|
+
| page[size] | integer | No | Results per page |
|
|
70
|
+
- **Example**:
|
|
71
|
+
```bash
|
|
72
|
+
curl "https://api.datacite.org/providers?query=CERN&page[size]=5"
|
|
73
|
+
```
|
|
74
|
+
- **Response**: JSON:API response with provider records including `name`, `displayName`, `region`, `memberType`, `website`, and associated repositories and DOI prefixes.
|
|
75
|
+
|
|
76
|
+
### Clients: Repository Details
|
|
77
|
+
|
|
78
|
+
- **URL**: `GET https://api.datacite.org/clients`
|
|
79
|
+
- **Parameters**:
|
|
80
|
+
| Param | Type | Required | Description |
|
|
81
|
+
|-------|------|----------|-------------|
|
|
82
|
+
| query | string | No | Search repository name |
|
|
83
|
+
| provider-id | string | No | Filter by provider |
|
|
84
|
+
| software | string | No | Filter by repository software (e.g., dspace, dataverse) |
|
|
85
|
+
| page[size] | integer | No | Results per page |
|
|
86
|
+
- **Example**:
|
|
87
|
+
```bash
|
|
88
|
+
curl "https://api.datacite.org/clients?query=zenodo&page[size]=5"
|
|
89
|
+
```
|
|
90
|
+
- **Response**: JSON:API response with repository records including name, DOI count, and service details.
|
|
91
|
+
|
|
92
|
+
## Rate Limits
|
|
93
|
+
|
|
94
|
+
No published rate limits. DataCite does not enforce strict API quotas for read access. However, the service is operated by a nonprofit organization, so users should implement reasonable request pacing. For large-scale data mining, use the DataCite OAI-PMH endpoint or the public data file available at https://datafiles.datacite.org. Sustained high-volume requests may be throttled without notice.
|
|
95
|
+
|
|
96
|
+
## Common Patterns
|
|
97
|
+
|
|
98
|
+
### Discover Datasets for a Research Topic
|
|
99
|
+
|
|
100
|
+
Find published datasets related to a research area:
|
|
101
|
+
|
|
102
|
+
```bash
|
|
103
|
+
curl -s "https://api.datacite.org/dois?query=CRISPR+genome+editing&resource-type-id=dataset&page[size]=5&sort=-created" | jq '.data[] | {doi: .attributes.doi, title: .attributes.titles[0].title, year: .attributes.publicationYear, publisher: .attributes.publisher}'
|
|
104
|
+
```
|
|
105
|
+
|
|
106
|
+
### Find Software Citations
|
|
107
|
+
|
|
108
|
+
Search for research software registered with DataCite:
|
|
109
|
+
|
|
110
|
+
```bash
|
|
111
|
+
curl -s "https://api.datacite.org/dois?query=python+machine+learning&resource-type-id=software&page[size]=10" | jq '.data[] | {doi: .attributes.doi, title: .attributes.titles[0].title, year: .attributes.publicationYear}'
|
|
112
|
+
```
|
|
113
|
+
|
|
114
|
+
### Link Datasets to Publications
|
|
115
|
+
|
|
116
|
+
Use related identifiers to find papers associated with a dataset:
|
|
117
|
+
|
|
118
|
+
```bash
|
|
119
|
+
curl -s "https://api.datacite.org/dois/10.5281/zenodo.3678171" | jq '.data.attributes.relatedIdentifiers[] | select(.relationType == "IsSupplementTo" or .relationType == "IsReferencedBy") | {type: .relationType, id: .relatedIdentifier}'
|
|
120
|
+
```
|
|
121
|
+
|
|
122
|
+
## References
|
|
123
|
+
|
|
124
|
+
- Official documentation: https://support.datacite.org/docs/api
|
|
125
|
+
- DataCite Metadata Schema: https://schema.datacite.org/
|
|
126
|
+
- JSON:API specification: https://jsonapi.org/
|
|
@@ -0,0 +1,168 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: doi-resolution-guide
|
|
3
|
+
description: "DOI content negotiation and metadata retrieval techniques"
|
|
4
|
+
metadata:
|
|
5
|
+
openclaw:
|
|
6
|
+
emoji: "link"
|
|
7
|
+
category: "literature"
|
|
8
|
+
subcategory: "metadata"
|
|
9
|
+
keywords: ["DOI resolution", "digital object identifier", "citation statistics"]
|
|
10
|
+
source: "wentor-research-plugins"
|
|
11
|
+
---
|
|
12
|
+
|
|
13
|
+
# DOI Resolution Guide
|
|
14
|
+
|
|
15
|
+
Master DOI content negotiation to programmatically retrieve structured metadata, citation data, and formatted references from any Digital Object Identifier.
|
|
16
|
+
|
|
17
|
+
## What Is DOI Content Negotiation?
|
|
18
|
+
|
|
19
|
+
Every DOI (e.g., `10.1038/s41586-021-03819-2`) resolves to a landing page by default. However, the DOI system supports HTTP content negotiation: by sending different `Accept` headers, you can retrieve structured metadata in various formats instead of an HTML page.
|
|
20
|
+
|
|
21
|
+
The DOI resolver endpoint is `https://doi.org/{doi}` or equivalently `https://dx.doi.org/{doi}`.
|
|
22
|
+
|
|
23
|
+
## Supported Metadata Formats
|
|
24
|
+
|
|
25
|
+
| Accept Header | Format | Use Case |
|
|
26
|
+
|---------------|--------|----------|
|
|
27
|
+
| `application/vnd.citationstyles.csl+json` | CSL-JSON | Programmatic metadata extraction |
|
|
28
|
+
| `text/x-bibliography; style=apa` | Formatted citation | Ready-to-paste APA reference |
|
|
29
|
+
| `text/x-bibliography; style=bibtex` | BibTeX | LaTeX bibliography import |
|
|
30
|
+
| `application/x-bibtex` | BibTeX (alt) | LaTeX bibliography import |
|
|
31
|
+
| `application/rdf+xml` | RDF/XML | Linked data applications |
|
|
32
|
+
| `text/turtle` | Turtle RDF | Linked data applications |
|
|
33
|
+
| `application/vnd.crossref.unixref+xml` | CrossRef Unixref | Full CrossRef metadata |
|
|
34
|
+
|
|
35
|
+
## Retrieving Metadata via Content Negotiation
|
|
36
|
+
|
|
37
|
+
### Get CSL-JSON (Most Useful for Programmatic Access)
|
|
38
|
+
|
|
39
|
+
```bash
|
|
40
|
+
curl -LH "Accept: application/vnd.citationstyles.csl+json" \
|
|
41
|
+
https://doi.org/10.1038/s41586-021-03819-2
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
```python
|
|
45
|
+
import requests
|
|
46
|
+
|
|
47
|
+
doi = "10.1038/s41586-021-03819-2"
|
|
48
|
+
headers = {"Accept": "application/vnd.citationstyles.csl+json"}
|
|
49
|
+
response = requests.get(f"https://doi.org/{doi}", headers=headers, allow_redirects=True)
|
|
50
|
+
|
|
51
|
+
metadata = response.json()
|
|
52
|
+
print(f"Title: {metadata['title']}")
|
|
53
|
+
print(f"Authors: {', '.join(a.get('family', '') for a in metadata.get('author', []))}")
|
|
54
|
+
print(f"Journal: {metadata.get('container-title', 'N/A')}")
|
|
55
|
+
print(f"Year: {metadata.get('published', {}).get('date-parts', [[None]])[0][0]}")
|
|
56
|
+
print(f"Type: {metadata.get('type')}")
|
|
57
|
+
```
|
|
58
|
+
|
|
59
|
+
### Get a Formatted Citation
|
|
60
|
+
|
|
61
|
+
```bash
|
|
62
|
+
# APA format
|
|
63
|
+
curl -LH "Accept: text/x-bibliography; style=apa" \
|
|
64
|
+
https://doi.org/10.1038/s41586-021-03819-2
|
|
65
|
+
|
|
66
|
+
# Chicago format
|
|
67
|
+
curl -LH "Accept: text/x-bibliography; style=chicago-author-date" \
|
|
68
|
+
https://doi.org/10.1038/s41586-021-03819-2
|
|
69
|
+
|
|
70
|
+
# Harvard format
|
|
71
|
+
curl -LH "Accept: text/x-bibliography; style=harvard-cite-them-right" \
|
|
72
|
+
https://doi.org/10.1038/s41586-021-03819-2
|
|
73
|
+
```
|
|
74
|
+
|
|
75
|
+
### Get BibTeX for LaTeX
|
|
76
|
+
|
|
77
|
+
```bash
|
|
78
|
+
curl -LH "Accept: application/x-bibtex" \
|
|
79
|
+
https://doi.org/10.1038/s41586-021-03819-2
|
|
80
|
+
```
|
|
81
|
+
|
|
82
|
+
Output:
|
|
83
|
+
|
|
84
|
+
```bibtex
|
|
85
|
+
@article{Jumper_2021,
|
|
86
|
+
title={Highly accurate protein structure prediction with AlphaFold},
|
|
87
|
+
volume={596},
|
|
88
|
+
DOI={10.1038/s41586-021-03819-2},
|
|
89
|
+
journal={Nature},
|
|
90
|
+
author={Jumper, John and Evans, Richard and ...},
|
|
91
|
+
year={2021},
|
|
92
|
+
pages={583--589}
|
|
93
|
+
}
|
|
94
|
+
```
|
|
95
|
+
|
|
96
|
+
## Using the CrossRef API
|
|
97
|
+
|
|
98
|
+
The CrossRef API provides richer metadata and supports batch queries without content negotiation.
|
|
99
|
+
|
|
100
|
+
### Single Paper Lookup
|
|
101
|
+
|
|
102
|
+
```python
|
|
103
|
+
import requests
|
|
104
|
+
|
|
105
|
+
doi = "10.1038/s41586-021-03819-2"
|
|
106
|
+
response = requests.get(
|
|
107
|
+
f"https://api.crossref.org/works/{doi}",
|
|
108
|
+
headers={"User-Agent": "ResearchClaw/1.0 (mailto:you@university.edu)"}
|
|
109
|
+
)
|
|
110
|
+
|
|
111
|
+
work = response.json()["message"]
|
|
112
|
+
print(f"Title: {work['title'][0]}")
|
|
113
|
+
print(f"Publisher: {work['publisher']}")
|
|
114
|
+
print(f"Citation count: {work.get('is-referenced-by-count', 0)}")
|
|
115
|
+
print(f"Reference count: {work.get('references-count', 0)}")
|
|
116
|
+
print(f"License: {work.get('license', [{}])[0].get('URL', 'N/A')}")
|
|
117
|
+
```
|
|
118
|
+
|
|
119
|
+
### Batch DOI Resolution
|
|
120
|
+
|
|
121
|
+
```python
|
|
122
|
+
dois = [
|
|
123
|
+
"10.1038/s41586-021-03819-2",
|
|
124
|
+
"10.1126/science.abj8754",
|
|
125
|
+
"10.1016/j.cell.2021.06.025"
|
|
126
|
+
]
|
|
127
|
+
|
|
128
|
+
results = []
|
|
129
|
+
for doi in dois:
|
|
130
|
+
resp = requests.get(
|
|
131
|
+
f"https://api.crossref.org/works/{doi}",
|
|
132
|
+
headers={"User-Agent": "ResearchClaw/1.0 (mailto:you@university.edu)"}
|
|
133
|
+
)
|
|
134
|
+
if resp.status_code == 200:
|
|
135
|
+
results.append(resp.json()["message"])
|
|
136
|
+
else:
|
|
137
|
+
print(f"Failed to resolve: {doi}")
|
|
138
|
+
```
|
|
139
|
+
|
|
140
|
+
## DOI Validation and Normalization
|
|
141
|
+
|
|
142
|
+
```python
|
|
143
|
+
import re
|
|
144
|
+
|
|
145
|
+
def normalize_doi(raw_input):
|
|
146
|
+
"""Extract and normalize a DOI from various input formats."""
|
|
147
|
+
# Match DOI pattern: 10.XXXX/...
|
|
148
|
+
match = re.search(r'(10\.\d{4,9}/[^\s]+)', raw_input)
|
|
149
|
+
if match:
|
|
150
|
+
doi = match.group(1)
|
|
151
|
+
# Remove trailing punctuation
|
|
152
|
+
doi = doi.rstrip('.,;:)')
|
|
153
|
+
return doi.lower()
|
|
154
|
+
return None
|
|
155
|
+
|
|
156
|
+
# Examples
|
|
157
|
+
normalize_doi("https://doi.org/10.1038/s41586-021-03819-2") # 10.1038/s41586-021-03819-2
|
|
158
|
+
normalize_doi("DOI: 10.1038/s41586-021-03819-2.") # 10.1038/s41586-021-03819-2
|
|
159
|
+
normalize_doi("See paper at doi.org/10.1038/s41586-021-03819-2 for details") # works too
|
|
160
|
+
```
|
|
161
|
+
|
|
162
|
+
## Practical Tips
|
|
163
|
+
|
|
164
|
+
- **Polite pool**: CrossRef provides faster responses to requests with a `User-Agent` header that includes a `mailto:` contact. This is their "polite pool" with higher rate limits.
|
|
165
|
+
- **OpenAlex alternative**: OpenAlex (https://api.openalex.org/works/doi:10.xxx/yyy) provides similar metadata for free, with richer entity linking.
|
|
166
|
+
- **Handle redirects**: Always use `allow_redirects=True` (or `-L` in curl) as DOIs redirect through the resolver.
|
|
167
|
+
- **Caching**: DOI metadata rarely changes. Cache resolved metadata locally to avoid redundant API calls.
|
|
168
|
+
- **Rate limits**: CrossRef allows 50 requests/second in the polite pool. For bulk operations, use their data dumps instead.
|