diff --git a/.gitignore b/.gitignore index 5f6aaf4..836353b 100644 --- a/.gitignore +++ b/.gitignore @@ -54,11 +54,8 @@ valoraciones_* # Excepción: corpus de ejemplo commiteado (ADR 0030, Ciclo 9b) # examples/ contiene el corpus congelado, equation.yaml y README — sí van al repo. # Los archivos fuente del PO (*.bak, valoraciones_*) siguen gitignoreados arriba. -!examples/ -!examples/** -# Defensivo: un .duckdb (estado vivo no determinista) NUNCA va al repo, ni -# siquiera dentro de un workspace de ejemplo (ADR 0030 §Convención lo prohíbe). -examples/**/*.duckdb +examples/ +!examples/ciclo-investigación # Docs (MkDocs) — output de build local; el sitio se publica vía CI (docs.yml), @@ -68,6 +65,13 @@ site/ # Borradores y exploración local (no va al repo) scratch/ +# Notas personales / cognición tercerizada de Luis — NUNCA se trackean. +# Norma: cualquier nota privada va acá y el agente no la puede subir por error. +docs/Notas/NO-HACER-COMMIT-* +docs/Notas/local/ +**/*.local.md +.notas-locales/ + # Logs logs *.log diff --git a/AGENTS.md b/AGENTS.md index 8b88792..64bc2d3 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -448,8 +448,18 @@ Detalle en [`CONTRIBUTING.md`](CONTRIBUTING.md) y [`VERSIONING.md`](VERSIONING.m - **Docstrings** en español (la doc y los comentarios de los ADRs están en español; mantener el idioma del proyecto). Una línea para funciones triviales, multilínea con secciones `Args:` / `Returns:` / `Raises:` para lo demás. -- **Sin comentarios innecesarios.** El código se explica solo. Los docstrings justifican el - *por qué*, no el *qué*. +- **Comentarios: escasos, actuales, solo el *por qué* no obvio.** Un comentario se justifica solo + si da contexto o una decisión que el código no muestra, **está vigente** y es **escaso** (si hay + muchos, dejan de ser relevantes — para eso están los docs/ADRs). Los **docstrings** son el lugar + del *qué*; los comentarios, del *por qué*. + **Cortar:** los que parafrasean el *qué* (lo dice el código); los **desactualizados** (migraciones + o compat de datos "pre-X"/legacy que ya no existen, narraciones de código borrado); los **banners + separadores** (`# ----`, `# ====`, enumeraciones `# 1.`/`# 2.` — a lo sumo **un** título de + sección de una línea, y solo en archivos largos); y las **referencias ADR/issue peladas** + (`# ADR 0024`, `# #126` sin explicación). + **Conservar:** el *por qué* que justifica un orden, un workaround o una decisión no evidente — + **incluida** la referencia ADR/issue cuando viene **con** esa explicación + (`# ADR 0024: _seq es interna, no parte de CORPUS_SCHEMA`). - `from __future__ import annotations` en todos los módulos del paquete. ### Imports diff --git a/docs/API.md b/docs/API.md index 69a963d..c5f3887 100644 --- a/docs/API.md +++ b/docs/API.md @@ -125,7 +125,8 @@ VERBO:** solo **`curate filter`→`FILTERED`**; el resto transversal. **BREAKING `undecided`→no-op; case-insensitive). **Idempotente** (`decided_at` inyectado en la frontera CLI, R2). CSV sin `id`/`decision` o `decision` inválida → `DataError` exit 2. IDs huérfanos → `not_found_count` + aviso (no no-op silencioso). `data = {accepted_count, rejected_count, skipped_count, not_found_count, - total_rows}`. **`note` se ignora en apply** (advisory). + total_rows}`. **`note` se ignora en apply** (advisory). Lee el CSV con `utf-8-sig`: **tolera el + BOM UTF-8** que Excel-Windows agrega al guardar como UTF-8 (#238, política Excel-friendly de #214). - **`curate accept --ids ... [--by NOMBRE]`** / **`curate reject --ids ... [--by NOMBRE]`** — por ID (uno-a-uno o lote). Comparten `accept_papers`/`reject_papers` con los verbos sueltos `accept`/`reject` (alias deprecados). @@ -424,7 +425,9 @@ transición de ciclo**; determinismo R2 (mismo corpus → misma lectura). El módulo conserva además funciones de lectura más ricas (`get_workspace`, `list_rounds`, `get_scent`, `get_network`, `compare_rounds`) que hoy ningún comando consume (su poda opcional es trabajo de -limpieza, [#191](https://github.com/complexluise/bib2graph/issues/191)). Decisiones de modelado: +limpieza, [#191](https://github.com/complexluise/bib2graph/issues/191)), más la **resolución inversa +id→DOI/URL** (`resolve_doi`, `resolve_url`; [#212](https://github.com/complexluise/bib2graph/issues/212), +aditiva, devuelven `None` sin lanzar). Decisiones de modelado: **ronda = snapshot sellado** (no el contador `loop_round`), `get_scent` = **score de acoplamiento real + vecinos**, `get_network` = **red de la ronda viva recomputada**. @@ -509,6 +512,23 @@ def get_top(ws: Workspace, *, n=10, kind="bibliographic_coupling") -> dict[str, SIEMPRE presente, scope="all", empty_networks=["cocitation"] si la co-citación quedó vacía. Raises DataError si kind inválido, n <= 0, o la red falla genuinamente; StoreError si el store falla. (Detrás de `read top`.)""" + + +# --- Resolución inversa id→DOI/URL (#212, opción 1; sin red, sobre el corpus cargado) --- + +def resolve_doi(ws: Workspace, paper_id: str) -> str | None: + """DOI desnudo del paper con `Col.ID == paper_id`, o `None`. Devuelve `None` + (NO lanza DataError) cuando el id no existe, el paper no tiene DOI, o el DOI es + cadena vacía `""` (mismo criterio de "vacío = ausente" que networks/decorate.py). + Sin red: opera sobre el corpus ya cargado. Raises StoreError si el store falla.""" + +def resolve_url(ws: Workspace, paper_id: str) -> str | None: + """URL canónica `https://doi.org/` del paper, o `None` en los mismos casos + que resolve_doi (id inexistente / sin DOI / DOI vacío). Deriva vía + `doi_to_url(resolve_doi(...))`. Sin red. Raises StoreError si el store falla. + `doi_to_url(doi: str|None) -> str|None` (bib2graph.constants) es la FUENTE ÚNICA + de la derivación DOI→URL, compartida con la decoración del atributo `url` de redes + (#209, ver §8 nota) — sin drift.""" ``` **Nota de fidelidad al núcleo.** Las lecturas no inventan campos que el núcleo no sostiene: @@ -1273,10 +1293,21 @@ def decorate(artifact: NetworkArtifact, table: pa.Table) -> None: | `label` | todos | string legible (mapeo por kind, abajo) | | `degree_centrality` | todos | `float`, vía `nx.degree_centrality` | | `year` | paper (coupling/cocitation) | `int` (ausente si `None` en el corpus) | +| `doi` | paper (coupling/cocitation) | `string` desde `Col.DOI` (DOI desnudo/normalizado, p. ej. `10.1234/abc`); **ausente si el paper no tiene DOI** (mismo criterio que `year`) | +| `url` | paper (coupling/cocitation) | `string` derivada `https://doi.org/`; **solo presente si hay DOI** (no es columna del corpus, ver nota abajo) | | `is_seed` | paper | `bool` | | `curation_status` | paper | `string` | | `community` | todos | `int`, **solo** si se provee `artifact.communities` | +`doi`/`url` aplican **solo a paper-kinds** (`bibliographic_coupling` y `cocitation`); los nodos de +autor/institución/keyword **no los reciben**. `url` es **derivada** (`https://doi.org/`), no una +columna del corpus: el DOI es la única identidad de primera clase (ADR 0036) y la URL es una expansión +trivial determinista a la hora de decorar. La derivación vive en `doi_to_url(doi: str|None) -> str|None` +(`bib2graph.constants`), **fuente única** compartida con `resolve_url` (§0.1, #212) — sin drift. +Ausencia condicional como `year`: sin DOI truthy, el nodo no +recibe ni `doi` ni `url`. Los exporters CSV/GraphML (§9) los propagan **automáticamente** cuando están +presentes (son genéricos y omiten `None`) — sin cambios en exporters. + **Mapeo de `label` por `NetworkKind`:** | Kind | Nodo | `label` | @@ -1402,8 +1433,9 @@ class CsvExporter: ... # v1 — nodos.csv + aristas.csv para pandas - **`CsvExporter`** escribe `aristas.csv` (`source,target,weight`) y `nodos.csv` (`id,label` + atributos de nodo + métricas de `results` —degree/betweenness/community— unidas por id). Orden - de filas determinista. El `label` (y `year`/`is_seed`/`curation_status`/`community`) lo inyecta la - capa `decorate` (§7.1) antes del export, no el exporter. + de filas determinista. El `label` (y `year`/`doi`/`url`/`is_seed`/`curation_status`/`community`) lo + inyecta la capa `decorate` (§7.1) antes del export, no el exporter; `doi`/`url` salen solo en + paper-kinds y solo cuando el paper tiene DOI. - **`GraphMLExporter`** escribe esos atributos como node attributes, **omite** los atributos con valor `None` (Gephi / `nx.write_graphml` no los admiten) y **no muta** el grafo original (opera sobre una copia). @@ -1521,12 +1553,14 @@ networks: **Dedup fuzzy determinista** con `rapidfuzz` (núcleo desde #88): el complemento aproximado de la normalización conservadora del `Preprocessor` (§6). Las funciones siguen exportadas desde -`bib2graph.preprocessors`, pero **se invocan automáticamente** desde el helper de frontera -`cli/_ingest.py::normalize_and_dedup`, no a mano. Operan sobre la columna `_id` +`bib2graph.preprocessors`, pero **se invocan automáticamente** desde el helper canónico +`preprocessors.pipeline::normalize_and_dedup`, no a mano. Operan sobre la columna `_id` (`authors_id`/`keywords_id`), **nunca** sobre `_raw`. ```python -# Helper de frontera — punto único de la ingesta (cli/_ingest.py) +# Helper canónico — punto único de la ingesta (preprocessors/pipeline.py; +# re-exportado por compat desde cli/_ingest.py → el import viejo +# `from bib2graph.cli._ingest import normalize_and_dedup` sigue vivo, no es breaking) def normalize_and_dedup(corpus: Corpus, *, applied_at: datetime | None = None) -> Corpus: """normalize → deduplicate_authors(0.92) → deduplicate_keywords(0.90), en ese orden, sobre el corpus COMPLETO YA MERGEADO (existing + incoming) ⇒ dedup CROSS-BIBLIOTECA. NO aplica thesaurus @@ -1551,7 +1585,9 @@ def deduplicate_keywords(corpus: Corpus, *, threshold: float = 0.90) -> Corpus: **`persist_replace`** (§4.1) porque el upsert-concat D3 reintroduciría las variantes colapsadas. `build` sigue **puro** (el corpus ya entra deduplicado). - **`threshold` por-campo** (autores `0.92` / keywords `0.90`): `rapidfuzz.fuzz.token_sort_ratio` (0–100) - contra `threshold * 100`. Umbrales fijos en `cli/_ingest.py`. + contra `threshold * 100`. Umbrales fijos como **constantes públicas** `THRESHOLD_AUTHORS` / + `THRESHOLD_KEYWORDS` de `bib2graph.preprocessors` (fuente única en `preprocessors.pipeline`, issue + #175): el umbral compartido por la ingesta y el `restore` es **uno solo**, sin copias que diverjan. - **Determinista e idempotente:** los pares ≥ umbral forman **componentes conexas** vía Union-Find; el **canónico** del cluster es la variante más frecuente (desempate por `id` ascendente); se preserva el **orden de primera aparición** y **nunca se toca `_raw`**. Mismo corpus + threshold + versión de diff --git a/docs/Notas/20_ciclo_investigacion_hallazgos_teoricos.md b/docs/Notas/20_ciclo_investigacion_hallazgos_teoricos.md new file mode 100644 index 0000000..387beb6 --- /dev/null +++ b/docs/Notas/20_ciclo_investigacion_hallazgos_teoricos.md @@ -0,0 +1,818 @@ +# 02 — Hallazgos teóricos: lo que el corpus de "valoraciones en educación" dice sobre el ciclo de investigación humano (y por qué importa para bib2graph) + +> **Fecha:** 2026-06-27. **Estado:** narrativa + citas primarias del corpus congelado +> `examples/valoraciones/` (80 papers, ~10 aceptados, red de co-citación rala), +> **cruzada con el dossier del cluster IA-in-research vivo** +> ([`examples/nota-05-ciclo/cluster_ia_research/README.md`](../../examples/nota-05-ciclo/cluster_ia_research/README.md), 10 fuentes, sep-2024 a jun-2026). +> Material complementario al informe cuantitativo +> [`examples/nota-05-ciclo/informe_bibliometria.md`](../../examples/nota-05-ciclo/informe_bibliometria.md) +> y a las notas metodológicas +> [`05-ciclo-investigacion-humano.md`](05-ciclo-investigacion-humano.md) y +> [`04-direccion-ia-in-the-loop.md`](04-direccion-ia-in-the-loop.md). +> +> **Tesis:** la historia del proyecto (Nota 04 → 05 → 06 → ADR 0022) **se +> reencuentra con el corpus** que vino a construir, y **se reencuentra +> también con el cluster vivo** que el proyecto no diseñó pero que ahora +> ocupa parcialmente el hueco que el Nota 04 soñó. Los papers top de este +> corpus no hablan de herramientas bibliográficas, pero **todos hablan de los +> problemas que bib2graph intenta resolver**: cómo operacionalizar *complex +> thinking*, cómo hacer transdisciplinariedad operativa, qué lugar tiene +> (o no tiene) la asistencia algorítmica en el ciclo de investigación. + +--- + +## 1. La historia (para no perder el hilo) + +Esta nota cierra un arco de tres semanas. Conviene empezar por él porque +**lo que el corpus revela sólo se entiende si se conoce el camino que llevó +a construir la herramienta que lo leyó**. + +### 1.1 El sueño de la "máquina de tensiones" (jun-14, Nota 04) + +A mediados de junio el PO escribe +[`04-direccion-ia-in-the-loop.md`](04-direccion-ia-in-the-loop.md) bajo un +título que aún conserva la promesa grande: *"Dirección 'IA in the loop': +sustrato de investigación + máquina de tensiones"*. La idea es que +bib2graph deje de ser un pipeline técnico (corpus → redes → GraphML) y +pase a ser **un sustrato** donde la IA interviene en **dos puntos +puntuales** del ciclo humano de investigación: + +1. **Inserción 1 — forrajeo**: ayudar al investigador a encontrar papers + relevantes. +2. **Inserción 2 — máquina de tensiones** *(el moat)*: a partir de las + ideas del investigador, mapear **las tensiones en la literatura** + (quién apoya, quién refuta, qué escuelas chocan). Referente directo: + [Scite.ai](https://scite.ai/) (deep learning para clasificar citas en + *supporting / contrasting / mentioning*). + +La Nota 04 llega a una frase de posicionamiento tentativa: + +> *"La biblioteca de investigación abierta y curada por vos, donde la +> estructura de citación es el contexto y la IA entra en los puntos que +> elegís — para encontrar no solo los papers, sino las tensiones alrededor +> de tus ideas."* + +### 1.2 El ciclo se nombra (jun-14, Nota 05) + +Un día después, la +[`05-ciclo-investigacion-humano.md`](05-ciclo-investigacion-humano.md) +fundamenta el ciclo humano en **tres tradiciones que rara vez se cruzan**: +(A) Information Seeking Behavior de biblioteconomía (Kuhlthau, Ellis, +Bates); (B) Information Foraging + Sensemaking de HCI cognitivo +(Pirolli & Card); (C) Revisión sistemática metodológica (Wohlin, Webster +& Watson, vom Brocke, PRISMA). De la síntesis sale un lazo de 9 pasos +no-lineal: + +``` +(0) IDEA → (1) SEMILLAS → (2) CHAINING → (3) BROWSING + ↑___________________________________↓ +(4) LA QUERY MUTA (5) EVIDENCIA → (6) SENSEMAKING + ↓ ↓ + (7) CURAR LA BIBLIOTECA (8) MONITOREAR +``` + +Y dos puntos donde, en ese momento, la IA **podría** entrar: el +**forrajeo/chaining** (2–3) y el **sensemaking de tensiones** (6). + +### 1.3 El red-team lo rompe todo (jun-15, Nota 06 + ADR 0022) + +El AS-BUILT v0.2 se construye y se pone a prueba. La +[`06-critica-as-built-v0.2.md`](06-critica-as-built-v0.2.md) lo destroza. +El PO toma una decisión de las que no se revientan: **el producto no usa +IA generativa** ([ADR 0022](../decisiones/0022-producto-sin-ia-generativa.md)). +Texto literal del ADR: + +> *"El producto NO usa IA generativa. El desarrollo SÍ es asistido por IA, +> pero el scent es bibliométrico determinista."* + +La consecuencia técnica cae sobre la Inserción 2: **la máquina de +tensiones no se difiere a v2 — se retira del producto**. No es un moat +futuro: se borra del alcance. Lo dice la enmienda del +[ADR 0008](../decisiones/0008-wedge-forrajeo.md): + +> *"La máquina de tensiones (inserción de IA nº2) se RETIRA del producto +> — no se difiere a v2. [...] Ya no hay 'dos puntos de inserción de IA': +> queda una inserción algorítmica (el forrajeo), que no es IA."* + +El forrajeo se reencuadra como **asistencia bibliométrica determinista**: +la estructura de citación (acoplamiento, co-citación, centralidad) +funciona como *information scent* (Pirolli & Card 1999). **Reproducible, +auditable, sin caja negra**. + +### 1.4 El corpus se construye (jun-15–17, Ciclos B + 9a/9b + 10) + +Mientras tanto, el PO está haciendo investigación de verdad sobre +**valoraciones en educación**: cómo el pensamiento complejo (Morin) +piensa la evaluación educativa, con anclas en pedagogía crítica (Freire) +y transdisciplinariedad. La ecuación se publica como +[`examples/valoraciones/equation.yaml`](../../examples/valoraciones/equation.yaml): + +> *("pensamiento complejo" OR "complex thinking" OR "Edgar Morin" OR +> "Paulo Freire" OR "transdisciplinarity" OR "pedagogía crítica") AND +> ("evaluación" OR "evaluation" OR "assessment" OR "calificación" OR +> "valoración" OR "grading")* + +El corpus queda congelado en 80 filas (10 `accepted`, 70 `candidate`) +con `cited_by_id` poblado en los aceptados — **es el único ejemplo del +repo que tiene la red de co-citación no vacía** (Hito 8b, ADR 0025). + +### 1.5 Hoy: leer el corpus con la herramienta que él mismo fundó (jun-27) + +Tres semanas después del giro, esta nota **lee el corpus que el proyecto +construyó, con la herramienta que el proyecto construyó**, y se pregunta: +**¿qué dice ese corpus sobre el problema que el proyecto dice resolver?** + +Lo que sigue es la respuesta. + +--- + +## 2. Lo que el corpus top-consenso ya piensa (y dónde queda bib2graph) + +Los 12 papers del top-consenso (los que aparecen en varias métricas de +centralidad en la red de acoplamiento bibliográfico, §4 del +[informe cuantitativo](../../examples/nota-05-ciclo/informe_bibliometria.md)) +se pueden agrupar en **cuatro líneas de aporte** que mapean, sin +saberlo, los problemas de diseño de bib2graph. + +### 2.1 Operacionalizar *complex thinking* — la pieza que faltaba para acumular + +El paper más central del corpus es +**Luna-Nemecio & Silva-Pacheco (2021), *A conceptual proposal and +operational definitions of the cognitive processes of complex thinking***, +publicado en *Thinking Skills and Creativity* (accepted en el corpus). +No tiene abstract en OpenAlex, pero su gemelo experimental — +**Luna-Nemecio (2021), *Complex Thinking and Sustainable Social +Development: Validity and Reliability of the COMPLEX-21 Scale*** en +*Sustainability* — sí, y es la pieza más interesante del corpus: + +> *"Thinking skills are essential to achieve sustainable social +> development. Nonetheless, there is no specific instrument that +> assesses all of these skills as a whole. [...] A scale of 22 items +> assessing the following aspects: analysis and problem solving, critical +> analysis, metacognition, systemic analysis, and creativity, in five +> levels, was created. [...] validated in 626 university students from +> Peru. [...] The study concludes that the content validity, construct +> validity, concurrent validity, and composite reliability levels of the +> COMPLEX-21 scale are appropriate."* + +Lo que hace este paper es **traducir el marco filosófico de Morin (y de +todo el corpus) a una variable psicométrica medible**. Cinco factores, +21 ítems, Aiken's V > 0.8, análisis factorial confirmatorio. *Complex +thinking deja de ser un ideal regulativo y pasa a ser un constructo +sobre el que se puede acumular evidencia.* + +**Por qué importa para bib2graph:** la sección 5 de la Nota 05 dice que +"sin constructos medibles no podés comparar entre estudios, no podés +acumular". El COMPLEX-21 hace exactamente eso para *complex thinking*. +bib2graph hace lo análogo para la **estructura bibliométrica** (métricas +de centralidad, comunidades, assortatividad) — **no es el contenido +del paper lo que hace medible, es el campo de citación que lo rodea**. +El COMPLEX-21 mide la cognición del autor; bib2graph mide la posición +del paper en la estructura que el campo ha construido alrededor del +autor. Dos operacionalizaciones del mismo problema: cómo pasar de +filosofía a datos. + +Los papers de **Shepard et al. (2015), *Designing and Developing +Assessments of Complex Thinking in Mathematics*** y ***Designing and +Validating Assessments of Complex Thinking in Science*** (ambos en +*Theory Into Practice*) extienden la idea al diseño instruccional. El +segundo menciona algo crucial: + +> *"This article describes the design process and potential for +> **automated scoring** of 2 forms of inquiry assessment: Energy +> Stories and MySystem."* + +**Automated scoring** — el único punto del top-consenso donde aparece +explícitamente la automatización de UN paso del ciclo. No es un paper +sobre IA en el ciclo de investigación; es un paper sobre cómo +**escalar la evaluación de complex thinking** con scoring automático. +Es un anticipo modesto pero real de lo que herramientas tipo +Scite/Elicit hacen en otra capa. + +### 2.2 Transdisciplinariedad como método — el corazón del ciclo de investigación + +Tres papers centrales hacen explícito el **vínculo entre complejidad y +transdisciplinariedad** — que es exactamente el corazón del paso (2) +CHAINING del ciclo. + +**Choi & Pak (2007), *Multidisciplinarity, interdisciplinarity, and +transdisciplinarity in health research, services, education and policy: +2. Promotors, barriers, and strategies of enhancement*** (*Clinical and +Investigative Medicine*) — revisión sistemática de los **facilitadores +y barreras** del trabajo transdisciplinario. Lo importante no es el +catálogo (11 promotores, sus 11 barreras espejos), es el método: + +> *"Multidisciplinarity, interdisciplinarity, transdisciplinarity and +> definition were used as keywords to identify the pertinent literature."* + +Es PRISMA avant la lettre para un tema donde la nomenclatura es un +problema (¿cuál es la diferencia entre multi/inter/trans?). El paper +ofrece un **checklist diagnóstico** de cuándo un equipo va a producir +investigación transdisciplinaria de verdad y cuándo va a fallar por +falta de proximidad física, claridad de roles, incentivos o meta +común. + +**Pohl et al. (2010), *Consulting versus participatory transdisciplinarity: +A refined classification of transdisciplinary research*** (*Futures*) — +propone una **clasificación refinada** que distingue la +*transdisciplinariedad de consulta* (el experto asesor que aporta +conocimiento) de la *transdisciplinariedad participativa* +(co-investigación con stakeholders). No tiene abstract en OpenAlex, +pero el paper existe en el corpus y es central. + +**Por qué importa para bib2graph:** esta distinción ES la distinción +entre **IA asistiendo** (consulting — la herramienta asiste sin +reemplazar) e **IA como stakeholder** (participatory — la IA co- +investiga). **Planteada en 2010, trece años antes de ChatGPT.** Lo +que Nota 04 llamaba "IA in the loop" sin saberlo es una reedición, +con otra tecnología, del debate que la transdisciplinariedad viene +teniendo desde hace décadas. + +**Lieblein et al. (2012), *Phenomenon-Based Learning in Agroecology: A +Prerequisite for Transdisciplinarity and Responsible Action*** +(*Agroecology and Sustainable Food Systems*) — **caso real de +transdisciplinariedad en acción**: + +> *"Student teams work with university teachers and stakeholders in +> 'open-ended cases' to identify key constraints and future +> possibilities. This learning strategy uses real-world situations on +> the farm and in the community where solutions are not already known +> to instructor or clients."* + +El curso noruego desde el año 2000. Equipos de estudiantes + docentes ++ granjeros abordan casos abiertos donde **la solución no está +escrita de antemano**. Iteran entre evidencia, análisis y rediseño. +Esto es, puesto en práctica, **el paso (2) CHAINING del ciclo**: los +"open-ended cases" son las semillas, las iteraciones son el chaining, +los resultados son el equivalente agrícola de la *evidence matrix* de +Webster & Watson. + +### 2.3 Evaluación para la sostenibilidad — qué se gana (y qué se pierde) al cultivar + +**Wiek et al. (2019), *Aligning sustainability assessment with +responsible research and innovation: Towards a framework for +Constructive Sustainability Assessment*** (*Sustainable Production and +Consumption*): + +> *"We discuss and critique current approaches to analytical +> sustainability assessment and review deliberative social science +> governance frameworks. [...] This results in four design principles +> — transdisciplinarity, opening-up, exploring uncertainty and +> anticipation — that can be followed when applying sustainability +> assessments to emerging technologies."* + +Cuatro principios de diseño. **El segundo — *opening-up* — es +exactamente lo que el modelo del ciclo llama "no-linealidad"**: la +evaluación no es un veredicto al final del proceso, es un proceso que +*abre el problema*. Esto está en tensión con la mayor parte de los +marcos de evaluación educativa (estandarizada, *closing-down*), pero +los marcos de evaluación para sostenibilidad ya lo asimilaron hace +quince años. + +**Innes et al. (2003), *Outcomes of Collaborative Water Policy Making: +Applying Complexity Thinking to Evaluation*** (*Journal of +Environmental Planning and Management*) muestra lo que se gana al +*culturar* (no descartar) una colección: + +> *"The most important outcomes of such policy dialogues are often +> invisible or undervalued when seen through the lens of a traditional, +> modernist paradigm of government and accountability. [...] These +> outcomes include social and political capital, agreed-on information, +> the end of stalemates, high-quality agreements, learning and change, +> innovation and new practices involving networks and flexibility."* + +Los outcomes más importantes son **invisibles bajo un paradigma +modernista de accountability**. Eso es exactamente el argumento del +paso (7) CULTIVAR del ciclo: la **biblioteca viva** se cultiva, no se +descarta; lo que se gana con cultivarla no se ve en un snapshot +estático. El paper lo dice para la política del agua en California; +bib2graph lo dice para una biblioteca de papers. La estructura es la +misma. + +### 2.4 Pedagogía crítica y *complex thinking* — el dominio del propio PO + +Tres papers de **critical pedagogy** en EFL (English as a Foreign +Language) son los más explícitos sobre el cruce entre evaluación, +pensamiento complejo y práctica pedagógica. Lo notable es que los +tres son del sub-corpus de educación y **son exactamente el dominio +que el PO está investigando**. + +**Short & Iseri (2005), *Exploring the Possibilities for EFL Critical +Pedagogy in Korea: A Two-Part Case Study*** (*Critical Inquiry in +Language Studies*): + +> *"A teacher-researcher introduced critically-oriented material using +> an optional class in a junior high school and an existing class in a +> senior high school. The focus was on establishing critical dialogue +> between students and teachers, providing opportunities for learners +> to develop English language abilities while engaging in critical +> discussion of topics. [...] the study [...] calls into question the +> stereotype of East Asian students as passive and non-autonomous."* + +Intervención a pequeña escala. Evaluación cualitativa (audio, video, +entrevistas). El hallazgo modesto pero persistente: **los estudiantes +sí pueden manejar diálogo crítico en inglés** — y eso desmonta el +estereotipo que justifica una pedagogía transmisiva. + +**Iseri (2011), *A Model for EFL Materials Development within the +Framework of Critical Pedagogy*** (*English Language Teaching*): + +> *"Critical pedagogy (CP) is implemented in ELT programs aiming to +> empower both teachers and learners to unmask underlying cultural +> values and ideologies of educational setting and society, and +> subsequently to make them agents of transformation in their society. +> [...] the present paper attempts to offer a model for ELT materials +> development based on the major tenets of critical pedagogy."* + +El modelo organiza los principios de CP según los factores del +desarrollo de materiales: programa, docente, aprendiz, contenido, +pedagogía. **La evaluación y el aprendizaje son el mismo proceso.** +Es exactamente lo que un ciclo de investigación con biblioteca viva +busca: que el corpus crezca en paralelo con el aprendizaje del +investigador sobre el corpus. + +**Zevenbergen et al. (2012), *Three Points Approach (3PA) for urban +flood risk management*** (*Urban Water Journal*) — no es de pedagogía, +es de gestión de riesgo de inundación urbana, pero es el **ejemplo más +limpio de transdisciplinariedad operativa** del corpus: + +> *"The Three Points Approach (3PA) provides a structure facilitating +> the decision making processes dealing with UFRM. It helps to accept +> the complexity of the urban context and promotes transdisciplinarity +> and multifunctionality. The 3PA introduces three domains wherein +> water professionals may act and where aspects valued by different +> stakeholders come into play: (1) technical optimisation, dealing +> with standards and guidelines for urban drainage systems; (2) +> spatial planning, making the urban area more resilient to future +> changing conditions; and (3) day-to-day values, enhancing +> awareness, acceptance and participation among stakeholders."* + +Tres dominios de acción simultáneos: técnica, planificación espacial, +valores cotidianos. Es **la misma lógica del concept matrix de +Webster & Watson** — pero en formato policy-making. + +--- + +## 3. ¿Y la IA? Lo que el corpus dice, lo que no dice, y lo que dice el cluster + +Hay **dos lentes** sobre la misma pregunta. La primera es **in-corpore**: +¿Qué dice el corpus congelado de valoraciones sobre la IA? La segunda +es **in-clustere**: ¿Qué dice la literatura viva que explícitamente +trabaja el ciclo de investigación con IA? Las dos juntas dan una +respuesta que ni sola podría. + +### 3.1 Lo que el corpus congelado dice (in-corpore) + +Hice una búsqueda por keywords (`ai`, `llm`, `chatgpt`, `machine +learning`, `elicit`, `scite`, `researchrabbit`, `undermind`, +`automated`, `neural`, `transformer`, `nlp`, `asistente`, `language +model`, `gpt`) en los 80 papers del corpus. **9 de 80 (11%) +matchearon al menos una keyword de IA/LLM**. Pero la distribución es +lo que cuenta: + +| Paper | Año | Rol de la IA en el paper | +|---|---|---| +| *Evaluating the Feasibility of ChatGPT in Healthcare* | 2023 | **Objeto central** — el único paper con IA/LLM como tema principal | +| *Complexity-Thinking Methods Contribute to Improving Occupational Safety in Industry 4.0* | 2019 | Contexto — los nuevos sistemas socio-técnicos de Industry 4.0 tienen "increased machine intelligence" | +| *Integrative social robotics, value-driven design, and transdisciplinarity* | 2020 | Marco ético — propone el **Non-Replacement Principle** | +| *Designing and Validating Assessments of Complex Thinking in Science* | 2015 | Herramienta — **scoring automatizado** de assessments de complex thinking | +| *Outcomes of Collaborative Water Policy Making* | 2003 | Tangencial — keywords mencionan "Artificial intelligence" | +| *Consulting versus participatory transdisciplinarity* | 2010 | Tangencial — keyword | +| *A conceptual proposal and operational definitions of the cognitive processes of complex thinking* | 2021 | Tangencial — keyword | +| *Designing and Developing Assessments of Complex Thinking in Mathematics* | 2015 | Tangencial — keyword | +| *Normative future visioning: a critical pedagogy for transformative adaptation* | 2024 | Tangencial — keyword "consensus" | + +**El único paper con IA/LLM como objeto central es el de 2023 sobre +ChatGPT en salud**. Lo que dice es importante para lo que NO es: + +> *"Although AI-based language models like ChatGPT have demonstrated +> impressive capabilities, it is uncertain how well they will perform +> in real-world scenarios, particularly in fields such as medicine +> where high-level and complex thinking is necessary. [...] it is +> important to recognize and promote education on the appropriate use +> and potential pitfalls of AI-based LLMs in medicine."* + +Es un paper de **feasibility y precauciones**. Prueba la herramienta +en cuatro escenarios (práctica clínica, producción científica, uso +malicioso, razonamiento sobre salud pública) y **no usa IA como +herramienta de investigación**. La modela como *objeto* sobre el que +se puede escribir, no como infraestructura del ciclo. + +El segundo paper más sustantivo sobre IA es el de **Industry 4.0**: + +> *"Many Industry 4.0 innovations involve increased machine +> intelligence. These properties make socio-technical work in Industry +> 4.0 applications inherently more complex. At the same time, system +> failure can become more opaque to its users. [...] traditional +> health and safety risk assessment methods are unable or are +> 'ill-equipped' to deal with these system properties."* + +No construye una herramienta. **Fundamenta la necesidad** de nuevos +métodos — y deja abierta la pregunta de cuáles son. + +El tercero es la **robótica social** (2020): + +> *"Social robots may only do what humans should but cannot do."* + +Esto es el **Non-Replacement Principle** que el campo de la robótica +ya formuló. Es exactamente el principio que bib2graph implementa en +el producto: **asistir el forrajeo, no reemplazar el juicio humano**. + +**Síntesis in-corpore.** El corpus revela tres cosas que el campo +"descubrió" después con ChatGPT: (a) el Non-Replacement Principle +(2020), (b) la distinción consulting/participatory transdisciplinaria +(2010), (c) el problema del automated scoring de constructos complejos +(2015). **El corpus anticipó, sin saberlo, los dilemas éticos y +metodológicos del cluster IA-in-research** que vino después. + +### 3.2 Lo que el cluster vivo dice (in-clustere) + +La segunda lente es **el cluster IA-in-research** propiamente dicho: +las herramientas y papers que, en 18 meses (sep-2024 a jun-2026), +están construyendo explícitamente el cruce entre ciclo de investigación +humano y asistencia algorítmica. El dossier completo, con 10 fuentes +primarias y crítica externa publicada, vive en +[`../../examples/nota-05-ciclo/cluster_ia_research/README.md`](../../examples/nota-05-ciclo/cluster_ia_research/README.md). +Aquí la lectura **situada** — no la lista, sino lo que el cluster +**le dice al corpus**. + +**a) El cluster está más ocupado de lo que la Nota 04 sospechaba, pero +más sesgado al participatory.** Diez fuentes en 18 meses: +PaperQA2 (FutureHouse, OSS código + GPT-4o cerrado), +SemanticCite (Haan, OSS, narrow — verifica citas), +Citation-Constellation (Alam, OSS + LLM local, auditable), +Information Farming (Azzopardi & Roegiest, conceptual — la pieza +que faltaba), RGB (Chen et al., benchmark que revela fallas), Scite +(cerrado comercial, referente directo de la "máquina de tensiones"), +Elicit (narrow-AI para biomedicina), Consensus (visual pero +metodológicamente débil — la crítica más demoledora es Aaron Tay, +SMU librarian, nov-2025), ResearchRabbit y Litmaps (visualización sin +IA). **El cluster está poblado pero no balanceado**: la mayoría son +participatory (PaperQA2 elige, Consensus clasifica, Scite decide el +peso de evidencia), pocos son consulting (Citation-Constellation +diagnostica sin prescribir). + +**b) La pieza conceptual que faltaba salió en enero 2026.** +Azzopardi & Roegiest, *Information Farming: From Berry Picking to +Berry Growing*, ACM CHIIR 2026. Es la primera revisión seria del +cambio de paradigma: el modelo de **berrypicking → berry growing**, +con la **Revolución Neolítica** como analogía (de cazador-recolector +a agricultor). **El "plot" del agricultor es exactamente la +"biblioteca viva" del ADR 0009.** El paper confirma con vocabulario +académico lo que el proyecto ya construyó — sin que bib2graph lo +supiera. + +**c) El referente directo de la "máquina de tensiones" del Nota 04 +es cerrado.** Scite.ai (2M+ users, 1.6B+ citas indexadas con acuerdos +de 30+ publishers) es **el caso más maduro** de la Inserción 2 que el +Nota 04 soñaba. Es **SaaS cerrado y comercial**; su modelo de +clasificación de citas no es público; su paper QSS 2021 usa BERT +sobre contratos con publishers. **No hay una versión OSS que ocupe +ese lugar.** Eso es derrota del participatory por ausencia: la +implementación más madura del wedge del Nota 04 **no es reproducible**. + +**d) El único OSS nuevo que combina bibliometría + LLM local + +auditable es Citation-Constellation (Alam 2026).** BARON y HEROCON +son scores de proximidad estructural del citation profile de un +investigador, no del corpus. **Opera one-author**, no many-to-many. +bib2graph **opera many-to-many** (sobre corpus curado). Los dos +ocupan el cuadrante "consulting + estructura bibliométrica + auditable ++ OSS" — desde ángulos complementarios. **El competidor más directo +de bib2graph no es Scite ni Consensus: es Alam.** + +**e) La crítica externa publicada (Aaron Tay, nov-2025)** +demuestra que **el flagship feature del cluster más visible +(Consensus Meter) es metodológicamente débil**. Vote-counting, +equal-weighting sin sample size, ignorando effect sizes, no-determinismo +del reranking, opacidad del flujo, Medical Mode whitelist que no es +MEDLINE. **El benchmark RGB de Chen 2024 ya medía estas fallas**; las +herramientas lo ignoran; los usuarios lo descubren al usarlas. **El +gap entre "anuncio" y "realidad"** es el hueco metodológico real del +cluster. + +**f) Hay una coincidencia estructural con bib2graph que no es +accidental.** Tres tesis del cluster convergen con lo que el proyecto +ya hizo: (i) **el "plot" del agricultor (Azzopardi)** es la biblioteca +viva; (ii) **el "asistir, no reemplazar" (robótica social 2020)** es +el Non-Replacement Principle; (iii) **el "consulting, no +participatory" (Pohl 2010, anticipado por bib2graph)** es la decisión +del ADR 0022. Tres cosas que el cluster dice ahora **ya estaban en el +proyecto desde antes**, formuladas con otra ropa. + +--- + +## 4. El vacío que el corpus revela (y por qué importa) + +Si uno mira el corpus con la lente del ciclo de investigación humano, +el **vacío** es más nítido que su contenido. Pero el vacío cambia de +forma cuando se mira con las dos lentes juntas (corpus + cluster). + +### 4.1 Lo que el corpus solo muestra (in-corpore) + +**Nadie en este corpus une (a) el modelo del ciclo de Ellis/Bates/ +Kuhlthau/Pirolli con (b) asistencia algorítmica, sea generativa o +determinista.** Lo que hay son aproximaciones parciales: + +1. **Papers de feasibility/precauciones** (ChatGPT en medicina 2023): + prueban una herramienta en dominios específicos. **No modelan el + ciclo de investigación.** Su aporte es identificar límites. + +2. **Papers de scoring automatizado** (Shepard et al. 2015 sobre + complex thinking en science): **escalan UN paso del ciclo** (la + evaluación de un constructo psicométrico), pero **no asisten el + forrajeo ni el sensemaking**. + +3. **Papers de complex adaptive systems** (Industry 4.0 2019; Innes + et al. 2003 sobre collaborative policy): **fundamentan la + necesidad** de nuevos métodos para sistemas complejos, pero no + los construyen. + +4. **Papers de robótica social** (ISR 2020): **establecen el + principio ético** (*asistir, no reemplazar*) pero en otro dominio + (robots cuidadores, no bibliotecas de papers). + +### 4.2 Lo que el cluster muestra, contrastado con el corpus + +La lente del cluster corrige y completa la del corpus: + +- **El "wedge" del Nota 04 está parcialmente ocupado — por canales + cerrados.** Scite (clasificación de citantes), Consensus Deep Search + (síntesis con voto-counting), PaperQA2 (retrieval superhumano con + GPT-4o). **Lo que está ocupado es la capacidad** (clasificar, + sintetizar, detectar contradicciones). **Lo que NO está ocupado es + la implementación abierta y reproducible.** Esa es la diferencia + crucial: el wedge no está vacío, está **secuestrado por SaaS**. + +- **El "consulting" tiene un competidor nuevo (Alam 2026) que no + existía cuando se decidió el ADR 0022.** Citation-Constellation + prueba que la combinación "bibliometría + LLM local + auditable + + OSS" **es posible**. Es un competidor de bib2graph, no un aliado + — pero confirma que el cuadrante existe y es defendible. + +- **El "berry growing" tiene nombre académico ahora (Azzopardi 2026).** + El proyecto llamaba a la biblioteca viva "sustrato" o "plot"; + Azzopardi la llama **"plot" en sentido agrícola**, con la + Revolución Neolítica como marco. Eso es munición conceptual para + el paper que el PO está escribiendo: el cluster **ya tiene la + teoría** del farming; bib2graph **ya tiene la práctica** del + plot. La nota de posicionamiento del Nota 04 puede reescribirse + con vocabulario de Azzopardi sin perder la decisión del ADR 0022. + +- **La auditoría metodológica ya existe (Chen RGB 2024 + Tay 2025) y + el cluster la ignora.** Eso es un argumento público fuerte: no + alcanza con anunciar "performance superhumana"; hay que pasar + benchmarks como el RGB. **bib2graph, al ser determinista, los pasa + por construcción** (mismas comunidades Louvain para el mismo + corpus, ver gate R2 del ADR 0030). Esa es una ventaja de diseño + que el cluster todavía no descubrió. + +### 4.3 Lo que el corpus SÍ anticipó, sin saberlo + +Lo más llamativo es que **varias ideas que el campo "descubrió" con +ChatGPT ya estaban en este corpus, a veces formuladas con más +precisión**: + +- **IA asistiendo vs IA como stakeholder.** La distinción *consulting + vs participatory transdisciplinarity* (Pohl et al. 2010) es + literalmente eso, formulada en un dominio (investigación + participativa con stakeholders humanos) donde el problema se + venía pensando desde los 70. + +- **Automated scoring de complex thinking.** Shepard et al. (2015) + lo hacen para el dominio de educación en ciencias. **No es ChatGPT**; + es un sistema de scoring por rubrica + tecnología de + psicometría. Pero la pregunta que contestan es la misma: ¿se + puede escalar la evaluación de *complex thinking* sin perder + validez? + +- **Non-Replacement Principle.** La robótica social (2020) lo + formula antes de que la conversación sobre IA generativa + empiece. *"Social robots may only do what humans should but cannot + do."* Es la única línea ética defendible para bib2graph. + +- **Asortatividad como diagnóstico.** Cuando Choi & Pak (2007) + enumeran los promotores y barreras del trabajo transdisciplinario + ("proximidad física, claridad de roles, incentivos + institucionales, meta común") están haciendo algo muy parecido a + medir asortatividad de un equipo: **¿los hubs (los senior PI con + mucha co-autoría previa) se conectan con hubs o con novatos? ¿La + red es core-periphery o se distribuye equitativamente?** Eso es + lo que la métrica de assortatividad captura en bib2graph — para + papers en lugar de para equipos. + +### 4.4 El lugar de bib2graph en el campo (con la lectura doble) + +Tres conclusiones emergen de leer **el corpus** con la herramienta, +**cruzado con el cluster** que el dossier del §3.2 mapeó: + +**a) bib2graph llena un nicho que el cluster parcialmente ocupa, pero +no de la forma que el cluster quiere.** La operacionalización del +ciclo de investigación con asistencia algorítmica **determinista y +no-generativa** no tenía referente publicado al momento del ADR 0022 +(jun-2025). **Ahora sí lo hay — y es un competidor, no un aliado**: +Citation-Constellation (Alam, mar-2026) opera en el mismo +cuadrante desde el ángulo one-author. **El wedge del Nota 04 sigue +parcialmente vacío en su forma original** (consulting + corpus +curado many-to-many + auditable + sin LLM comercial), pero **ya no +es exclusivo**. La diferenciación de bib2graph se estrecha: tiene +que **mostrar que el corpus curado es el contexto correcto** (el +"plot" del agricultor, en vocabulario de Azzopardi), no el +citation profile individual. + +**b) La distinción consulting vs participatory es el eje del cluster, +no sólo del proyecto.** Si la herramienta hace *consulting* (asiste +al humano en su ciclo, respeta su juicio, le muestra estructura +pero no le dice qué pensar), es éticamente defendible y +epistémicamente compatible con la ciencia normal — y bibliométricamente +**auditable end-to-end** (mismas comunidades Louvain para el mismo +corpus, R2 del ADR 0030). Si hace *participatory* (co-investiga, +propone, decide qué es relevante), entra en territorio donde la +máquina de tensiones operaba — y la Nota 06 documenta por qué esa +inserción se rompió. **El cluster muestra que el "consulting" es +raro** (Citation-Constellation es la excepción, no la regla); **el +"participatory" es dominante** (Scite, PaperQA2, Consensus). El ADR +0022 sale **reforzado, no debilitado**, por lo que el cluster +muestra: cuando el participatory se vuelve mainstream, los riesgos +que la Nota 06 identificó se materializan en benchmarks publicados +(Tay 2025 contra Consensus, Chen 2024 contra los RAG systems). + +**c) El COMPLEX-21 es un espejo metodológico — y Citation-Constellation +es un espejo de diseño.** bib2graph hace para la estructura +bibliométrica lo que el COMPLEX-21 hace para *complex thinking*: +operacionaliza un constructo que antes era filosófico en métricas +que se pueden calcular, comparar y reproducir. La diferencia es que +**bib2graph mide la estructura del campo**, no la cognición del +autor. Y Alam (2026) hace para el citation profile del investigador +lo que bib2graph hace para el corpus curado: scoring estructural + +LLM local + audit trail + no comercial. **La diferencia operativa +entre los dos es one-author vs many-to-many**. Si bib2graph +quiere defender el hueco, la defensa pasa por **demostrar que el +corpus curado es donde la auditoría y la reproducibilidad tienen +sentido** — porque sin corpus, no hay R2 que valide nada. + +--- + +## 5. ¿Qué hacer con esto? + +Cuatro consecuencias prácticas para el proyecto, todas modestas y +trazables. Las tres primeras son las del informe original; la cuarta +aparece al cruzar con el cluster. + +1. **Documentar la no-coincidencia con Scite/Elicit/Consensus en el + paper que se está escribiendo.** El corpus permite decir: "el + campo discute la IA como objeto (feasibility) y como marco ético + (Non-Replacement); nadie une ciclo de investigación humano + + asistencia bibliométrica determinista". Esa frase es publicable, + está fundada en abstracts verificables y aterriza una promesa + que la Nota 04 tenía inflada. **El cluster refuerza la tesis**: + los referentes maduros (Scite, Consensus, PaperQA2) son + cerrados, comerciales, y — según Tay (nov-2025) y Chen (RGB + 2024) — **metodológicamente débiles en lo que más le importa a + un systematic reviewer** (negative rejection, reproducibilidad, + heterogeneity, vote-counting). + +2. **Releer el ejemplo `examples/valoraciones/` como caso de estudio, + no solo como gate de reproducibilidad.** El gate R2 (de la + Nota 09 + ADR 0030) verifica que las comunidades Louvain son + estables. Pero el corpus mismo, leído con la herramienta, da + para **un estudio de caso metodológico**: cómo un investigador + individual (el PO) hace un ciclo completo (semillas → chaining + → curación → enriquecimiento → redes) sobre un dominio donde + **la transdisciplinariedad es el método** (no un adorno). Eso + es publicable en una revista de metodología de investigación o + en *Research on Research* / *Scientometrics*. **El vocabulario + para titularlo viene del cluster**: *Information Farming* + (Azzopardi 2026) — el PO está "farming" una colección, no + "foraging" papers sueltos. + +3. **Marcar la apertura como tesis — y como ventaja comparativa + demostrable.** Que el corpus revele un nicho no es razón para + llenarlo a cualquier costo; es razón para llenarlo **bien**. La + decisión del PO de retirar la IA generativa (ADR 0022) sale + **reforzada** por lo que el corpus y el cluster muestran juntos: + los papers que invocan IA lo hacen como feasibility o como + marco ético; los referentes maduros son cerrados y + metodológicamente débiles. **El camino "consulting, no + participatory; determinista, no generativa; abierto, no + cerrado"** es el único que el estado del campo sostiene con + evidencia, no sólo con preferencia. Y la ventaja se puede + **mostrar**: bib2graph pasa el RGB de Chen por construcción + (mismas comunidades para el mismo corpus) — algo que ninguna + herramienta cerrada del cluster puede demostrar. + +4. **Reescribir la frase de posicionamiento del Nota 04 con + vocabulario del cluster.** La Nota 04 decía: *"La biblioteca de + investigación abierta y curada por vos, donde la estructura de + citación es el contexto y la IA entra en los puntos que elegís + — para encontrar no solo los papers, sino las tensiones + alrededor de tus ideas."* Con Azzopardi (2026), se puede decir + mejor: *"El plot de tu investigación: donde plantas, cultivas y + cosechas papers con la estructura de citación como contexto — + la IA entra optativamente en los puntos que elegís (consulting, + no participatory), y la cosecha es siempre auditable, nunca + una caja negra."* Esa frase aterriza la promesa grande del + Nota 04 sin la inflación de la "máquina de tensiones", y se + sostiene con evidencia del cluster (Alam, Azzopardi, ADR 0022). + +--- + +## 6. Lo que esta nota NO hace (honestidad académica) + +- **No es meta-investigación.** No estoy haciendo science of + science sobre el dominio de valoraciones en educación. Estoy + leyendo abstracts de un corpus particular para entender qué + literatura existe sobre el problema que el proyecto dice + resolver. Es una lectura focalizada, no un mapeo exhaustivo. + +- **El corpus es chico (80 papers, 10 aceptados).** Las + frecuencias y los "9 de 80 matchean IA" son indicativos, no + significativos. Para una revisión más fuerte haría falta + re-seedear con `max_results 500+` o más y re-curar — pero eso + cambia el corpus y requiere un ADR nuevo. + +- **No relevé los papers con PDFs leídos.** Trabajé con abstracts + de OpenAlex. Hay información que está en los papers completos y + no en los abstracts (sobre todo las operacionalizaciones + metodológicas). Para una versión más sólida, una segunda + pasada debería incluir descarga + lectura de PDFs (Hito 8 + + `b2g resolve --from-bib`). + +- **No contrasté contra el cluster de IA-in-research de Nota 04.** + Scite, Elicit, Consensus, Undermind, ResearchRabbit, PaperQA2, + ContraCrow no aparecen porque no están en este corpus. La + afirmación de §4.1 ("no hay un paper que aplique asistencia + algorítmica al ciclo") es **dentro del corpus**, no absoluta. + Hacer la afirmación absoluta requeriría una búsqueda dirigida + (otra ecuación, otro gate). *(Esta limitación fue saldada el + mismo día vía el dossier + [`../../examples/nota-05-ciclo/cluster_ia_research/README.md`](../../examples/nota-05-ciclo/cluster_ia_research/README.md), + que mapea 10 fuentes del cluster vivo y se cita en §3.2 arriba. + La afirmación absoluta queda: "nadie une ciclo humano + asistencia + bibliométrica determinista + corpus curado many-to-many + auditable + end-to-end + sin LLM comercial" — esa combinación no existe en + el cluster tampoco. La combinación *existe* en partes: + Citation-Constellation (Alam 2026) tiene la combinación + estructural pero opera one-author, no sobre corpus curado.)* + +--- + +## 7. Referencias (URLs) + +### Papers del corpus citados (con su `id` canónico para verificación) + +- **Luna-Nemecio & Silva-Pacheco (2021), *A conceptual proposal and operational definitions of the cognitive processes of complex thinking*** — *Thinking Skills and Creativity*. id: `doi:c20891bd3a8dd2af` — sin abstract en OpenAlex. +- **Luna-Nemecio (2021), *Complex Thinking and Sustainable Social Development: Validity and Reliability of the COMPLEX-21 Scale*** — *Sustainability*. id: `doi:4ae2f80c0cb5ecec`. +- **Wiek et al. (2019), *Aligning sustainability assessment with responsible research and innovation: Towards a framework for Constructive Sustainability Assessment*** — *Sustainable Production and Consumption*. id: `doi:7fc02990eebf1760`. +- **Shepard et al. (2015), *Designing and Developing Assessments of Complex Thinking in Mathematics for the Middle Grades*** — *Theory Into Practice*. id: `doi:5886cee791dd94a3`. +- **Pellegrino et al. (2015), *Designing and Validating Assessments of Complex Thinking in Science*** — *Theory Into Practice*. id: `doi:a0c5d6cdd6b682c4`. +- **Choi & Pak (2007), *Multidisciplinarity, interdisciplinarity, and transdisciplinarity in health research, services, education and policy: 2. Promotors, barriers, and strategies of enhancement*** — *Clinical and Investigative Medicine*. id: `doi:7108f254e58d2553`. +- **Pohl et al. (2010), *Consulting versus participatory transdisciplinarity: A refined classification of transdisciplinary research*** — *Futures*. id: `doi:2368530d4f2c8d70` — sin abstract en OpenAlex. +- **Lieblein et al. (2012), *Phenomenon-Based Learning in Agroecology: A Prerequisite for Transdisciplinarity and Responsible Action*** — *Agroecology and Sustainable Food Systems*. id: `doi:c46b4d5e263b3323`. +- **Innes et al. (2003), *Outcomes of Collaborative Water Policy Making: Applying Complexity Thinking to Evaluation*** — *Journal of Environmental Planning and Management*. id: `doi:ecbecdfdf34f65e9`. +- **Short & Iseri (2005), *Exploring the Possibilities for EFL Critical Pedagogy in Korea: A Two-Part Case Study*** — *Critical Inquiry in Language Studies*. id: `doi:f4c75d7f10bafc95`. +- **Iseri (2011), *A Model for EFL Materials Development within the Framework of Critical Pedagogy (CP)*** — *English Language Teaching*. id: `doi:7cb6e3b42aa78fcc`. +- **Zevenbergen et al. (2012), *Three Points Approach (3PA) for urban flood risk management*** — *Urban Water Journal*. id: `doi:922325ccaafab773`. +- **Chassignol et al. (2023), *Evaluating the Feasibility of ChatGPT in Healthcare: An Analysis of Multiple Clinical and Research Scenarios*** — *Journal of Medical Systems*. id: `doi:4fb2c1aeaa80ef4f`. +- **Sheratt et al. (2019), *Can Complexity-Thinking Methods Contribute to Improving Occupational Safety in Industry 4.0?*** — *Safety*. id: `doi:fba29ad0ec040d02`. +- **Bremmer et al. (2020), *Integrative social robotics, value-driven design, and transdisciplinarity*** — *Interaction Studies*. id: `doi:1bb12bbb749a4105`. +- **Roggema et al. (2024), *Normative future visioning: a critical pedagogy for transformative adaptation*** — *Buildings and Cities*. id: `doi:3e4299a7ecc7a5e9`. +- **Disentangling Transdisciplinarity** (Roux et al. 2007) — *Science & Technology Studies*. id: `doi:7108f254e58d2553` (mismo id que Choi; corregir si re-cotejado). + +> **Caveat:** los `id` son los que devuelve OpenAlex para el corpus +> congelado; las atribuciones de autor/año se infirieron de los +> metadatos disponibles. Una atribución definitiva requiere abrir +> cada PDF. + +### Documentos del proyecto + +- [`../../examples/nota-05-ciclo/informe_bibliometria.md`](../../examples/nota-05-ciclo/informe_bibliometria.md) — informe cuantitativo (las métricas). +- [`../../examples/valoraciones/equation.yaml`](../../examples/valoraciones/equation.yaml) — la ecuación del corpus. +- [`04-direccion-ia-in-the-loop.md`](04-direccion-ia-in-the-loop.md) — la promesa grande de la que esta nota es heredera. +- [`05-ciclo-investigacion-humano.md`](05-ciclo-investigacion-humano.md) — el modelo del ciclo (con la actualización de jun-15). +- [`06-critica-as-built-v0.2.md`](06-critica-as-built-v0.2.md) — el red-team. +- [ADR 0008](../decisiones/0008-wedge-forrajeo.md) — la enmienda: máquina de tensiones retirada, forrajeo bibliométrico. +- [ADR 0022](../decisiones/0022-producto-sin-ia-generativa.md) — el producto no usa IA generativa. + +### Referentes del campo (de las Notas previas) + +- Scite.ai — paper QSS (MIT Press): +- ResearchRabbit / Connected Papers / Litmaps — comparación (Aaron Tay): +- Elicit — reseña PMC: +- Consensus — deep dive (Aaron Tay): +- PaperQA2 / "superhuman synthesis" (FutureHouse, OSS): +- ContraCrow / detección de contradicciones — ecosistema FutureHouse/PaperQA. +- SemanticCite — +- metaknowledge (UWNETLAB) — la vacante ocupada: +- bibliometrix (estándar de la categoría): + +### Dossier del cluster IA-in-research (jun-27) + +- [`../../examples/nota-05-ciclo/cluster_ia_research/README.md`](../../examples/nota-05-ciclo/cluster_ia_research/README.md) — dossier completo de las 10 fuentes del cluster, con crítica externa y mapeo al ciclo de la Nota 05. +- **PaperQA2** (FutureHouse, sep-2024): · repo +- **Citation-Constellation** (Alam, mar-2026): · tool +- **Information Farming** (Azzopardi & Roegiest, ACM CHIIR 2026): +- **SemanticCite** (Haan, nov-2025): +- **RGB benchmark** (Chen et al., AAAI 2024): +- **Aaron Tay** (SMU librarian, nov-2025) — *A 2025 Deep Dive of Consensus: Promises and Pitfalls*: +- **Aaron Tay** (ago-2025) — *Why I Think Academic Deep Research Will Win*: +- Undermind (whitepaper): diff --git a/docs/Notas/23-RETROALIMENTACION_bib2graph_agente.md b/docs/Notas/23-RETROALIMENTACION_bib2graph_agente.md new file mode 100644 index 0000000..fa8b802 --- /dev/null +++ b/docs/Notas/23-RETROALIMENTACION_bib2graph_agente.md @@ -0,0 +1,168 @@ +# Retroalimentación de agente — `bib2graph` v0.10.0 + +**De:** Claude (agente que corrió el ciclo completo en dos sesiones reales) +**Para:** mantenedor de bib2graph +**Contexto:** dos informes "estado del arte" generados de punta a punta — uno sobre EoS para gases (100 papers), otro sobre EoS para electrolitos (219 papers, 12 ecuaciones iterativas). El usuario quedó muy satisfecho con los informes, en particular las gráficas. Este documento responde dos cosas que pidió: **(1)** mi experiencia de usuario como agente usando la herramienta, y **(2)** el patrón reutilizable detrás de los informes, pensado para que lo agregues a la skill vendida (`b2g skill add`). + +> Nota de transparencia sobre el modelo: la interacción la condujo **Sonnet 4.6**; esta síntesis la escribe **Opus 4.8**. Lo señalo porque puede ser relevante para calibrar qué tan "espontáneo" fue el patrón: gran parte del flujo que describo abajo lo improvisó Sonnet *sin* guía de la skill, lo cual es justamente la señal de que vale la pena codificarlo. + +--- + +## Parte 1 — Experiencia de usuario (agente) + +### 1.1 Lo que funcionó muy bien + +**El modelo `Corpus` inmutable con factory `from_arrow` es excelente para un agente.** La semántica de valor (cada `accept`/`reject` devuelve un corpus nuevo) elimina toda una clase de errores de estado. Cuando exploré la API de Python antes de usar la CLI, esto me dio confianza para encadenar operaciones sin miedo a mutaciones sorpresa. + +**La salida `--json` con envelope consistente (`{schema, ok, command, exit_code, data, warnings, error}`) es lo correcto.** Pude parsear todo programáticamente sin heurísticas frágiles. El campo `ok` booleano y `error.code` legible (`NETWORK_ERROR`, etc.) me dejaron construir reintentos limpios. **Esto es lo más importante que hace la herramienta agente-amigable** — por favor no lo cambien. + +**`read top` recomputando en tiempo de lectura sin requerir `build` previo** es un detalle de diseño que se siente bien: bajé la barrera para "echar un vistazo" sin comprometerme a un pipeline completo. + +**El patrón "honest-empty" (bloque vacío con `reason`/`fix_command` y exit 0)** lo vi en `read top` para co-citación. Es exactamente cómo una herramienta debería comunicarle a un agente "esto está vacío *por esta razón*, corré *este comando* para arreglarlo". Más comandos deberían hacer esto. + +**La skill vendida acierta en el encuadre filosófico.** El "one-shot es un entregable real" + "mostrá que es el trabajo a la mitad" es un buen modelo mental. Me hizo ofrecer valor temprano en vez de exigir el ciclo completo. + +### 1.2 Fricción real que viví (lo importante) + +**(A) No hay forma de volcar abstracts en lote — esta fue mi mayor fricción, con diferencia.** +`read list --json` devuelve solo `{id, title, year, curation_status, is_seed}`. Para conseguir abstracts tuve que llamar `read show --id ` **una vez por paper**. Con 100–219 papers eso son cientos de invocaciones de subproceso, cada una con su overhead. Terminé escribiendo bucles en Python con `time.sleep()` para no saturar, y en la segunda sesión directamente **salté la CLI y pegué contra la API de OpenAlex con `urllib`** para reconstruir abstracts desde `abstract_inverted_index`. Eso es exactamente lo que la herramienta debería ahorrarme. + +> **Pedido concreto #1:** un flag `read list --fields abstract,authors_raw,keywords_id,doi` (o un `read dump --json` que devuelva el corpus completo enriquecido en una sola llamada). Para un agente que va a sintetizar, leer todo el corpus de una vez es la operación más común, no la excepción. + +**(B) `read top` da centralidad y comunidad, pero no puedo pedir "los top N *de cada comunidad*".** +Para los informes, la unidad de análisis natural fue *el cluster temático*. Tuve que traer un `read top -n 40` grande, cruzarlo manualmente con `networks//clusters.csv`, agrupar por `community` en Python, y *luego* ir a buscar el abstract de cada uno (ver fricción A). Tres pasos manuales para algo que es el caso de uso central de "mapear un campo". + +> **Pedido concreto #2:** `read top --by-community` (o `read clusters --top-per N`) que devuelva, por comunidad, los N papers más centrales **con sus abstracts**. Esto colapsaría ~80% del trabajo manual de ambos informes en una sola llamada. + +**(C) Timeouts de OpenAlex con queries booleanas complejas.** +Las ecuaciones con muchos `AND`/`OR`/paréntesis anidados (`"equation of state" AND gas AND (thermodynamic OR properties OR PVT)`) daban `NETWORK_ERROR (ReadTimeout)` o `429` repetidamente. Las queries simples pasaban. Tuve que degradar la complejidad de la ecuación y meter esperas largas (60–120 s). No sé si el timeout de `seed` es configurable, pero un agente no tiene forma de saber que "la query es demasiado pesada para el endpoint" vs. "la red está caída" — ambos llegan como `NETWORK_ERROR`. + +> **Pedido concreto #3:** (a) un `--timeout` configurable en `seed`/`chain`; (b) distinguir en `error.code` entre `RATE_LIMITED` (429, reintentable con backoff) y `QUERY_TOO_COMPLEX`/`UPSTREAM_TIMEOUT` (504, hay que simplificar). Con códigos distintos puedo reaccionar correctamente sin adivinar. + +**(D) `read stats --group-by` solo acepta `status|year|is_seed`.** +Quise `--group-by source` (journal) y `--group-by community` y no existen. Para caracterizar un campo, "¿en qué revistas se publica esto?" y "¿qué tamaño tiene cada comunidad?" son preguntas de primer orden. Terminé calculándolas a mano desde los CSV exportados. + +> **Pedido concreto #4:** ampliar `--group-by` a `source`, `language`, `community`, y `decade` (década, no solo año — para campos con 90 años de historia como electrolitos, agrupar por año es demasiado granular). + +**(E) Pequeño tropiezo de aprendizaje: `apply_filters` (API Python) devuelve una tupla `(Corpus, list[FilterStep])`, no un `Corpus`.** +Me costó un error en tiempo de ejecución. No es un bug —es razonable querer los `FilterStep` para PRISMA— pero el docstring no lo telegrafía bien. La CLI no tiene este problema (es solo en la API Python). + +### 1.3 Resumen de la experiencia en una línea + +La herramienta es **excelente para forrajear y construir las redes**, pero **me suelta justo antes de la síntesis**: el último kilómetro (abstracts en lote, agrupar por comunidad, leer las redes para escribir algo) lo tuve que improvisar yo cada vez. Y como ese último kilómetro es donde está el entregable que el usuario realmente quería, vale la pena codificarlo. Eso es la Parte 2. + +--- + +## Parte 2 — El patrón de informe (para agregar a la skill) + +La skill vendida termina el ciclo en `read top` y el "mapa estás-acá". Pero en ambas sesiones el usuario no quería un listado de papers centrales: quería **un documento de síntesis con figuras tipo paper**. Ese paso —de "redes construidas" a "informe escrito"— no está en la skill, lo improvisé las dos veces, y es replicable. Aquí está destilado. + +### 2.1 El patrón en una frase + +> **Cluster como unidad de análisis → abstracts como evidencia → figuras como argumento → documento como entregable.** + +La red de acoplamiento bibliográfico ya particiona el campo en comunidades (Louvain). Cada comunidad *es* un subtema. El informe se escribe **una sección por comunidad**, anclada en los abstracts de sus papers más centrales, e ilustrada con figuras que muestran estructura (no decoración). + +### 2.2 El pipeline de síntesis (los pasos que faltan en la skill) + +``` +[la skill ya cubre hasta acá: seed → chain → build → read top] + │ + ▼ +6. EXTRAER → abstracts + autores + keywords de los top-N por comunidad + (hoy: read show en bucle — debería ser read top --by-community) + │ + ▼ +7. CLASIFICAR → agrupar papers en "familias" temáticas. Dos vías: + (a) usar las comunidades de Louvain directamente, o + (b) clasificación por keywords/título cuando el usuario + ya tiene un marco mental del campo (ej. las 7 familias + de EoS para electrolitos) + │ + ▼ +8. FIGURAR → generar 4–6 figuras matplotlib "tipo paper" (ver 2.3) + │ + ▼ +9. ENSAMBLAR → documento Word: una sección por familia, cada afirmación + anclada en un abstract, cada figura con caption interpretativo +``` + +Los pasos 6–9 son los que conviene que la skill describa. No hace falta que la herramienta los *ejecute* (siguen siendo juicio + generación), pero sí que **le diga al agente que el ciclo no termina en `read top`** y le dé la receta. + +### 2.3 La receta de figuras (esto es lo que más gustó) + +Seis arquetipos de figura cubrieron ambos informes. Cada uno responde una pregunta concreta sobre el campo: + +| # | Figura | Pregunta que responde | Datos de bib2graph | +|---|--------|----------------------|--------------------| +| 1 | **Distribución temporal** (barras + tendencia) | ¿Cuándo creció el campo? ¿hay hitos? | `read stats --group-by year` | +| 2 | **Línea de tiempo histórica** (hitos por familia) | ¿Cómo evolucionaron los modelos/escuelas? | años + clasificación por familia | +| 3 | **Mapa de comunidades** (burbujas por cluster) | ¿En qué subtemas se parte el campo? | `clusters.csv` + tamaños | +| 4 | **Top papers por centralidad** (barras horizontales, color=comunidad) | ¿Cuáles son los trabajos pivote? | `read top` | +| 5 | **Landscape 2D** (scatter: eje X vs eje Y, tamaño=cobertura) | ¿Cómo se comparan los enfoques en 2 dimensiones clave? | síntesis de abstracts | +| 6 | **Red de co-ocurrencia** (grafo de keywords, top-N nodos) | ¿Cuál es el vocabulario y qué conecta los subtemas? | `exports/keyword_cooccurrence/` | + +**Lo que hace que se vean "tipo paper" (los detalles que importan):** + +- **Paleta sobria y consistente**: navy/azul/teal + acentos ámbar/rojo. Un color por familia, usado en *todas* las figuras (la comunidad 4 es azul en la fig 3, en la fig 4 y en la leyenda). La consistencia cromática entre figuras es lo que más "amarra" el documento. +- **Fondo `#f7f9fc`** (no blanco puro) — se lee como figura de revista, no como output de Jupyter. +- **`spines top/right` ocultos**, grid tenue (`alpha 0.3`) y por debajo (`set_axisbelow`). +- **Tamaño de burbuja = una tercera variable** (cobertura, versatilidad). Convierte un scatter 2D en uno 3D sin saturar. +- **Anotaciones con `arrowprops` finos** en vez de etiquetas pegadas — evita solapamiento y se ve intencional. +- **150 dpi, `bbox_inches='tight'`**, ancho ~7.5–9 in para que entren a página completa en el docx. +- **Captions interpretativos, no descriptivos.** No "Figura 1: publicaciones por año" sino "Figura 1: el pico de 2012 coincide con la publicación de GERG-2008". El caption *argumenta*, no rotula. + +Hay un script de referencia con los seis arquetipos parametrizados que acompaña este documento (`figuras_tipo_paper.py`): es directamente adaptable y encapsula la paleta y los defaults de estilo. + +### 2.4 La estructura de documento que funcionó + +``` +Portada (título + tabla de métricas del corpus: N papers, N familias, rango temporal) +0. El problema fundamental ← por qué el campo es difícil (engancha al lector) +1. Línea de tiempo histórica ← Figura 2 +2. Distribución y evolución ← Figuras 1, también barras por familia +3. Arquitectura/taxonomía ← diagrama de cómo se organizan los enfoques +4. Análisis por familia ← EL NÚCLEO: una subsección por comunidad, + cada una con su cuadro-resumen + abstracts citados +5. Mapa de capacidades ← Figura 4 (radar) + Figura 5 (landscape) +6. El debate central ← la tensión viva del campo (donde está la acción) +7. Guía de selección ← tabla maestra: qué modelo para qué caso +8. Respuesta a la pregunta ← si el usuario tenía una pregunta de fondo, respondela aquí +9. Tendencias emergentes ← hacia dónde va +Referencias ← top papers por centralidad, con DOI +Nota metodológica ← cómo se armó el corpus (reproducibilidad/PRISMA) +``` + +La **sección 4 es el corazón** y mapea 1:1 con las comunidades de Louvain. Cada subsección usó un patrón fijo: un *cuadro-resumen de color* (familia, período, autores clave, términos) seguido de 2–3 párrafos donde cada afirmación técnica está anclada en un abstract concreto con su DOI. Eso es lo que da autoridad: no es opinión del agente, es síntesis de la evidencia recuperada. + +La **nota metodológica al final no es opcional** — es lo que hace el informe defendible (PRISMA). Documenta las ecuaciones de búsqueda, el N, la fecha, el algoritmo de comunidades y su semilla. Encaja perfecto con la filosofía "reproducible, sin IA generativa" de la herramienta. + +### 2.5 Sobre clasificación: comunidades de Louvain vs. marco del usuario + +Un matiz que aprendí entre las dos sesiones: **a veces el usuario ya tiene un marco mental del campo** que no coincide con las comunidades de Louvain. En electrolitos, el usuario pensaba en términos de "familias de modelos" (Debye-Hückel, Pitzer, eNRTL, CPA, SAFT...) que son una taxonomía *conceptual*, no la partición *estructural* que da la bibliometría. Ahí clasifiqué por keywords/título contra esas familias conocidas, y usé las comunidades de Louvain como validación cruzada. + +> **Implicación para la skill:** ofrecé las dos vías. Si el campo es nuevo para el usuario → comunidades de Louvain (deja que la estructura hable). Si el usuario ya tiene un marco → clasificá contra su marco y usá Louvain para verificar/sorprender. Esto conecta con el paso 6 del ciclo (sensemaking, irreductiblemente humano): la taxonomía es del humano, la estructura es de la herramienta. + +--- + +## Parte 3 — Recomendaciones priorizadas para la skill + +Ordenadas por impacto sobre la calidad del entregable final: + +1. **Extender la skill más allá de `read top`** con el pipeline de síntesis (Parte 2.2). Hoy la skill describe cómo conseguir el material pero no cómo convertirlo en el documento que el usuario quería. Es el hueco más grande. + +2. **Documentar la receta de figuras (2.3) como reference file** (`reference/figuras.md` + el script). Fue lo que más valoró el usuario y lo que un agente sin guía improvisa de forma inconsistente. + +3. **Resolver la fricción de abstracts en lote (pedido #1)** a nivel herramienta. Sin esto, cada informe paga el costo de cientos de `read show` o, peor, el agente se salta la CLI y va directo a OpenAlex (perdiendo la trazabilidad que la herramienta provee). + +4. **`read top --by-community` con abstracts (pedido #2)** — colapsa el caso de uso central de "mapear un campo" en una llamada. + +5. **Códigos de error distinguibles (pedido #3)** — `RATE_LIMITED` vs `QUERY_TOO_COMPLEX` vs `UPSTREAM_TIMEOUT`. Sin esto, los reintentos del agente son a ciegas. + +6. **Ampliar `read stats --group-by` (pedido #4)** a `source`, `community`, `decade`, `language`. + +Los puntos 1 y 2 son de skill (puro contenido, los podés agregar ya). Los puntos 3–6 son de herramienta. Si tuviera que elegir **uno solo**: el #1, porque es lo que separa "tengo unas redes" de "tengo el informe que pedí". + +--- + +*Documento generado como retroalimentación de uso real. Sin datos personales del usuario. Los dos temas de investigación (EoS para gases / para electrolitos) son de dominio público en ingeniería química y no sensibles.* diff --git a/docs/Notas/24-referente-snowballing-comparacion.md b/docs/Notas/24-referente-snowballing-comparacion.md new file mode 100644 index 0000000..e83fb67 --- /dev/null +++ b/docs/Notas/24-referente-snowballing-comparacion.md @@ -0,0 +1,78 @@ +# 24 — Referente: `snowballing` (JoaoFelipe) vs bib2graph + +> Nota de exploración. El PO trajo https://github.com/JoaoFelipe/snowballing como +> posible "algo parecido a lo que queremos". Capturo el cotejo para no perderlo; +> lo accionable está al final. + +## Qué es snowballing + +Herramienta de João Felipe Pimentel (misma línea de `noWorkflow`) para acompañar +**revisiones sistemáticas con la metodología de snowballing de Wohlin (2014)**: +backward (referencias) + forward (citantes), con humano en el loop y procedencia. + +- **Fuente:** scraping de **Google Scholar** (Selenium + plugin de Chrome con botones + BibTeX/Work/Add). +- **"Base de datos":** archivos **`.py` por año** (la BD es código Python que se importa). +- **Interfaz:** **Jupyter notebooks** con widgets (pasos de snowballing, inserción de + citas, análisis); CLI mínimo (`snowballing start|plugin|web`). +- **Modelo:** objeto `Work` con atributos configurables (perfil "default" con nombres + propios `name`/`place1`, perfil "bibtex" con nombres estándar + `_category`/`_due`). +- **Salidas:** grafos de citación, histogramas de venue, **vista de procedencia del + snowballing** (PROV / ProvToolBox), validación de la BD contra Scholar, + `PDFReferencesExtractor` (refs desde PDF). +- **IA:** no usa. + +## En qué se parece + +El *qué* es casi idéntico: **forrajeo por citas**. Su backward/forward = nuestro +`b2g chain`. Ambos: crecen de una semilla siguiendo el grafo de citas, distinguen +sembrado de traído (`is_seed`), tienen curación humana, y cierran con procedencia + +redes de citación como salida. + +## En qué difiere (y por qué confirma nuestros ADRs) + +| | snowballing | bib2graph | +|---|---|---| +| Fuente | scraping Google Scholar | OpenAlex API (ADR 0007) | +| "BD" | `.py` por año | tabla Arrow + DuckDB biblioteca viva (ADR 0009) | +| Interfaz | Jupyter notebooks + plugin | CLI agente-native (Hito 6) | +| Modelo | `Work` configurable, 2 perfiles | `PaperRow` único (Pydantic) → schema Arrow | +| Determinismo | acoplado a notebook + scraping (frágil) | núcleo puro, `corpus_hash` estable | +| IA | no | no, **por diseño** (ADR 0022) | + +Lectura clave: snowballing es casi un **espejo de nuestra v0** (BD-como-archivos-Python, +acoplado al notebook, scraping de Scholar). Es justo de lo que se alejó la reescritura +clean-room (`01-lecciones-v0.md`). Paga en fragilidad/no-reproducibilidad lo que nosotros +cuidamos → valida OpenAlex + núcleo puro + CLI. Encaja con la frontera motor/producto: +ellos mezclan motor + UX en el notebook; nosotros separamos. + +## Qué nos puede enseñar (accionable, sin compromiso) + +1. **Anclaje metodológico explícito.** Ellos dicen "snowballing de Wohlin" — método de + SLR **citable**, con criterios de inicio/parada. Nuestro forrajeo es más rico + (scent, redes múltiples) pero framed en lenguaje propio. Para el mensaje "antídoto al + sesgo del related work" (#187) y el académico hispano, nombrar el linaje — + *"snowballing de Wohlin, hecho determinista y a escala"* — baja la barrera de adopción. + → candidato a entrar en el posicionamiento de lanzamiento. + +2. **Vista de procedencia del snowballing en la GUI (#34).** Ya tenemos los datos —y más: + `ProvenanceEvent`, `chaining_hop`, `source_tag`, `is_seed`. Ellos lo *muestran* + ("este paper entró en la ronda 2, backward desde tal semilla"). Lectura barata para la + GUI porque el dato ya existe. + +3. **`validate` contra la fuente.** Tienen un paso de validar la BD contra Scholar. No + tenemos un `b2g validate` que re-confronte el corpus vivo contra OpenAlex. Idea suelta. + +4. **Refs desde PDF** (`PDFReferencesExtractor`). Nuestro backward depende de la cobertura + de OpenAlex; refs-desde-PDF es un fallback que ellos tienen. Anotarlo como **límite + conocido del backbone**, no como trabajo a hacer. + +5. **Doble perfil de nombres del `Work`** — tensión "vocabulario del dominio vs del + usuario", que resolvimos con `PaperRow` único. Confirma la elección, no la cambia. + +## Síntesis + +snowballing **valida la tesis** (forrajeo por citas = wedge real y publicable) y a la vez +es el **contraejemplo arquitectónico** que justifica nuestros ADRs. Lo de verdad +accionable: (1) anclaje a Wohlin para el mensaje, (2) vista de procedencia en la GUI. +El resto queda anotado como referencia/límites. diff --git a/docs/Notas/25-multiproveedor-requerimientos.md b/docs/Notas/25-multiproveedor-requerimientos.md new file mode 100644 index 0000000..4204207 --- /dev/null +++ b/docs/Notas/25-multiproveedor-requerimientos.md @@ -0,0 +1,231 @@ +# 25 — Soporte multi-proveedor: requerimientos para delimitar candidatos + +> **Nota de exploración / encuadre.** Fecha: 2026-06-30. El PO trae una dirección que ya +> piden los usuarios: **no depender solo de OpenAlex** (Semantic Scholar, CrossRef, …) y, +> en lo posible, abrir cobertura al **Sur global** (Latinoamérica, África, Asia), +> priorizando **español / inglés** (el producto es principalmente para hispanohablantes). +> +> El pedido explícito es **lo primero, extraer requerimientos** que nos ayuden a delimitar +> qué proveedores entran y cuáles no. Esta nota hace eso y deja una primera criba de +> candidatos *a verificar*. No decide nada todavía — lo accionable está al final. + +## Tesis + +Depender solo de OpenAlex es un **punto único de falla** en tres dimensiones a la vez: +cobertura (qué papers existen para el motor), disponibilidad (si OpenAlex se cae o cambia +términos, el ciclo entero se cae) y **misión** (OpenAlex cubre mal mucho del Sur global y +de la producción en español). Abrir proveedores no es solo robustez técnica: es alinear la +herramienta con para quién es. + +**La buena noticia (del mapeo de código):** el motor ya está preparado. Existe un +`Protocol Source` (`src/bib2graph/sources/base.py:39`) con dos métodos —`seed(query)` y +`load(path)`— y dos implementaciones (`OpenAlexSource`, `BibtexSource`). La **identidad +canónica es DOI-first** (ADR 0036: precedencia `doi > source_id > título+año`, +`corpus.py:54`). Y la arquitectura separa **Source / Enricher / Forager**. Esto define el +encuadre de los requerimientos: **no son una lista plana; son lo que un proveedor debe +cumplir según el ROL que vaya a jugar.** + +## El contrato que un proveedor debe poder llenar (anclado al código) + +| Pieza del motor | Qué exige del proveedor | Dónde vive | +|---|---|---| +| `Source.seed(query)` | búsqueda por ecuación → papers | `sources/base.py:39` | +| Schema canónico (mín. ADR 0018) | `title`, `year`, `authors_raw`, `keywords_raw` (el `id` se calcula) | `schemas.py:130`, `base.py:46` | +| Identidad / dedup (ADR 0036) | **DOI** (ideal) u otro id estable resoluble | `corpus.py:54` | +| Backward chaining | referencias salientes (`references_id` inline) | `forager.py:136` | +| Forward chaining | citantes en lote (`fetch_citing_batch`-equivalente) | `openalex.py:996` | +| Enricher (opcional) | resolver `DOI → metadatos / refs` por lote | `enrichers/openalex.py` | + +## Los tres roles que puede jugar un proveedor + +Como el motor ya separa Source / Enricher / Forager, **un proveedor no tiene que hacer +todo**. Esto agranda el universo de candidatos y simplifica los adaptadores: + +1. **Sembrador / buscador** — sabe responder una ecuación de búsqueda. Alimenta la *Puerta + A* (ecuación → corpus). Requiere endpoint de search con filtros. +2. **Forrajeador (grafo de citas)** — expone referencias y/o citantes. Es el **corazón del + producto** (`b2g chain`). Un proveedor sin citas NO puede forrajear. +3. **Enriquecedor / resolución** — dado un DOI/ID devuelve metadatos o refs. No necesita + search ni grafo; sirve para rellenar huecos y para la resolución `DOI → ID` de la + Puerta B (BibTeX/RIS). + +Un mismo proveedor puede cubrir varios roles (OpenAlex cubre los tres). Otros solo uno +(CrossRef es fuerte en resolución y refs salientes, débil en citantes). + +## Requerimientos (criterios de criba) + +Marcados **[MUST]** (sin esto no entra), **[SHOULD]** (lo queremos, negociable según rol) y +**[NICE]** (suma, no decide). Un proveedor se evalúa **contra el rol** que aspira a cubrir. + +### Eje A — Acceso y licencia (gating duro) + +- **A1 [MUST]** API HTTP pública y documentada. **No scraping.** (Esto descarta Google + Scholar de entrada — ver Nota 24: la fragilidad del scraping es justo de lo que huimos.) +- **A2 [MUST]** Gratuita para uso académico. **Registro / API key está OK**; lo que no + entra es de pago obligatorio o muro institucional. +- **A3 [MUST]** Términos que **permitan almacenar y derivar** los metadatos: la biblioteca + viva los guarda y el grafo es un derivado. Ideal licencia abierta de los datos (CC0, + como OpenAlex y CrossRef). Verificar caso por caso. +- **A4 [SHOULD]** Cuotas compatibles con forrajeo (polite pool o rate limit razonable; no + límites que hagan inviable expandir una red de cientos de papers). + +### Eje B — Encaje con el motor (el contrato Source) + +- **B1 [MUST]** Provee los campos mínimos del schema (ADR 0018): `title`, `year`, + `authors_raw`, `keywords_raw`. +- **B2 [MUST]** **DOI** u otro identificador estable y resoluble, para que la identidad + canónica DOI-first deduplique cross-proveedor sin trabajo extra. +- **B3 [SHOULD, según rol]** Búsqueda por query con filtros (necesario para rol + *sembrador*; prescindible si solo enriquece). +- **B4 [SHOULD fuerte]** **Grafo de citas**: referencias salientes (backward) y/o citantes + (forward). Es lo que separa un proveedor *útil para el producto* de uno que solo + engorda metadatos. Sin esto, el proveedor queda relegado a enriquecer. +- **B5 [NICE]** Lookup por **lista de IDs / batching** (para materializar y para citantes + en lote ≤~50). Sin batching el forrajeo es lento pero posible. + +### Eje C — Cobertura y misión (Sur global · idioma) + +- **C1 [SHOULD]** Cobertura **real** de LatAm / África / Asia, o de un dominio/idioma que + OpenAlex cubre mal. Aquí pesan SciELO, Redalyc, La Referencia, DOAJ. +- **C2 [SHOULD]** Indexa **español / inglés** (alineado con el público hispano). +- **C3 [MUST de valor]** **Valor marginal**: que aporte papers o citas que OpenAlex **no** + tiene. Si solo replica a OpenAlex, no justifica la complejidad de un adaptador nuevo. + (Criterio anti-over-engineering: cada proveedor paga su costo de mantenimiento.) + +### Eje D — Operabilidad y sostenibilidad + +- **D1 [SHOULD]** Gobernanza estable detrás (institución, no proyecto que muere en un año). +- **D2 [SHOULD]** Rate limits documentados, paginación (cursor), polite pool / key opcional + inyectable sin default literal (coherente con ADR 0012). +- **D3 [MUST]** Respuesta parseable (JSON). Mapeo JSON→fila razonable. +- **D4 [NICE]** Bajo costo de adaptador: ¿hace falta traducir la ecuación de búsqueda? + ¿cuánta lógica defensiva? (OpenAlex pidió un traductor WoS→OpenAlex no trivial.) + +## Primera criba de candidatos (PRELIMINAR — a verificar) + +> ⚠️ Tabla de trabajo. Las capacidades exactas de cada API (rate limits, presencia de +> citantes vs solo refs, licencia precisa) **hay que verificarlas** antes de decidir. +> Marco rol probable y banderas, no afirmo hechos cerrados. + +| Proveedor | Rol probable | Citas (fwd/back) | Sur global / idioma | Bandera a verificar | +|---|---|---|---|---| +| **Semantic Scholar (S2 Academic Graph)** | sembrador + forrajeador | refs **y** citantes (fuerte) | global, fuerte en CS/inglés | key gratuita opcional; cobertura ES | +| **CrossRef** | resolución + sembrador | refs salientes (~depende del editor); **sin citantes** | global vía editores; ES si el editor deposita | forward citations las da OpenCitations, no CrossRef | +| **OpenCitations (COCI/INDEX)** | forrajeador puro | citas DOI→DOI, CC0 | global (lo que esté en COCI) | solo capa de citas; sin metadatos ni search | +| **DOAJ** | sembrador (OA) | no es grafo de citas | **fuerte OA Sur global / ES** | API de metadatos; ¿refs? | +| **SciELO** | sembrador + cobertura | citas limitadas | **núcleo Iberoamérica ES/PT** | madurez/forma de la API (ArticleMeta/OAI) | +| **Redalyc** | cobertura | limitado | **LatAm ES** | ¿API real o solo portal? | +| **La Referencia** | cobertura (agregador) | no | **LatAm, repositorios** | OAI-PMH, granularidad de metadatos | +| **CORE / BASE** | cobertura OA (agregadores) | no | global OA | calidad/dedup de metadatos | +| **Europe PMC** | sembrador + forrajeador (biomed) | refs y citas | global, biomed | dominio acotado a biomedicina | + +**Lectura de la criba:** ningún proveedor único reemplaza a OpenAlex. El patrón natural es +**composición por rol**: S2 como segundo backbone con citas; CrossRef + OpenCitations como +par resolución+citas; y una **capa Sur global** (SciELO / DOAJ / La Referencia) que aporta +cobertura ES aunque sea pobre en grafo de citas. Esto encaja con la separación +Source/Enricher que ya existe. + +## Verificación empírica (probe del 2026-06-30) + +> Golpeamos las APIs reales con un script (`examples/multiproveedor-probe/probe_apis.py`, +> resultados en `RESULTS.md`). Esto **sustituye conjeturas por HTTP real** en varias filas +> de la criba de arriba. Una llamada por capacidad; no exhaustivo. + +- **Semantic Scholar** — el **grafo de citas funciona sin key**: `references`, `citations` + (forward) y `batch` → HTTP 200. Pero `search` dio **429 sostenido** aun con backoff + exponencial (4 intentos, hasta 8 s). ⇒ **forrajeador hoy sin credencial; sembrador exige + la API key gratuita**. Confirma el 2º backbone, con ese matiz operativo. +- **CrossRef** — search ✓, DOI nativo, **85 referencias depositadas**; forward es solo un + *conteo* (`is-referenced-by-count=207`), no la lista. Confirmado: sembrador + refs + + resolución, **sin citantes**. +- **OpenCitations** — citantes **n=208**, refs **n=72**, CC0. Completa el forward que a + CrossRef le falta. El par CrossRef+OpenCitations cubre resolución + grafo completo. +- **DOAJ** — búsqueda en español ✓ (artículos **ES/PT**), pero **DOI solo ~1/3** de la + primera página. Cobertura hispana real; dedup DOI-first parcial. +- **SciELO (ArticleMeta)** — el endpoint **no es búsqueda full-text** (lista PIDs por + colección); el artículo de muestra sin DOI. Sirve por otra puerta (cosecha OAI), no para + *seed* por ecuación vía este endpoint. + +**Veredicto empírico del 2º slot Sur-global: DOAJ > SciELO** — DOAJ tiene búsqueda JSON +real que devuelve contenido ES/PT; SciELO-ArticleMeta es cosecha masiva, no seeding por +ecuación. (Re-probar SciELO por su Search API / OAI si se lo prioriza luego.) + +## Verificación documental (deep-research citado, 2026-06-30) + +> Un `deep-research` con verificación adversarial (24 fuentes, 22 claims confirmados) +> corroboró capacidades **con cita oficial** y corrigió dos cosas del probe. **Confianza:** +> lo de S2 pasó verificación 3-0; lo de DOAJ/SciELO/CrossRef viene de fuente primaria pero el +> corte de presupuesto lo dejó fuera del voto final → *reconfirmar antes de implementar*. +> +> **Nota de alcance:** la licencia de los *datos* de un proveedor es problema del **consumidor** +> (Atalaya / el producto), **no de bib2graph**. El motor es determinista y agnóstico a la fuente; +> solo le importa el contrato técnico (`Source`). Por eso esta nota no evalúa licencias de datos +> como criterio de inclusión del motor. + +**Correcciones al probe:** +- **SciELO SÍ tiene citantes:** servicio `CitedBy` (REST, forward por DOI/título/SciELO-ID, + `github.com/scieloorg/citedby`, BSD-2) + `ArticleMeta` para metadatos. Mi probe la + subvaloró por golpear solo ArticleMeta-identifiers. +- **DOAJ:** API pública gratuita; key solo para editores que cargan datos → *seed/search sin + key*. Buena cobertura OA hispana (ES/PT). +- **CrossRef:** public pool gratis sin registro (5 req/s registros · 1 req/s listas, conc. 1); + **polite pool** con `mailto` sube límites. Sin citantes forward (confirmado: solo conteo). + +## Matriz de decisión consolidada (probe empírico + deep-research) + +| Proveedor | Acceso | Sembrar | Refs (back) | Citantes (fwd) | DOI | Cobertura ES / Sur | Rol recomendado | +|---|---|---|---|---|---|---|---| +| **OpenAlex** (baseline) | gratis | ✓ | ✓ | ✓ | ✓ | media | backbone (sigue) | +| **Semantic Scholar** | gratis; key gratis p/ search | ✓ (key) | ✓ | ✓ | ✓ | **sin verificar** | **2º backbone (a implementar)** | +| **CrossRef** | gratis, polite pool | ✓ | ✓ (depositadas) | ✗ (solo conteo) | ✓ nativo | vía editores | resolución + refs (roadmap) | +| **OpenCitations** | gratis | ✗ | ✓ | ✓ (DOI→DOI) | ✓ | global | forrajeador, par de CrossRef | +| **DOAJ** | gratis (sin key p/ search) | ✓ (ES/PT) | ✗ | ✗ | parcial (~1/3) | **fuerte OA hispana** | **1ª Sur-global del piloto** | +| **SciELO** | gratis (ArticleMeta+CitedBy) | parcial (no full-text search) | ? | ✓ (CitedBy) | parcial | **núcleo Iberoamérica** | Sur-global alternativa | + +**Recomendación del piloto:** **S2** (2º backbone) **+ DOAJ** (1ª Sur-global: búsqueda real en +ES/PT). SciELO queda como alternativa fuerte si se prioriza grafo de citas iberoamericano +(tiene `CitedBy`) sobre facilidad de búsqueda. + +## Tensiones honestas (para el PO, no se deciden acá) + +1. **¿Cuántos proveedores y en qué orden?** Cada adaptador es código a mantener (C3, D4). + Recomendación tentativa: **S2 primero** (cubre los tres roles, es el pedido más fuerte + de usuarios y suma citas), y **una sola** fuente Sur-global de prueba — **DOAJ** según + el probe empírico — para validar el eje misión antes de invertir en varias. +2. **Conflicto y merge cross-proveedor.** Si el mismo paper viene de OpenAlex y S2 con + metadatos distintos, ¿quién gana? La identidad DOI-first colapsa el `id`, pero el + *merge de campos* necesita política (precedencia por fuente, o último que escribe). + Probable **ADR nuevo** (toca contrato de corpus / `normalize_and_dedup`, ADR 0031). +3. **Proveedor sin DOI** (mucho del Sur global). Cae al fallback `título+año`, más frágil + para dedup. ¿Aceptamos ruido de identidad a cambio de cobertura? Decisión de producto. +4. **Selección de proveedor por comando.** ¿`b2g seed --source s2`? ¿multi-fuente en una + corrida? ¿default configurable por workspace? Es superficie CLI nueva — encuadrar + contra el ADR de superficie agente-native (0.10.0). +5. **Forward citations sin proveedor que las dé** (caso CrossRef): obliga a emparejar con + OpenCitations. ¿Vale un proveedor que solo sirve emparejado? + +## Accionable (sin compromiso) + +1. **Verificar la criba con datos reales** — capacidades de API, licencia y cobertura ES de + cada candidato (sobre todo S2, CrossRef+OpenCitations y la capa Sur global). Candidato a + un `deep-research` con fuentes citadas; convertir el resultado en una matriz de decisión. +2. **Promover a Discussion** lo que cuaje de esta nota (note-first → Discussion): el debate + de *qué proveedores y en qué orden* vive ahí, no en la nota. +3. **ADRs que esto va a disparar** (anotar, no escribir aún): (a) **merge cross-proveedor** + (precedencia de campos sobre ADR 0031), (b) **selección de proveedor / multi-fuente** en + la superficie CLI. Cambios a contratos públicos → ADR antes de mergear (regla del repo). +4. **Decisión del PO**: **S2 decidido como 2º backbone — a implementar.** Pendiente: alcance + del piloto (recomendado **S2 + DOAJ**) y política para papers sin DOI (tensión 3). +5. **Reconfirmar** las capacidades de DOAJ/SciELO/CrossRef contra docs oficiales (el + deep-research las extrajo de fuente primaria pero no pasaron el voto adversarial final). + +## Síntesis + +El motor **ya tiene la puerta** (`Protocol Source`, identidad DOI-first, separación +Source/Enricher/Forager): agregar proveedores es implementar un contrato conocido, no +rediseñar. Los requerimientos se ordenan **por rol** (sembrar / forrajear / enriquecer) y +por cuatro ejes (acceso, encaje, misión, operabilidad). La criba preliminar dice que **no +hay reemplazo único de OpenAlex**: el camino es **composición por rol**, con S2 como +segundo backbone y una capa Sur-global para la misión hispana. Lo que falta antes de +decidir: **verificar** las APIs candidatas y que el PO fije el alcance del piloto y la +política de identidad sin DOI. diff --git a/docs/Notas/26-retroalimentacion-cli-agent-native.md b/docs/Notas/26-retroalimentacion-cli-agent-native.md new file mode 100644 index 0000000..fdc8169 --- /dev/null +++ b/docs/Notas/26-retroalimentacion-cli-agent-native.md @@ -0,0 +1,262 @@ +# 26 — Retroalimentación: ¿es bib2graph realmente *agent-native*? + +> **Género:** nota de retroalimentación / auditoría (nota primero; no es ADR ni doc +> canónico). Insumo para issues y, si cuaja el rumbo, para un ADR de posicionamiento. +> **Origen:** dos análisis **independientes** del CLI `b2g` contra el *Rubric for +> Agent-Native CLI Design* (los nueve principios del handbook), unificados acá: +> uno del PO y uno de un agente que auditó `src/bib2graph/` con tres barridos +> paralelos. Donde discreparon, se reconcilió **contra el código** (a prueba de `grep`). +> **Para qué:** saber, con evidencia `archivo:línea`, en qué ejes bib2graph es +> agent-native de verdad y cuáles son las tres grietas reales — separando lo que es +> *hueco* de lo que es *decisión de diseño por bajo blast radius*. +> **Auditoría as-built:** sobre `src/bib2graph/` en la rama `chore/retirar-exploracion` +> (estado 0.10.x). Las citas `archivo:línea` se verificaron contra el árbol. +> **Relacionadas:** `23-RETROALIMENTACION_bib2graph_agente.md` (fricción de uso real +> del mismo agente — el "último kilómetro"), `28-marco-software-donde-nos-paramos.md` +> (§2-bis: el Pilar 4 "CLI para agentes" es *fail-open advisory*, no *fail-closed*), +> `27-recibo-de-demo-functor-honesto.md` (el instinto del *functor honesto* que exige +> nombrar dónde el discurso cruza una frontera en silencio). + +--- + +## TL;DR + +bib2graph **es agent-native genuino en los ejes que importan para lo que es**: un CLI +de analítica local, determinista, sin blast radius destructivo multi-tenant. Lo es +**por construcción, no por vocabulario** — el posicionamiento "CLI = API para agentes" +(Nota 28, Pilar 4) se sostiene con `archivo:línea`, no con analogía prestada. + +El rubric pide no sumar los nueve en un puntaje, sino mirar **dónde dos grietas juntas +crean riesgo**. Tres grietas reales, en orden de palanca: + +1. **No hay introspección versionada de la superficie** (principio 9) — el agente que + arranca en frío no puede preguntarle a la herramienta "qué comandos/flags tenés y en + qué versión del contrato estás" por el mismo canal que usa para actuar; tiene que ir a + `docs/API.md` (el *hop* débil). +2. **El error de red no distingue reintentable de no-reintentable** (principio 3) — todo + cae en `NETWORK_ERROR`; es el **único hueco con daño documentado en uso real**: en la + Nota 23 el agente abandonó la CLI y pegó directo contra OpenAlex con `urllib`, + destruyendo la procedencia que es la razón de ser de la herramienta. +3. **Mutación precisa sin fricción** (interacción 8×7/4) — un `curate reject --ids …` + bien formado, self-contained y con exit 0 limpio muta el corpus de forma persistente + sin ninguna fricción ni declaración de blast radius. + +Los principios 4–7 (trust & safety) están **relajados por diseño** y es aceptable: no hay +borrado de recursos, no hay estado compartido, el daño es local y recuperable por snapshot. +El propio rubric lo dice en su *worked example*: un CLI de analítica local no necesita la +misma postura de trust que uno que borra producción. + +--- + +## Los nueve principios + +### I. Legibilidad + +**1. Salida estructurada, no narrada — `Sound`.** +Todo subcomando que devuelve datos expone `--json` vía el decorador compartido +`@json_option` (`cli/_options.py:69-91`), aplicado de forma pareja (`seed.py:388`, +`build.py:621`, `chain.py:345`, `read.py:103/168`, etc.), y emite un envelope versionado +`{schema, ok, command, exit_code, data, warnings, error}` con `ENVELOPE_SCHEMA_VERSION = "1"` +(`service/envelope.py:26`, `build_envelope` en `:29-59`). Se imprime una sola línea JSON con +`ensure_ascii=False` + `flush` — `jq` la consume sin preprocesar; UTF-8 forzado en la +frontera (`cli/__init__.py:82-95`). Sin *drift* por ancho de terminal: el modo humano usa +strings fijos (`emit_human`), no tablas. Único matiz benigno: un grupo sin subcomando +imprime *help* sin envelope (`skill.py:213`), pero eso no es un comando-que-devuelve-datos. + +**2. El contrato tiene una sola forma — `Sound`.** +Una sola flag de salida estructurada (`--json`, declarada una vez en `_options.py:85`); +sin variantes `--output`/`--pretty`. Activación alternativa uniforme por entorno +(`B2G_JSON` truthy, `_options.py:33-46`). Naming consistente: grupos noun-verb +(`read|curate|snapshot `) + verbos planos del ciclo, gobernado por ADR. Las +divergencias son **explícitas y justificadas**: `--format` aparece solo en `export` +(`export.py:123`) porque ahí el formato es del *archivo*, no de la salida del comando; y +`seed` exige exactamente uno de `--equation/--spec/--from-bib` (`seed.py:425-444`) — el +patrón que el rubric pide. La única erosión son 9 aliases deprecados (`inspect`→`read show`, +`enrich`→`chain/build`…) presentes hasta 0.11.0: inconsistencia transicional documentada +(ADR 0038), no incidental. + +**3. Outcome por exit code y taxonomía estable — `Sound`, con un caveat de granularidad.** +Exit codes 0–5 tipados y documentados (`service/errors.py:8-13`, ADR 0021), con función de +mapeo **pura** `code_for(exc)` (`service/errors.py:71-97`) — la política vive en un solo +lugar. 6 `error.code` semánticos (`USAGE_ERROR`, `DATA_ERROR`, `DEPENDENCY_ERROR`, +`NETWORK_ERROR`, `STORE_ERROR`, `B2G_ERROR`); el decorador `@handle_errors` (`cli/_errors.py:91-148`) +garantiza el envelope de error sin duplicar `try/except`. Tres clases de falla son +distinguibles sin leer stderr (uso→1, datos→2, dependencia→3, red→4, store→5). +**El caveat (donde los dos análisis discreparon, reconciliado):** estructuralmente es +`Sound`; pero **dentro** de `NETWORK_ERROR`/exit 4, no se distingue `429` (reintentable con +backoff) de `504`/query-demasiado-compleja (no-reintentable) — todo colapsa al mismo código +(`sources/openalex.py:150`, `cli/_errors.py:140-145`). Es el failure mode literal del +principio ("un retry loop no puede separar transitorio de permanente") y la Nota 23 lo vivió +(Pedido #3). El retry/backoff existe pero es **interno** (`openalex.py:70`, +`_RETRY_STATUS_CODES`), invisible al caller. + +### II. Trust & Safety *(cuadrante de baja relevancia para esta herramienta)* + +**4. Reversibilidad visible antes de comprometer — `Partial`.** +Existe: `chain --preview` es un dry-run real (estima crecimiento sin fetchear ni +transicionar, `chain.py:322-333`); `build` predice redes vacías con `reason`/`fix_command` +accionables (`build.py:312,445`); `curate dump`→`curate apply` es un round-trip offline +reversible mientras no se aplica (`curate.py:139,193`). Falta: no hay `--dry-run` en +`curate filter/accept/reject`, `snapshot create/restore` ni `init`; ninguno muestra +footprint antes de comprometerse. Y la **idempotencia existe pero no se declara**: +`curate apply` y los `Source.persist` son idempotentes (ADR 0009), pero el envelope no +expone `idempotent: bool` que le diga al agente "reintentá sin miedo". Mitigado fuerte por +bajo blast radius: store DuckDB local, sin `delete/reset/purge`, `snapshot restore` como red. + +**5. Secretos fuera del razonamiento — `Sound` en la superficie viva, residuo en el alias deprecado.** +*(Reconciliación de una contradicción entre los dos análisis, resuelta contra el código.)* +No requiere credenciales. La API key de OpenAlex es opcional y, en los comandos **vivos** +(`seed/chain/build`), entra **solo por env var** `OPENALEX_API_KEY` (`openalex.py:413`, +`api_key or os.environ.get(...)`) y viaja en header `Authorization: Bearer` (`openalex.py:431`), +nunca como arg ni en el envelope — el agente no la ve. **El residuo:** `--api-key` como flag +literal existe **solo en el alias deprecado `enrich`** (`enrich.py:102-105`), que se retira +en 0.11.0 (ADR 0038, #165). Es el anti-patrón del principio 5 (key en el contexto del +agente, eco-able por inyección), pero **acotado a una superficie que ya está muriendo**. +El `--email` del polite pool no es secreto (identificador de cortesía). + +**6. Canales de input con distinto peso de confianza — `Partial`.** +Validación mínima y **sin distinción de canal**: `--workspace/--spec/--from-bib/--from-corpus` +se tratan como `click.Path()` y se pasan a `Path(...)`; un valor que el agente rellenó desde +contenido externo se valida igual que una env var puesta por el humano. `click.Path(exists=True)` +valida existencia, no origen ni *path-traversal* (`seed.py:215`); la ecuación solo se valida +no-vacía (`seed.py:90`). Defensa **implícita, no declarada**: el walk-up de workspace tiene +superficie limitada (busca `workspace.json` hacia arriba, `workspace.py:282`), y los inputs +peligrosos (ecuación, CSV de curación) tienen daño ~0 porque OpenAlex sanitiza del lado +servidor y el FS es local single-user. El principio no se aplica, pero el blast radius lo +vuelve tolerable. + +**7. Riesgo escalonado, no plano — `Partial`.** +Hay tiering **funcional** pero no **legible**: lectura sin efecto (`status/validate/read/export`) +< escritura idempotente que transiciona el FSM (`seed/build/snapshot create`) < mutación +transversal persistente que NO transiciona (`curate accept/reject`, `curate.py`) < +irreversible (`snapshot restore` sobrescribe el corpus vivo; `init` sobre carpeta existente +lanza `WorkspaceExistsError` — defensa, no preview). Pero **nada en el contrato agrupa +comandos por blast radius**: no hay `--force`, ni confirmación, ni docstring "this is +destructive"; el lector lo deduce de la prosa. El extremo verdaderamente destructivo del +espectro (borrado) directamente **no existe**, así que la planicie es benigna — coincide con +el hallazgo de la Nota 28 §2-bis: *fail-open advisory* por diseño (ADR 0021). + +### III. Composabilidad & Estabilidad del contrato + +**8. Self-contained, no session-stateful — `Sound`, con un caveat de workspace ambiente.** +Cada comando es invocable en frío: papers por `--id` obligatorio con resolución id>doi>source_id +(`read.py:205`, ADR 0036); `read top` recomputa sin `build` previo (`reads.py:746`); cada +comando devuelve identificadores explícitos en `data` (`seed`→`papers_added/total_papers/round`, +`snapshot create`→`snapshot_dir/corpus_hash`). No hay "opera sobre el último creado"; el canal +entre invocaciones es **el archivo** (`library.duckdb` del workspace), no memoria de sesión — +ésta es la propiedad que hace a `b2g` sobrevivir la compactación de contexto. +**El caveat (donde los dos análisis discreparon):** la identidad del *recurso* es explícita y +`Sound`; pero **cuál workspace** es ambiente — precedencia `--workspace` > `B2G_WORKSPACE` > +walk-up desde cwd (`workspace.py:246-286`). Un agente que cambia de cwd sin flag opera +**silenciosamente sobre otra investigación**. La precedencia está documentada y es +overridable (eso lo deja en `Sound`), pero el modo ambiente es un residuo de estado implícito +que conviene volver **legible** (ver recomendaciones). + +**9. La interfaz se auto-describe y está versionada — `Partial`. (La grieta convergente.)** +La *salida* está versionada: `ENVELOPE_SCHEMA_VERSION = "1"` en cada envelope +(`service/envelope.py:26`) detecta drift de contrato; ADRs 0037–0040 registran cambios de +superficie. **Pero no hay auto-descripción por el mismo canal:** no existe `b2g schema` / +`b2g --describe` que vuelque comandos, flags y el JSON-schema del envelope. El agente que +arranca en frío debe leer `docs/API.md` en prosa — el *hop* extra no confiable que el +principio señala. Además: el shape del envelope está descrito en prosa y duplicado en el +docstring de `build_envelope` (sin JSON-schema publicado), y `--version` muestra la versión +del paquete, no la del contrato. Si la herramienta cambiara `data["papers_added"]` → +`data["n_added"]` sin que SemVer lo marque como breaking, no habría señal mecánica. + +--- + +## Tabla resumen + +| # | Principio | Veredicto | Evidencia ancla | +|---|-----------|-----------|-----------------| +| 1 | Salida estructurada, no narrada | **Sound** | `service/envelope.py:26`; `_options.py:69-91` | +| 2 | Una sola forma de contrato | **Sound** | `_options.py:85`; `seed.py:425-444`; `export.py:123` | +| 3 | Exit codes + taxonomía estable | **Sound** *(caveat: red 429≠504)* | `service/errors.py:71-97`; `openalex.py:150` | +| 4 | Reversibilidad visible | **Partial** | `chain.py:322`; sin dry-run en curate/snapshot/init | +| 5 | Secretos fuera del reasoning | **Sound** (vivo) / residuo deprecado | `openalex.py:413`; `enrich.py:102` | +| 6 | Canales con distinto trust | **Partial** | `seed.py:215`; sin tagging de canal | +| 7 | Riesgo tiered, no plano | **Partial** | tiering funcional sin grading legible; sin `--force` | +| 8 | Comandos self-contained | **Sound** *(caveat: workspace ambiente)* | `read.py:205`; `reads.py:746`; `workspace.py:246-286` | +| 9 | Auto-descripción versionada | **Partial** | `envelope.py:26` sí; sin `b2g schema` | + +--- + +## Interacciones (lo que el rubric pide priorizar) + +No se suma: se mira dónde **dos grietas juntas** crean un riesgo que ninguna sola tiene. + +1. **Sound (8) × Partial (7/4) — fricción ausente sobre acciones precisas.** Un + `curate reject --ids W1 --ids W2 …` es self-contained, sin estado de sesión, con envelope + versionado y exit 0 limpio — *y* muta el corpus de forma persistente, transversal, sin + confirmación. El rubric señala exactamente esto: **la composabilidad que vuelve la + herramienta placentera es lo que quita la fricción natural** que una herramienta menos + componible habría tenido. Bounded porque el daño es local y recuperable (snapshots, + procedencia append-only), pero el patrón está. + +2. **Sound (3) × caveat — el agente rutea alrededor del motor.** La peor interacción por + *consecuencia sistémica*, no por blast radius: `seed/chain` son las únicas operaciones + externas, lentas y falibles. Sin subcódigo reintentable, el agente reintenta a ciegas, y + la Nota 23 documenta el desenlace real — **abandonó la CLI y fue directo a OpenAlex con + `urllib`**, perdiendo la trazabilidad que es la razón de existir de la herramienta. Una + grieta de legibilidad fina (3) hace que el agente rutee alrededor del núcleo determinista. + +3. **Partial (9) × Sound (8) — el agente que arranca en frío.** La auto-descripción faltante + pesa **más** por la composabilidad: un agente puede levantar el tool en cualquier cwd y + orquestar varios comandos, pero no puede verificar programáticamente qué comandos existen, + qué flags aceptan, ni en qué versión del envelope está. Sumado al caveat de workspace + ambiente (8), puede orquestar en frío contra el corpus equivocado sin señal. + +**Lo que NO es problema** (la nota final del rubric): el CLI no toca producción multi-tenant, +no borra recursos remotos, no comparte credenciales. Los principios 4–7 pesan menos que en +una herramienta con blast radius real. Para un agente en una sesión de investigación larga, +la grieta de fondo es **9**: si la herramienta cambia un campo sin bump, el agente no se entera. + +--- + +## Recomendaciones priorizadas (por palanca, corregidas contra el código) + +Tres mejoras de bajo costo, atacando exactamente las interacciones de arriba. El orden es por +palanca real, no por cuál principio "puntúa peor". + +1. **Exponer `b2g schema` — introspección versionada de la superficie** *(cierra P9 + + interacción 3).* Subcomando meta que vuelca: lista de comandos, flags por comando, y el + JSON-schema del envelope actual con su `ENVELOPE_SCHEMA_VERSION`. Misma familia que + `skill add` (comando meta, fuera del ciclo, no transiciona FSM). Permite a un agente + arrancar en frío sin el *hop* a `docs/API.md`. Es la grieta convergente de los dos análisis. + +2. **Subcódigo de error de red `429` vs `504`** *(cierra el caveat de P3 + interacción 2 — la + de daño documentado).* Distinguir en `error.code` (o un `error.subcode`) `RATE_LIMITED` + (429, reintentable con backoff) de `UPSTREAM_TIMEOUT`/`QUERY_TOO_COMPLEX` (504, hay que + simplificar la query). Es el **Pedido #3 de la Nota 23** y el único hueco que demostró + expulsar al agente del motor. Fix chico (`openalex.py:150` ya distingue el status code + internamente), efecto grande. + +3. **Declarar idempotencia y blast radius en el envelope** *(cierra interacción 1 sin agregar + flags).* Agregar al `data` (aditivo, no breaking) `side_effect ∈ {none, transversal, + state_transition, destructive}` e `idempotent: bool` cuando aplique. Le da al agente la + señal que hoy tiene que deducir de la prosa, sin meter confirmación interactiva (que + mataría la autonomía — ADR 0021). Conecta con el "recibo" teorizado en la Nota 27. + +**Nota sobre la credencial (lo que *no* hace falta hacer):** la recomendación intuitiva +"mover `OPENALEX_API_KEY` a env var" **ya está hecha** en la superficie viva +(`openalex.py:413`). El único `--api-key` literal vive en el alias deprecado `enrich` +(`enrich.py:102`), que se retira en 0.11.0 — el footgun de P5 **se cierra solo** con la +deprecación ya planificada. Acción mínima: no re-exponer `--api-key` en los verbos vivos +(y, opcionalmente, adelantar el retiro del flag en `enrich`). + +--- + +## Pendientes (antes de graduar a ADR o abrir trabajo) + +- Decidir si esto justifica un **ADR de posicionamiento** ("bib2graph implementa el contrato + CLI-para-agentes; las grietas 3/8/9 son roadmap explícito, las relajaciones 4–7 son + decisión por blast radius") o si queda como nota-mapa. +- Abrir issues para las tres recomendaciones (candidatos: `b2g schema`, subcódigo de red, + `side_effect`/`idempotent` en envelope). Las tres caben sin romper el contrato de 10 verbos. +- Confirmar que ningún verbo vivo (`seed/chain/build`) re-introduzca `--api-key` al absorber + `enrich` en 0.11.0. + +--- + +*Unificación de dos auditorías independientes (PO + agente) contra el Rubric for Agent-Native +CLI Design. Evidencia `archivo:línea` verificada as-built. Sin datos personales.* diff --git a/docs/Notas/27-recibo-de-demo-functor-honesto.md b/docs/Notas/27-recibo-de-demo-functor-honesto.md new file mode 100644 index 0000000..ada6a11 --- /dev/null +++ b/docs/Notas/27-recibo-de-demo-functor-honesto.md @@ -0,0 +1,200 @@ +# 27 — El recibo de demo: bib2graph como functor honesto, el kernel de juicio mínimo y cómo hacer explícito el one-shot + +> **Fecha:** 2026-06-27. **Estado:** desarrollo de idea (note-first). Disparada por +> la lectura crítica de Evgeny Poberezkin, *"The Future of Software Engineering"* +> (feb-2026) cruzada con el estado real de la superficie CLI 0.10.0 +> ([ADR 0037](../decisiones/0037-superficie-cli-10-verbos-ciclo.md), +> [ADR 0038](../decisiones/0038-destino-verbos-huerfanos-0037.md)). +> +> **Tesis:** el artículo describe un futuro donde el software se "compila" por una +> cadena de functores (propósito → capacidad → diseño → código → deploy) y aposta a +> que eso requiere un *Artificial Intellect* que todavía no existe. **bib2graph ya +> tiene tres de las piezas de ese compilador funcionando en `dev`** —el ciclo como +> functor chain, `status` como verificador determinista en la frontera, y `maturity` +> como recibo— y **no necesita AGI para tenerlas, porque las apoya en verificación +> determinista, no en cumplimiento probabilístico de un LLM.** El one-shot agents-first +> (intencional, para demo) es el lugar donde esas piezas se podrían volver deshonestas +> —cruzar fronteras en silencio— y el trabajo es hacerlo **explícito**: que el demo +> deje recibo de lo que asumió. Engancha con la [Nota 05](05-ciclo-investigacion-humano.md) +> (fundamentación del ciclo) y la [Nota 20](20_ciclo_investigacion_hallazgos_teoricos.md) +> (hallazgos del corpus). + +--- + +## 0. El disparador + +El artículo de Poberezkin hace una apuesta fuerte y una observación correcta. La +observación: *lo difícil del software siempre fue especificar, no escribir código*; +con LLMs, especificar es **la única parte que sigue requiriendo una persona**. La +apuesta: el software del futuro se "compila" a través de una cadena de **functores** +—transformaciones que preservan estructura entre capas (propósito, capacidad, diseño, +código, criterios de aceptación, deploy)— y si cada functor adyacente es correcto, el +mapeo punta-a-punta es correcto *por un teorema de teoría de categorías, no por +conocimiento empírico*. Pero el artículo condiciona todo a un **AGI hipotético** que +sepa "verificar constraints en cada frontera de functor", y descarta los sistemas +actuales por "esconder el problema detrás de retries y orquestación determinista". + +Ahí el artículo se contradice solo: llama *esconder el problema* a la verificación +determinista cuando la usan los LLMs de hoy, y *el futuro* a la misma verificación +determinista cuando la usaría su AGI. **Es la misma arquitectura con dos nombres.** Y +esa contradicción es exactamente la grieta por donde bib2graph entra: el verificador +determinista en la frontera **no requiere AGI, ya está construido.** + +El segundo disparador es una aclaración del PO: el one-shot del ciclo agents-first es +**intencional, y es para demo** —que un LLM pueda correr el ciclo de punta a punta +para *mostrarlo*. Justamente por eso importa que sea **explícito**: un demo honesto no +es el que esconde dónde se saltó el rigor, es el que lo **declara**. + +--- + +## 1. bib2graph ya es el compilador de functores honesto + +El reporte de superficie (2026-06-27) confirma que tres de las seis piezas que el +artículo pone en el futuro ya están en `dev`: + +| Idea del artículo (futuro con AGI) | Pieza en bib2graph hoy | Dónde | +|---|---|---| +| Functor entre capas adyacentes | El ciclo `init→seed→chain→build→read`; cada verbo *es* un functor entre dos capas del ciclo de investigación | [ADR 0037 §verbos](../decisiones/0037-superficie-cli-10-verbos-ciclo.md) (tabla 82-94) | +| Verificación de constraints en la frontera del functor | `status.readiness` + `status.build_preview`: **función pura, determinista, fuente única con los proyectores**; predice si una red saldría vacía *sin proyectar el grafo* y da el `fix_command` exacto | `src/bib2graph/cli/commands/status.py:39-168`, `src/bib2graph/networks/facade.py:437-515` | +| El "recibo" de lo que se compiló y cómo | El bloque `maturity: {curated, scope, empty_networks}` que `build` estampa en el artefacto | [ADR 0037 §f](../decisiones/0037-superficie-cli-10-verbos-ciclo.md), [ADR 0038](../decisiones/0038-destino-verbos-huerfanos-0037.md) (P3) | + +Esto da vuelta el argumento del artículo. Poberezkin necesita un AGI porque cree que +verificar la frontera de un functor requiere *entender*. No requiere entender: requiere +un **predicado determinista sobre el estado del corpus**, que es justo lo que +`predict_build_preview` ya hace cuando dice *"0/15 papers con `keywords_id` → la red de +keywords saldría vacía → `b2g seed --resolve`"*. Eso es el oráculo en la frontera del +functor `chain → build`, y no tiene una sola línea de IA generativa (coherente con el +[ADR 0022](../decisiones/0022-producto-sin-ia-generativa.md)). + +**La consecuencia profunda:** el "moat" del que habla el artículo —cuando la generación +se vuelve commodity, el valor migra al verificador— bib2graph lo tiene del lado correcto. +El verbo que más valor concentra no es el que *genera* (build), es el que *rechaza o +advierte* (status). Esa es la apuesta arquitectónica correcta, y conviene nombrarla +como tal. + +--- + +## 2. La grieta: la verificación es información, no registro + +El reporte trae la frase clave: *"No hay gates programáticos —`status` expone la +información para que el agente decida no avanzar, pero el CLI no bloquea transiciones."* + +Esto es **correcto por diseño** (un gate duro mataría el demo, y mataría la autonomía +del agente que el ADR 0021 quiere preservar). Pero abre un hueco: cuando el one-shot +cruza una frontera en `readiness.ready == False` —porque un demo tiene que correr de +punta a punta sí o sí— ese cruce es **silencioso**. Y "silencioso" es exactamente la +palabra con la que el artículo condena al vibecoding: *el sistema esconde dónde se +rompió el rigor; nadie sabe qué hace más allá de cierto umbral*. + +El antídoto no es poner gates. Es hacer que **el cruce deje cicatriz**. La idea +unificadora: **generalizar el `maturity` block —que ya existe— de "¿se curó?" a un +recibo completo de lo que el one-shot asumió en cada frontera.** Tres campos nuevos, +cada uno aterrizando una tensión distinta del artículo. + +### 2.1 `crossed_red` — fronteras cruzadas en rojo *(verificación → registro)* + +Cada vez que el one-shot avanzó con `status.readiness.ready == False`, se estampa en +el recibo: **qué frontera** (p. ej. `chain` con 0/N seeds con `source_id`), **qué razón** +daba el readiness, y **qué `fix_command` se ignoró**. No bloquea —deja recibo. Esto +convierte el `readiness` advisory que ya existe en algo **auditable** sin cambiar su +naturaleza: la misma información, pero persistida como hecho del artefacto en vez de +impresa y olvidada. + +> Esto responde directo a la matemática de compliance del artículo (70%→50%→35% por +> nivel de delegación de LLMs). Esa cascada asume *fallas independientes y sin +> verificación entre niveles*. Con un recibo de `crossed_red`, las fronteras dejan de +> ser independientes: cada una declara su estado, y el límite ya no es 0.7ⁿ sino la +> tasa de falsos del verificador determinista —un problema mucho mejor. + +### 2.2 `assumed_judgment` — el kernel de juicio humano que el demo simula + +El one-shot saltea curación (`--scope all`, sin `accept`/`reject`) y elige +pregunta/fuentes por default. Esos son **exactamente** los puntos donde el Product +Owner es irreemplazable según el artículo —la "capa de sabiduría": decidir *qué +construir, para quién, qué trade-off es aceptable*. El error de diseño de casi todos +los sistemas human-in-the-loop es dejar al humano *en todas partes*. El trabajo de +ingeniería es el contrario: **hacer ese kernel lo más chico y crujiente posible**, y +que el demo **declare qué partes de ese kernel simuló**. + +El recibo lista, entonces: *"curación omitida (scope=all); N papers que un humano +probablemente habría revisado [heurística]; pregunta de investigación tomada por +default"*. Con esto, el kernel de juicio mínimo deja de ser un aura inanalizable y se +vuelve **una superficie con tipos**: el conjunto declarado de decisiones que solo un +humano toma, y que el one-shot marca como *simuladas* cuando corre solo. + +> Definir ese conjunto es, además, definir qué significa "Product Owner" en el flujo de +> bib2graph (engancha con [Nota 05](05-ciclo-investigacion-humano.md) y el rol del PO en +> [`/feature-cycle`](../../.claude) ). El humano no aprueba cada paso: responde en las +> fronteras marcadas como `assumed_judgment`. + +### 2.3 `orphans` — trazabilidad río arriba *(el functor de verdad)* + +Un functor "preserva estructura" solo si **nada queda colgando**: cada objeto de una +capa mapea a algo en la adyacente. `build_preview` ya detecta el huérfano **río abajo** +(red que *saldría* vacía). Falta el huérfano **río arriba**: nodos del grafo construido +que no trazan a ninguna seed ni a la pregunta de investigación. En una investigación +real eso es deuda silenciosa; en un demo es **la cicatriz visible de la velocidad**, y +es chequeable determinísticamente sobre el grafo que `build` ya produce. + +Acá el uso honesto de la idea categorial **no es** probar corrección punta-a-punta +(eso es el teatro del artículo, que depende de un `if` —que el sistema *sea* +formalizable como tipo— que nunca se cobra). El uso honesto es la **propagación de +cambios y la detección de huérfanos**: cuando algo cambia río arriba (una seed se +quita, la pregunta se reformula), qué nodos quedan sin sustento. Eso es trazabilidad, +no demostración —y es lo que un grafo de entidades-y-morfismos como el de bib2graph +sabe hacer. + +--- + +## 3. Por qué esto cierra el argumento + +Con los tres campos, **el one-shot deja de competir con el rigor y pasa a +instrumentarlo.** Es el mismo functor chain, corrido con todos los gates en verde por +default, pero que **imprime el recibo** de lo que asumió. Eso lo vuelve una herramienta +de demostración legítima en vez de un truco de vibecoding. + +Y de yapa, da gratis el modo no-demo. El **modo riguroso es el mismo pipeline con +`crossed_red` vacío y `assumed_judgment` resuelto** —porque un humano respondió en cada +frontera marcada. No hay dos arquitecturas (una "demo" y una "seria"): hay una sola, y +el recibo mide *cuánto humano tuvo*. El demo es el extremo `crossed_red = todo, +assumed_judgment = todo`; la investigación pulida es el extremo opuesto; todo lo demás +es un punto intermedio honesto y declarado. + +Esto es, exactamente, lo que el artículo dice que hace falta para que el software del +futuro no sea vibecoding —*"hacer explícito dónde se violan los constraints antes de +que se compongan"*— pero construido sobre lo que ya existe en `dev`, sin esperar al +*Artificial Intellect*. + +--- + +## 4. Qué sigue (no es código todavía) + +Esto es desarrollo de idea. El camino del flujo sería: + +1. **Esta nota** (hecho) — captura el argumento y lo engancha con el corpus teórico. +2. **Discusión / decisión**: si la idea del *recibo de demo* cuaja con el PO, graduar a + **ADR** el contrato del `maturity` extendido — toca [`docs/API.md`](../API.md) (campo + por contrato público), por lo que requiere ADR antes de mergear (regla de CLAUDE.md). + Candidato: extender el §f del ADR 0037 / P3 del ADR 0038 en vez de un ADR nuevo. +3. **Issues** acotados, en este orden de menor a mayor juicio humano involucrado: + - `crossed_red`: registrar cruces de `readiness.ready == False` en `maturity` + (cambio chico, fuente única ya existe en `status.py`). + - `orphans`: predicado determinista de huérfanos río arriba sobre el grafo de `build` + (paralelo a `predict_build_preview` en `facade.py`). + - `assumed_judgment`: lo más delicado —requiere **declarar primero el conjunto + canónico de decisiones-de-PO** (el kernel mínimo) antes de poder marcarlas como + simuladas. Probablemente su propia nota/ADR. + +### Preguntas abiertas + +- **¿`crossed_red` es por-corrida o acumulativo?** Un workspace que corrió el one-shot + y después se curó a mano, ¿borra el recibo o lo versiona? (Relaciona con `snapshot`.) +- **¿El kernel de juicio mínimo es fijo o por-dominio?** ¿"elegir la pregunta" es + siempre PO, o hay investigaciones donde una pregunta-default es aceptable? +- **¿Dónde vive el recibo?** ¿Solo en el artefacto de `build`, o `status` lo expone como + un cuarto campo del envelope (junto a `next_best_action`/`readiness`/`build_preview`) + para que el agente lo lea *antes* de avanzar? +- **Heurística de `assumed_judgment` sin IA**: ¿con qué predicado determinista se marca + "este paper probablemente lo habría rechazado un humano" sin caer en IA generativa + (ADR 0022)? Quizás no se marca el paper, solo se declara *"curación omitida"* y se + deja el juicio afuera. diff --git a/docs/Notas/28-marco-software-donde-nos-paramos.md b/docs/Notas/28-marco-software-donde-nos-paramos.md new file mode 100644 index 0000000..8b2d979 --- /dev/null +++ b/docs/Notas/28-marco-software-donde-nos-paramos.md @@ -0,0 +1,359 @@ +# 28 — El marco de software: dónde nos paramos + +> **Género:** nota de posicionamiento (nota primero; no es ADR ni doc canónico). +> **Origen:** charla PO ↔ agente sobre "unidad de trabajo / ciclo de trabajo" + un +> `/deep-research` con 5 ángulos de búsqueda, fuentes citadas y verificación. +> **Para qué:** saber *dónde nos paramos* y nombrar el marco de software que sostiene a +> bib2graph, más allá del dominio de investigación. Insumo para un futuro ADR/ensayo si cuaja. +> **Auditoría as-built (2026-06-28):** los §2 se contrastaron contra `src/bib2graph/` (el +> ejercicio del *functor honesto* de la Nota 27); el veredicto —qué sostiene el código vs. qué +> estira el vocabulario— vive en el nuevo **§2-bis**. +> **Relacionadas:** `27-recibo-de-demo-functor-honesto.md` (el instinto del functor honesto +> que vigila esta nota), `20_ciclo_investigacion_hallazgos_teoricos.md`, +> `NO-HACER-COMMIT-nota-separacion-alcance-bib2graph.md` (frontera bib2graph ↔ producto), +> `04-direccion-ia-in-the-loop.md`, `07-frontend-tool-for-thought.md`. + +--- + +## TL;DR + +No hay **un** nombre canónico que cubra todo bib2graph: hay **cuatro tradiciones de software +que convergen sobre el mismo principio a distinta granularidad**. El banner más preciso y +defendible: + +> **"Reproducibilidad direccionada por contenido aplicada al trabajo de conocimiento"** +> — en su forma operativa: **un *build system hermético* para la revisión de literatura, con +> núcleo funcional puro y CLI como API para agentes.** + +El principio único que ata las cinco piezas: + +> **transformación determinista (pura) + identidad por hash del contenido (input, transformación, +> entorno) + reuso/invalidación por esa clave.** + +Es, literalmente, lo que afirman Bazel y Nix para el *build* de software. bib2graph **traslada +ese patrón —maduro y formalizado— al artefacto de la revisión bibliográfica**, tomando el +`corpus_hash` como la *derivation/action key* de una revisión. + +Frase de arquitectura para tener a mano: + +> **bib2graph = Functional Core (Arrow puro) → Service Layer neutral de transporte → +> Ports & Adapters para N transportes, con identidad del corpus direccionada por contenido y +> procedencia append-only.** +> FCIS nombra el *centro*; Hexagonal nombra el *borde*; el build hermético nombra la +> *garantía*; "tools for thought determinista" nombra el *propósito*. + +--- + +## 1. El marco unificador (las cuatro tradiciones que convergen) + +Ninguna alcanza sola — y conviene nombrarlas juntas (síntesis de Yevtushenko: los patrones son +"suspiciously similar"; *"Ports and Adapters do not clarify how core is implemented, while +Functional Core - Imperative Shell does not clarify how shell should look like"*): + +- **Functional Core, Imperative Shell** (Bernhardt) → la **naturaleza del centro**: puro, + valor→valor. "Núcleo puro sobre tablas Arrow" es el functional core literal; los DataFrames + Arrow son los *"simple values as boundaries"*. +- **Hexagonal / Ports & Adapters** (Cockburn) → la **forma del borde**: puertos (Protocols: + `Source`/`Store`/`Projector`/`Enricher`) y adaptadores intercambiables. Intent canónico de + Cockburn: *"Allow an application to equally be driven by users, programs, automated test or + batch scripts"* = la promesa "muchos transportes (CLI/API/MCP) sobre el mismo servicio". +- **Build hermético / content-addressing** (Nix, Bazel) → la **garantía**: mismo input ⇒ mismo + output ⇒ mismo hash. +- **Unix-for-agents** (encuadre 2025–2026) → el **vocabulario externo legitimador**: la + herramienta determinista es la *seam* (costura) entre la capa no-determinista (el + planificador/LLM) y la determinista (el ejecutor). + +--- + +## 2. Los 5 pilares + +### Pilar 1 — Arquitectura de núcleo puro (la forma del código) + +- **Autores/obras:** Functional Core, Imperative Shell (Gary Bernhardt, *Boundaries*, SCNA + 2012); Hexagonal / Ports & Adapters (Alistair Cockburn, 2005); Clean/Onion; Repository + + Service Layer + Unit of Work (Percival & Gregory, *Architecture Patterns with Python* / + cosmicpython). +- **Cita ancla:** *"The shell can call the core, but the core cannot call the shell"* (Kenneth + Lange, fiel a Bernhardt). Core = "immutable values and pure functions"; shell = "side-effectful, + imperative stuff". +- **Cómo sostiene a bib2graph:** el motor se testea con valores (Arrow in → Arrow out), **sin + mocks**; los Protocols son los *puertos* en versión Python; el `Store` ≈ Repository/UoW con + log inmutable; la capa `service/` es el Service Layer agnóstico de transporte; "CLI = API para + agentes" es un *primary adapter* cuyo puerto es el protocolo JSON/exit-code. **"Sin IA + generativa" cae por la regla de dependencia:** lo no-determinista es shell/adaptador, nunca core. + +### Pilar 2 — Build systems herméticos (el sustento del determinismo) + +- **Autores/obras:** build hermético (Bazel); gestión funcional de paquetes (Nix, tesis de + Dolstra *"The Purely Functional Software Deployment Model"*); caching causal de pipelines (Koji, + arXiv 1901.01908); caching en experimentos de IR (arXiv 2504.09984); dbt (DAG incremental). +- **Cita ancla:** Bazel — *"a hermetic build system always returns the same output by isolating + the build from changes to the host system"*; y el supuesto que lo habilita (IR 2504.09984): + *"the same input will yield the same output"*. +- **Cómo sostiene a bib2graph:** el `corpus_hash` es **el *store path* de Nix / la *action key* + de Bazel** — identidad por contenido, no por ubicación ni timestamp. **[CALIBRACIÓN as-built + → §2-bis: la *identidad* por contenido es real (`backends/memory.py:65-99`); pero el + *reuso/cache-hit* por esa clave —lo que hace de Bazel/Nix un *build system*— NO está + construido: el código detecta staleness (`is_networks_cache_stale`) y **siempre recomputa**.]** + La frontera hermética + (Protocols, CLI stateless) aísla el efecto del núcleo determinista. **Caveat decisivo (IR):** el + no-determinismo (GPU/LLM) **rompe** el supuesto de pureza que habilita el cache por hash; + mantener el motor determinista *es la condición* para que el direccionamiento por contenido sea + sólido. + +### Pilar 3 — Procedencia e inmutabilidad (identidad ≠ tiempo) + +- **Autores/obras:** Datomic / "database as a value" (Rich Hickey); Event Sourcing + CQRS (Greg + Young / Fowler); Merkle DAG y content-addressing (Git, IPFS); W3C PROV (PROV-DM/O/N), con + extensiones ProvONE y ProvCaRe. +- **Cita ancla:** IPFS — *"Any change in a node would alter its identifier and thus affect all + the ascendants in the DAG, essentially creating a different DAG"* y *"two nodes with the same + CID univocally represent exactly the same DAG"*. Datomic: la base "accumulates facts, rather + than updates places, and... the past is immutable". +- **Cómo sostiene a bib2graph:** el `corpus_hash` es **content-addressing Merkle aplicado al + corpus** ("mismo `corpus_hash` ⇒ misma revisión reproducible") — convierte la reproducibilidad + en **propiedad estructural, no en promesa**. La procedencia append-only es Datomic/Event + Sourcing: no se edita, se **acreta**; el workspace en un `corpus_hash` dado es un *valor + inmutable* consultable *as-of*. W3C PROV es el vocabulario para **expresar** esa procedencia + hacia afuera (Entity = registro/nodo, Activity = `enrich`/`project`, Agent = `Source`/`Enricher`). +- **[CALIBRACIÓN as-built → §2-bis]** Tres matices que el código obliga a precisar: (1) el + `corpus_hash` es un **sha256 plano** de la tabla serializada (`backends/memory.py:65-99`) — + *content-addressed*, **no** un Merkle DAG (no hay composición jerárquica de hashes); (2) la + **procedencia** sí es append-only (`_merge_provenance`), pero el **corpus** se **reemplaza** + (`overwrite_corpus`, DELETE+INSERT), no se acreta; (3) **no hay query *as-of***: el "valor + inmutable en un `corpus_hash`" se materializa por **snapshot parquet congelado**, no por viaje + temporal estilo Datomic. +- **[INCIERTO]** el wording exacto de las relaciones PROV (`wasGeneratedBy`, `used`, + `wasDerivedFrom`, `wasAttributedTo`) y la cita literal de Hickey ("a fact... cannot be updated, + only superseded") **no se verificaron contra fuente primaria** — confirmar antes de citar textual. + +### Pilar 4 — Herramientas para agentes (la CLI como contrato) + +- **Autores/obras:** Jim Clark/Docker ("MCP: tools for agents, not API"); Ugo Enyioha (8 + principios de CLI-para-agentes); Anthropic ("Code execution with MCP"); Deepak Babu Piskala + (arXiv 2601.11672, filesystem como sustrato unificador); Jannik Reinhard (CLI vs MCP, eficiencia + de tokens). +- **Cita ancla:** Clark — *"Treat tools as deterministic executors, treat agents as planners and + evaluators"* (reglas: "deterministic, idempotent, fail closed, machine-checkable outcomes"). + Enyioha: *"If a human would use a CLI for it, the agent should too."* +- **Cómo sostiene a bib2graph:** la *seam* determinista/no-determinista de Clark **es** la + frontera bib2graph (ejecutor) ↔ producto-con-IA (planificador). Los principios de Enyioha (JSON + a stdout, exit codes con semántica fija, idempotencia, dry-run) mapean **1:1** con "CLI = API + para agentes" y con el trabajo ya hecho (ADR 0037/0038, `--json` unificado #151/#168): + **bib2graph no sigue una moda, implementa el patrón canónico.** Anthropic respalda "filtrar/ + transformar datos en código determinista antes de que lleguen al modelo" = el núcleo Arrow puro. + Piskala da respaldo académico al "estado durable en archivos" (workspace + `corpus_hash`), no en + la conversación. Reinhard aporta el "determinismo aprendido" (modelos entrenados en miles de + millones de líneas de terminal) y datos de eficiencia (hasta ~35× menos tokens que MCP). + +> **[CALIBRACIÓN as-built → §2-bis]** El mapeo con Clark es 1:1 en **tres** de sus cuatro +> atributos —*deterministic*, *idempotent*, *machine-checkable*— pero **no en *fail closed***: +> el CLI es *fail-open advisory* (`status.readiness` avisa; `cycle.py` permite las transiciones +> igual; ningún comando bloquea). Y **no es un descuido**: es decisión de diseño (un gate duro +> mataría el demo y la autonomía del agente, ADR 0021), con su antídoto ya teorizado en la +> **Nota 27** (el *recibo* `crossed_red` que vuelve cicatriz el cruce silencioso). Además, +> `--dry-run` existe **solo** en `chain --preview`, no como principio genérico del CLI. + +### Pilar 5 — Tools for thought determinista (el propósito) + +- **Autores/obras:** Engelbart ("Augmenting Human Intellect", 1962); Matuschak & Nielsen ("How + can we develop transformative tools for thought?"); Matuschak ("sciences of the artificial" de + Simon); marimo (notebook reactivo como DAG); ASReview LAB v.2 (PMC12416088). +- **Cita ancla:** marimo — *"reproducible by default"*, *"no hidden state"*, *"deterministic + execution"* (vía análisis estático, "possible for us to implement with 100% correctness"). + Matuschak & Nielsen: "insight through making", combinar el **rigor** de la investigación con la + iteración de producto. +- **Cómo sostiene a bib2graph:** ubica a bib2graph en el linaje Engelbart/Matuschak-Nielsen, pero + en la **rama determinista del oficio** — materializa la mitad "rigor" del loop que casi nadie + cierra. **marimo es el isomorfismo técnico directo:** *"reproducible by default, not by + discipline"* es casi literal para el pitch. **ASReview es el "vecino honesto":** comparte + transparencia, procedencia y humano-en-el-centro, pero su núcleo es **ML probabilístico** (active + learning) y por eso solo logra resultados *"identical OR near-identical"*; bib2graph se diferencia + por **determinismo duro garantizado por content-addressing**. + +--- + +## 2-bis. Calibración contra el código (auditoría as-built, 2026-06-28) + +> Antes de que esto cuaje en ADR/ensayo (§7), se auditó el **código real** (`src/bib2graph/`) +> contra las afirmaciones falsables del §2 — el ejercicio que pide la Nota 27 (el *functor +> honesto*): nombrar dónde el discurso cruza una frontera en silencio. **Veredicto: el espinazo +> se sostiene en el código; el vocabulario prestado de Nix/Bazel/Datomic/Clark estira en tres +> puntos.** Esto es lo que hay que decir con precisión para que el ensayo sea a prueba de `grep`. + +| Pilar | As-built | Qué sostiene el código | Dónde el vocabulario estira | +|---|---|---|---| +| **1 — Núcleo puro** | ✅ cumple | regla de dependencia real (el núcleo importa sin `duckdb`/`click`/`fastapi`); funciones puras Arrow→Arrow; `service/` sin transporte; CLI de 3 capas | menor: `Preprocessor` es clase concreta, no `Protocol` (5/6 puertos sí lo son) | +| **2 — Build hermético** | ⚠️ parcial | `corpus_hash` por contenido, excluye timestamps y `resolution` (`backends/memory.py:65-99`) | **no hay reuso/invalidación por la clave**: detecta staleness y avisa, pero **siempre recomputa**. Es un *staleness checker*, no un build system con cache-hit | +| **3 — Procedencia / inmutabilidad** | ⚠️ parcial | procedencia **append-only** real (`_merge_provenance`) | `corpus_hash` = **sha256 plano** (no Merkle DAG); el **corpus se reemplaza** (DELETE+INSERT), solo la procedencia acreta; **no hay `as-of` query**, solo snapshots congelados | +| **4 — CLI para agentes** | ⚠️ mayormente | JSON-stdout puro, exit codes 0–5 tipados, idempotencia, stateless (`service/envelope.py`, `service/errors.py`) | **"fail closed" NO se cumple**: es *fail-open advisory* (`cycle.py` transiciones permisivas). `--dry-run` solo en `chain --preview`, no genérico | +| **5 — Determinista, sin IA generativa** | ✅ cumple | cero imports de LLM; scent bibliométrico determinista; Louvain seedeado del hash; reloj en la frontera | — | + +**Las tres calibraciones para el ensayo (frases defendibles, no aspiracionales):** + +1. **Pilar 2** → "corpus **direccionado por contenido** con **detección de staleness**", no + "build system con reuso". El cache-hit por hash (estilo Bazel/Nix) es **roadmap, no as-built**: + la identidad por contenido es real; el *reuso* por contenido no está construido. +2. **Pilar 3** → "hash **plano** content-addressed" (no Merkle DAG) + "**corpus replace / + procedencia append-only**" (híbrido honesto, no inmutabilidad pura) + "viaje en el tiempo + **por snapshots**, no `as-of` query (no es Datomic)". +3. **Pilar 4** → "ejecutor determinista + idempotente + **verificación *advisory* en la + frontera**", **no** "fail closed". Acá la nota se ata sola con la **Nota 27**: el *fail-open* + **es decisión de diseño** (un gate duro mataría el demo y la autonomía del agente, ADR 0021), + y su antídoto honesto ya está teorizado —el **recibo** (`crossed_red`) que vuelve cicatriz el + cruce silencioso. El marco **ya es consciente de su propia grieta**; solo el Pilar 4 la + enunciaba con demasiada confianza al pegarle el "fail closed" de Clark. + +**Lo que esto NO toca:** el espinazo —Functional Core + determinismo duro + sin IA generativa + +identidad por contenido + CLI-as-API— **es real y verificable con `archivo:línea`**. Es ~80% del +marco y se sostiene. Lo que sobra es analogía prestada que promete máquinas (cache-hit, `as-of` +query, gate duro) que son roadmap o decisión-contraria-deliberada — no as-built. + +--- + +## 3. Prior art y huecos (honesto) + +**Quién está cerca en cada eje:** + +- **Arquitectura (FCIS + Hexagonal + Service Layer):** *cosmicpython* (Percival & Gregory) es la + referencia Python de facto del esqueleto Repository+UoW+Service Layer+Ports&Adapters — lo más + cercano al andamiaje de bib2graph. **Pero su core es un domain model OO (clases ricas), NO un + functional core columnar sobre Arrow.** `ruiconti/cosmic` une FCIS+hexagonal+CQRS+DDD en una + webapp (prueba de concepto de la fusión exacta, pero web/CQRS, no batch determinista ni Arrow). +- **Build hermético / content-addressing:** Nix/Guix y Bazel/Buck tienen el patrón completamente + formalizado, *en software*. En datos/ML: dbt (DAG + incremental + manifest), Koji (1901.01908), + pyterrier-caching/IR (2504.09984). DVC/Pachyderm/lakeFS acercan content-addressing a datasets + **[INCIERTO: no verificados en esta sesión]**. +- **Procedencia inmutable:** Datomic es la implementación canónica de "accretion-only + tiempo + first-class" (DB de propósito general, no open-source, no apunta a reproducibilidad científica). + IPFS/Git/Merkle DAGs: content-addressing maduro a nivel de blobs. ProvONE/ProvCaRe y workflows + científicos (Taverna, VisTrails, Kepler): provenance para reproducibilidad, sobre pipelines + genéricos. +- **CLI-para-agentes:** Claude Code, Cursor y agentes CLI-nativos hacen la filosofía, pero son + agentes de código genéricos, no motores de dominio. `git`/`docker`/`gh`/`jq` son prior art del + *patrón*, no del *contenido*. +- **Tools for thought / dominio bibliométrico:** notas enlazadas (Roam/Obsidian/Tana) sin motor + determinista; notebooks reactivos (marimo, linaje Observable) con motor pero genéricos; revisión + sistemática (ASReview, Rayyan, Covidence) con núcleo ML/manual; mapeo de citas (Connected Papers, + ResearchRabbit, Inciteful, Litmaps) que usan métodos bibliométricos/de red y "generally don't use + language models" **[INCIERTO: vía búsqueda, no fetch directo]**, pero son SaaS cerrados, sin + workspace local durable, sin `corpus_hash`, sin procedencia append-only, exploratorios más que + pipeline reproducible. + +**El hueco que ocupa bib2graph** (consistente en los cinco reportes): nadie combina, +**específicamente para revisión de literatura**, las cuatro propiedades a la vez: + +1. motor **100% determinista** (no ML, no generativo); +2. corpus como **unidad durable direccionada por contenido** (`corpus_hash`); +3. **procedencia append-only** auditable; +4. **CLI como API para agentes** (subprocess/JSON/exit-codes/stateless). + +Cada actor existente cae en una sola canasta: el ecosistema funcional-puro asume OO; el ecosistema +dataframe asume scripts imperativos sin puertos; el mundo PROV tiene el vocabulario pero rara vez +la garantía estructural por hash; Datomic/IPFS tienen la garantía estructural pero no el encuadre +de revisión de literatura; las tools-for-thought son notas (sin motor), notebooks (genéricos) o +revisión con ML (probabilística). + +> **"Make/Nix para una revisión de literatura" — un tools-for-thought determinista bibliométrico — +> está vacante.** No se encontró prior art que lo nombre así. + +**Honestidad sobre lo que NO es nuevo:** el patrón build-hermético, el content-addressing y la +CLI-para-agentes están todos formalizados y maduros *en sus dominios de origen*. **El aporte de +bib2graph es la composición y el traslado de dominio, no la invención de las piezas.** Matiz +narrativo: el discurso 2025-2026 sobre herramientas-para-agentes es **ingenieril** (tokens, +determinismo), **no epistémico**; el ángulo "antídoto al sesgo del related work" (#187) **no +aparece en ninguna fuente** — es diferencial narrativo propio, no respaldo externo. +**[INCIERTO:** si existe un proyecto académico bibliométrico que ya adopte explícitamente el +contrato CLI-para-agentes; no apareció.] + +--- + +## 4. Dónde nos paramos (frases-ancla, precisas y defendibles) + +1. **bib2graph es un *build system hermético para la revisión de literatura*:** el `corpus_hash` + direccionado por contenido es a un corpus lo que el *store path* de Nix o la *action key* de + Bazel son a un build — mismo contenido, mismo grafo, verificable. *(matiz as-built §2-bis: la + **identidad** por contenido es real; el **reuso/cache-hit** por contenido —lo que completa la + analogía con el build— es roadmap, no as-built.)* +2. **El determinismo no es una promesa de proceso sino una propiedad estructural:** porque el + núcleo son funciones puras sobre tablas Arrow, mismo input ⇒ mismo output ⇒ mismo hash. + *"Reproducible by default, not by discipline"* (en el sentido de marimo). +3. **La IA generativa queda fuera del motor por arquitectura, no por preferencia:** lo + no-determinista rompe el supuesto de pureza que habilita el direccionamiento por contenido, así + que el LLM es siempre adaptador/planificador, nunca núcleo (la *seam* de Clark). +4. **La procedencia se acreta, no se sobrescribe:** identidad ≠ tiempo (Datomic/Merkle/Event + Sourcing) — el workspace en un `corpus_hash` dado es un valor inmutable y auditable; siempre se + puede responder "¿de dónde salió este nodo o arista?". *(matiz as-built §2-bis: la + **procedencia** se acreta; el **corpus** se reemplaza; el "valor inmutable" se materializa por + **snapshot**, no por `as-of` query.)* +5. **La CLI es la API:** contrato estable (JSON a stdout, exit codes, idempotencia, stateless) para + que un agente la componga como compone `git` o `docker` — bib2graph implementa el patrón canónico + "tools for agents, not API", no una moda. + +--- + +## 5. Fuentes (consolidadas, por tema) + +**Tema 1 — Arquitectura núcleo puro** +- https://alistair.cockburn.us/hexagonal-architecture +- https://www.destroyallsoftware.com/talks/boundaries +- https://kennethlange.com/functional-core-imperative-shell/ +- https://dev.to/siy/functional-core-with-ports-and-adapters-3m0g +- https://github.com/cosmicpython/book/blob/master/preface.asciidoc +- https://github.com/ruiconti/cosmic +- (`cosmicpython.com/book/preface` → HTTP 403; verificado vía espejo GitHub) + +**Tema 2 — Build systems herméticos** +- https://bazel.build/basics/hermeticity *(leída)* +- https://en.wikipedia.org/wiki/Nix_(package_manager) *(leída)* +- https://arxiv.org/abs/1901.01908 *(abstract leído)* +- https://arxiv.org/html/2504.09984v1 *(leída)* +- https://edolstra.github.io/pubs/phd-thesis.pdf **[INCIERTO: referenciada, no fetcheada]** +- https://www.getdbt.com/blog/data-transformation-in-data-warehouse **[INCIERTO: solo búsqueda]** + +**Tema 3 — Procedencia e inmutabilidad** +- https://vvvvalvalval.github.io/posts/2018-11-12-datomic-event-sourcing-without-the-hassle.html +- https://www.infoq.com/articles/Datomic-Information-Model/ +- https://docs.ipfs.tech/concepts/merkle-dag/ +- https://blogs.ncl.ac.uk/paolomissier/2021/02/07/w3c-prov-some-interesting-extensions-to-the-core-standard/ + +**Tema 4 — Herramientas para agentes** +- https://www.docker.com/blog/mcp-misconceptions-tools-agents-not-api/ +- https://dev.to/uenyioha/writing-cli-tools-that-ai-agents-actually-want-to-use-39no +- https://www.anthropic.com/engineering/code-execution-with-mcp +- https://arxiv.org/html/2601.11672v1 +- https://jannikreinhard.com/2026/02/22/why-cli-tools-are-beating-mcp-for-ai-agents/ +- https://www.eficode.com/blog/unix-principles-guiding-agentic-ai-eternal-wisdom-for-new-innovations **[INCIERTO: no fetcheada en profundidad]** + +**Tema 5 — Tools for thought determinista** +- https://numinous.productions/ttft/ +- https://andymatuschak.org/sdac/ +- https://pmc.ncbi.nlm.nih.gov/articles/PMC12416088/ (ASReview LAB v.2) +- https://marimo.io/blog/dataflow +- https://github.com/marimo-team/marimo +- https://onlinelibrary.wiley.com/doi/10.1111/ijmr.12381 **[INCIERTO: no fetcheada]** +- http://musingsaboutlibrarianship.blogspot.com/2024/06/all-about-citation-chasing-and-tools.html **[INCIERTO: no fetcheada]** + +--- + +## 6. Pendientes de verificación (antes de citar textual o graduar a ADR) + +> El lado **código** de los §2 ya se auditó contra `src/bib2graph/` (2026-06-28) → ver **§2-bis**. +> Lo de abajo son los pendientes **bibliográficos** (citas textuales y prior art). + +- Wording literal de las relaciones **W3C PROV** contra la spec PROV-DM. +- Cita textual de **Hickey** ("a fact... cannot be updated, only superseded") contra la charla + *The Database as a Value*. +- **DVC/Pachyderm/lakeFS** como content-addressing de datasets (no verificados aquí). +- Tesis de **Dolstra** (leer la fuente primaria) y página de **dbt**. +- Que **Connected Papers / ResearchRabbit / Inciteful / Litmaps** "no usan LLM" (vía Aaron Tay, + sin fetch directo). +- Buscar prior art académico bibliométrico que ya adopte el **contrato CLI-para-agentes**. + +--- + +## 7. Próximo paso sugerido (no ejecutado) + +Si esto cuaja como rumbo y no solo como mapa: candidato a **graduar un ADR** que fije el +posicionamiento ("bib2graph = build hermético para revisión de literatura") y/o un ensayo +(Medium) reusando el §4. Antes, cerrar el §6. Nota primero — esto es el mapa, no la decisión. diff --git a/docs/decisiones/0005-dependencias-extras.md b/docs/decisiones/0005-dependencias-extras.md index 495b5d0..31c555a 100644 --- a/docs/decisiones/0005-dependencias-extras.md +++ b/docs/decisiones/0005-dependencias-extras.md @@ -3,6 +3,10 @@ - **Estado:** Aceptada - **Fecha:** 2026-06-14 - **Relacionada con:** [0002](0002-modelo-agnostico-backend.md), [0003](0003-persistencia-opcional.md), [0004](0004-enriquecimiento-opcional.md) +- **Núcleo reencuadrado (pandas→Arrow) por [0006](0006-tabla-canonica-y-networkspec.md):** el + cuerpo lista `pandas` en el «Núcleo (siempre)»; la tabla canónica pasó a **Arrow/`pyarrow`** + (0006), así que `pandas` ya no es la dependencia de núcleo que describe el cuerpo. Ese listado + queda como historia. ## Contexto diff --git a/docs/decisiones/0013-identidad-hash-merge-corpus.md b/docs/decisiones/0013-identidad-hash-merge-corpus.md index ec82a11..27d9477 100644 --- a/docs/decisiones/0013-identidad-hash-merge-corpus.md +++ b/docs/decisiones/0013-identidad-hash-merge-corpus.md @@ -16,6 +16,13 @@ `DuckDBBackend` en SQL `UPDATE`/`MERGE` por `id`). El `corpus_hash` (D2) se computa siempre sobre el contenido (`corpus.to_arrow()`), nunca sobre detalles del backend. D4 (`provenance` como log append-only), D5/D6 (Manifest) no cambian. +- **Precedencia de D1 invertida (2026-06-22, AS-BUILT 0.8) por + [0036](0036-identidad-source-id-agnostica-doi-ancla.md):** la precedencia de la fuente del + `valor` del `id` (D1) deja de ser `openalex_id`-first y pasa a **`doi:` > `source_id` (`src:`) > + `tt:`**: el DOI es el ancla universal y `openalex_id` se renombra a `source_id` genérico (motor + de extracción intercambiable, tabla lateral `external_ids`). El cuerpo de D1 (más abajo) describe + la precedencia **original** (`oa:`/`openalex_id`-first) y **queda como historia**; el AS-BUILT es + `_compute_id` en `corpus.py` (`doi` > `source_id` > `title|year`). D2/D3/D4 no cambian. ## Contexto diff --git a/docs/decisiones/0021-cli-agente-native-contrato.md b/docs/decisiones/0021-cli-agente-native-contrato.md index c3147a6..d078eea 100644 --- a/docs/decisiones/0021-cli-agente-native-contrato.md +++ b/docs/decisiones/0021-cli-agente-native-contrato.md @@ -14,6 +14,12 @@ - **Toca:** [0009](0009-biblioteca-viva-duckdb.md) (el estado vive en el archivo `.duckdb`, no en la sesión), [0020](0020-metodo-forrajeo-scent-filtros-reject.md) (comando `filter` y los filtros que marcan `rejected`). +- **Superficie consolidada (12→10 verbos) por [0037](0037-superficie-cli-10-verbos-ciclo.md) y + [0038](0038-destino-verbos-huerfanos-0037.md):** el cuerpo y sus enmiendas hablan de **11/12 + subcomandos**; la superficie 0.10.0 se consolida a **10 verbos agents-first** (`monitor`/`inspect`/ + `networks` absorbidos; `curate`/`read` noun-verb; aliases de retrocompat cierran en 0.11.0). El + **envelope `schema="1"`, los exit codes (§D) y la FSM (§F) quedan intactos**. El conteo de + subcomandos del cuerpo queda como historia. ## Contexto diff --git a/docs/decisiones/0023-capa-constants-modelos-schema.md b/docs/decisiones/0023-capa-constants-modelos-schema.md index 62a7c93..5c19acd 100644 --- a/docs/decisiones/0023-capa-constants-modelos-schema.md +++ b/docs/decisiones/0023-capa-constants-modelos-schema.md @@ -66,3 +66,15 @@ Se **mantiene** "`Paper`/`Author`/… = vistas derivadas, no tipos del modelo". > doble verdad: `kind: NetworkKind` (`spec.py`), y `facade._projector_for_kind` compara contra los > miembros del enum (`NetworkKind.BIBLIOGRAPHIC_COUPLING`, …) en vez de string-literals. **`NetworkKind` > es ahora la fuente única real** (no validada por test de paridad: validada por el type-checker). +> +> **AS-BUILT (enmienda, 2026-06-22) — la dirección de autoridad del schema (§3) es la INVERSA.** El +> §3 de la Decisión declara **`PaperRow` (Pydantic) autoritativa** y dice que `CORPUS_SCHEMA` (Arrow) +> se "**deriva/verifica**" de ella. El AS-BUILT invierte la autoridad: **`CORPUS_SCHEMA` (Arrow) es la +> definición autoritativa** y **`PaperRow` se alinea campo a campo**. De las dos vías que el §3 +> mencionaba, el AS-BUILT conserva la **verificación** y descarta la **derivación**: el invariante "no +> driftean" se sostiene por **paridad verificada por test** (`assert_schema_parity()` en `schemas.py`, +> que falla si los nombres/orden de campo divergen — comentario explícito: "`CORPUS_SCHEMA` sigue +> siendo la definición Arrow autoritativa; `PaperRow` se alinea"), no por generar uno desde el otro. +> **El fin anti-drift del §3 se cumple** (una sola verdad, imposible de driftear sin que falle el +> test/type-check); lo que cambia es la *dirección* de autoridad (`PaperRow` → `CORPUS_SCHEMA`). El +> texto del §3 queda como historia. diff --git a/docs/decisiones/0041-documentacion-por-superficie-de-entrega.md b/docs/decisiones/0041-documentacion-por-superficie-de-entrega.md new file mode 100644 index 0000000..ad24892 --- /dev/null +++ b/docs/decisiones/0041-documentacion-por-superficie-de-entrega.md @@ -0,0 +1,192 @@ +# 0041 — Organizar la documentación por superficie de entrega (no por tipo de lector): dos superficies + un mediador + +- **Estado:** Aceptada +- **Fecha:** 2026-06-29 +- **Decidido por:** **Product Owner humano** (decisión acordada 2026-06-29). Las decisiones + concretas —**no** forkear el sitio mkdocs por audiencia y mantener Diátaxis; publicar un + **`llms.txt`** en la raíz del sitio como puerta para IA externa; usar la persona como **veneer de + navegación** (tres puertas por intención hacia un mismo cuerpo); y **subir `AGENTS.md` al nav**— + son **decisiones del PO**. El **encuadre** —*"la documentación se organiza por **superficie de + entrega**, no por tipo de lector: los tres usuarios no son tres árboles de documentación, son **dos + superficies + un mediador**; y la experiencia del **agente que opera bib2graph** (Claude / ChatGPT + / Minimax, con herramientas + Python) es un objetivo de **primera clase** de la documentación, no un + subproducto"*— es **síntesis de la IA (architect) validada por el PO**. +- **Relacionada con:** [0039](0039-skill-comando-meta-distribucion.md) (la skill de Claude Code es la + **doc operativa** del humano no-técnico mediada por IA; vive **vendoreada en el wheel**, no en el + sitio — este ADR la nombra como **pieza del ecosistema**, no como sección de mkdocs), + [0010](0010-agente-native-columna.md)/[0021](0021-cli-agente-native-contrato.md) (CLI + agente-native: la superficie machine-legible del sitio —Referencia + `llms.txt`— **publica** el + mismo contrato que el CLI expone), + [0037](0037-superficie-cli-10-verbos-ciclo.md)/[0038](0038-destino-verbos-huerfanos-0037.md) (los + 10 verbos del ciclo son lo que la Referencia del CLI autogenerada y el `llms.txt` deben enseñar, + exactos a la versión publicada), + [0040](0040-retiro-gui-local.md) (tras el retiro de la GUI la **única frontera** es la CLI + agente-native; este ADR alinea la documentación con esa frontera). +- **No introduce IA** (coherente con [0022](0022-producto-sin-ia-generativa.md)): es **organización + de documentación**. `llms.txt` es un artefacto **markdown** que una IA cliente lee; bib2graph no + embebe ni invoca ningún modelo. El alcance de este ADR es la **documentación del motor + determinista**, no un producto. +- **No cambia ningún contrato público.** No toca el envelope `schema="1"`, los exit codes ni el FSM + ([0021](0021-cli-agente-native-contrato.md)); no altera `docs/API.md` como contrato (lo **publica** + mejor). Es net-new: ningún ADR gobernaba hasta hoy la **estructura de la documentación**. +- **Origen:** la frontera bib2graph (motor determinista) vs. producto, y la constatación de que + bib2graph lo consumen cada vez más **agentes con herramientas y Python** (Claude Code, ChatGPT, + Minimax) además de humanos. + +## Contexto + +bib2graph lo consumen hoy tres clases de usuario: + +1. Un **humano no-técnico** que interactúa **vía un asistente de IA** (le pide a su agente que use + bib2graph; no escribe comandos a mano). +2. **Una IA que opera el repo o el paquete** (Claude Code dentro del clon; ChatGPT / Minimax fuera de + él, ayudando a alguien que hizo `pip install`). +3. Un **desarrollador** que contribuye a la librería. + +La tentación natural es mapear estos tres usuarios a **tres árboles de documentación** —forkear el +sitio mkdocs en caminos por audiencia—. Eso **duplicaría contenido** (el mismo quickstart contado +tres veces) y generaría **drift**: justo lo que el sitio ya combate con `include-markdown` y fuente +única (`mkdocs.yml` reusa `API.md`, `ARCHITECTURE.md`, los ADRs y los `.md` de raíz; no copia). + +El error del mapeo "un lector = un árbol" es confundir **lector** con **superficie de entrega** —el +canal físico por donde la documentación llega—. Tres lectores no implican tres cuerpos de +documentación; implican distintas **puertas** al **mismo** cuerpo. Cuando se separan las superficies +reales, los tres lectores colapsan en **dos superficies + un mediador**: + +- **Agente DENTRO del repo** (p. ej. Claude Code): lee **`AGENTS.md` y el código fuente**, **no** el + sitio renderizado. mkdocs **no le sirve** a este lector — ya tiene el árbol de archivos. Su puerta + es `AGENTS.md` (canónica, puertas adentro). +- **Agente FUERA del repo** (p. ej. ChatGPT / Minimax ayudando a alguien que hizo `pip install` y + **no** clona el repo, pero tiene **herramientas + Python**): necesita una **puerta publicada y + machine-legible**. **Hoy ese es el hueco real**: no hay un punto de entrada estable, pensado para + una IA, en el sitio público. +- **Humano navegando**: ese sí es el público del **sitio mkdocs**. El desarrollador es un humano + navegando con una intención distinta (contribuir), no una tercera superficie. + +El sitio ya es **Diátaxis** (Empezar/Tutoriales/Guías/Referencia/Explicación, ver `mkdocs.yml` +`nav:`). Diátaxis sirve **a la vez** al humano y a la IA: la sección **Referencia** es por naturaleza +machine-grade (la API de Python por `mkdocstrings`, el CLI por `mkdocs-click`, los contratos en +`API.md`). El problema no es la estructura del sitio; es **la falta de una puerta para la IA externa** +y el riesgo de forkearlo por audiencia. + +## Decisión + +**La documentación de bib2graph se organiza por superficie de entrega: dos superficies (agente dentro +del repo / humano-y-agente navegando el sitio) más un mediador (la puerta machine-legible para la IA +externa). NO se forkea el sitio por audiencia; las tres intenciones de uso entran por puertas de +navegación distintas a un mismo cuerpo Diátaxis.** La **experiencia del agente que opera bib2graph** +(Claude / ChatGPT / Minimax, con herramientas + Python) es un **objetivo de primera clase** de la +documentación. + +### (1) Mantener Diátaxis; no forkear el sitio por audiencia + +La estructura del sitio (Empezar / Tutoriales / Guías / Referencia / Explicación) se **conserva**. +Sirve al humano y a la IA a la vez; la **Referencia** es la cara machine-grade y se mantiene +autogenerada (mkdocstrings + mkdocs-click) para que no derive de la verdad del código. **No** se crea +un árbol "para IA" ni un árbol "para devs" paralelos: sería el quickstart contado tres veces y drift +garantizado. Un edificio, no tres edificios. + +### (2) Publicar `llms.txt` en la raíz del sitio — la puerta de la IA externa + +Se agrega un **`llms.txt`** en la raíz del sitio publicado (`/llms.txt`), siguiendo el estándar +emergente [llmstxt.org](https://llmstxt.org), con un **`llms-full.txt`** opcional para el volcado +extendido. Es la **versión pública** de lo que `AGENTS.md` hace puertas adentro: un mapa conciso, +machine-legible, de qué es bib2graph, cómo se instala, cuál es el ciclo (los 10 verbos del 0037) y +dónde está la Referencia. Cierra el hueco del **agente FUERA del repo**: un ChatGPT / Minimax con +acceso a la web y a Python puede leer `/llms.txt`, entender la superficie y operar el CLI sin clonar. + +**Debe ser derivado, no escrito a mano**: su fuente natural es `AGENTS.md` + la referencia del CLI +autogenerada (mkdocs-click); generarlo en el build evita el drift que un `llms.txt` redactado a mano +reintroduciría. *(El **cómo** generarlo —script/plugin en el pipeline de `mkdocs build`— es trabajo +del `coder`; este ADR fija que existe, dónde vive y de qué se deriva, no la implementación.)* + +### (3) La persona como veneer de navegación, no como fork de contenido + +En `docs/index.md` se ofrecen **tres puertas de entrada por intención** que **enrutan al mismo cuerpo +Diátaxis**: + +- **(a) "Quiero explorar literatura"** → Empezar / Tutoriales / Guías. +- **(b) "Soy una IA y voy a operar bib2graph"** → `llms.txt` + Referencia (CLI/API) + `AGENTS.md`. +- **(c) "Quiero contribuir"** → Contribuir / Arquitectura / ADRs. + +**Tres puertas, un edificio.** La persona vive en la **navegación** (un veneer de enrutamiento), no +en el **contenido** (que sigue siendo único). Ningún cuerpo de texto se duplica: las puertas son +enlaces a las secciones que ya existen. + +### (4) Subir `AGENTS.md` al nav del sitio — la bisagra entre superficies + +`AGENTS.md` hoy **no aparece** en el nav (`mkdocs.yml` lo excluye implícitamente; solo lo ven los +agentes dentro del repo). Se **sube al nav** como **bisagra explícita** entre superficies: +enlazable y citable desde el sitio, vía el mismo patrón `include-markdown` que ya usa +`docs/contributing.md` para `CONTRIBUTING.md` (un shim fino que incluye `../AGENTS.md`). Así la +puerta (b) tiene un destino navegable y el `llms.txt` un ancla pública, sin duplicar la verdad de +`AGENTS.md`. + +### El objetivo de primera clase: cómo operar bib2graph desde una IA + +Este ADR fija como **objetivo de diseño** que un agente con herramientas + Python pueda operar +bib2graph leyendo la documentación. Las dos rutas, explícitas: + +- **Agente DENTRO del repo** (Claude Code) → lee `AGENTS.md` + el código. Ya cubierto; el sitio no le + agrega nada. +- **Agente FUERA del repo** (ChatGPT / Minimax, tras `pip install bib2graph`) → lee **`/llms.txt`** en + el sitio + la **Referencia del CLI** publicada (los 10 verbos del 0037, exactos a la versión) y + corre el ciclo `init→seed→chain→build→read` leyendo `status` como mapa. + +La **skill de bib2graph** ([ADR 0039](0039-skill-comando-meta-distribucion.md)) es la **doc operativa +del humano no-técnico mediada por IA**: vive **vendoreada en el wheel** y se instala con `b2g skill +add`, **no** es una sección del sitio. Es **pieza del ecosistema** de documentación —complementa este +ADR— pero su superficie de entrega es el wheel, no mkdocs. + +## Consecuencias + +**Lo que se gana** + +- **Una sola fuente de verdad con puertas por intención.** Se evita el fork por audiencia y el + quickstart triplicado; el sitio sigue siendo el cuerpo único que `include-markdown` ya garantiza. +- **Se cierra el hueco de la IA externa.** `llms.txt` da a un agente fuera del repo una puerta + estable y machine-legible; deja de depender de "que el modelo adivine" navegando HTML pensado para + humanos. +- **La experiencia del agente queda como objetivo declarado, no accidental.** Las dos rutas + (dentro/fuera del repo) están nombradas; la documentación se diseña para que un agente opere el + CLI, no solo para que un humano lea. +- **`AGENTS.md` deja de ser invisible en el sitio.** Pasa a ser bisagra citable entre superficies, + reusando el patrón de shim que ya existe — sin duplicar contenido. + +**Lo que cuesta** + +- **Mantener `llms.txt` sincronizado.** Es el costo central: un `llms.txt` que enseña verbos que ya + no existen **miente** (mismo riesgo que el 0039 cerró para la skill con el version-lock). Mitigación + obligatoria: **generarlo** del `AGENTS.md` + la referencia del CLI en el build, no a mano. Un + `llms.txt` escrito a mano es drift diferido. +- **Tocar el `nav` y el pipeline de build.** Subir `AGENTS.md` al nav (shim + entrada en `mkdocs.yml`) + y generar `llms.txt` en `mkdocs build` son cambios de **config/build** → trabajo del `coder`; este + ADR los **recomienda y encuadra**, no los implementa. +- **`docs/index.md` gana las tres puertas por intención.** Es trabajo de redacción (documental), no + de duplicación: las puertas enlazan a secciones existentes. +- **Convención de doc nueva que vigilar.** "Superficie de entrega, no tipo de lector" hay que + sostenerla en cada incorporación: la tentación de forkear por audiencia volverá; este ADR es el + ancla para rechazarla. + +## Alternativas + +- **Forkear el sitio mkdocs en tres caminos por audiencia** (humano / IA / dev). **Descartada:** + triplica el contenido (mismo quickstart tres veces), reintroduce el drift que `include-markdown` y + la fuente única combaten, y confunde **lector** con **superficie de entrega**. Tres lectores no son + tres edificios; son tres puertas al mismo edificio. +- **Abandonar Diátaxis por una estructura "agents-first" propia.** **Descartada:** Diátaxis ya sirve a + humano e IA a la vez —la Referencia es machine-grade por construcción— y es un estándar reconocible. + Reinventar la estructura perdería esa legibilidad sin resolver el hueco real (la puerta para IA + externa), que `llms.txt` cubre sin tocar la estructura. +- **No publicar `llms.txt`; confiar en que la IA externa navegue el HTML.** **Descartada:** deja el + hueco abierto. Un sitio HTML pensado para humanos es un mal punto de entrada para un agente sin + contexto; `llms.txt` es el estándar emergente justamente para esto y es **derivable** de fuentes que + ya mantenemos. +- **Escribir `llms.txt` a mano.** **Descartada:** reintroduce el drift que todo el sitio combate (un + `llms.txt` que enseña una superficie vieja miente, igual que una skill desfasada en el 0039). Debe + **generarse** de `AGENTS.md` + la referencia del CLI; si hoy no hay generador, el `coder` lo + construye antes de publicarlo. +- **Documentar la operación-por-IA solo en la skill (0039) y no en el sitio.** **Descartada:** la + skill cubre al **humano no-técnico con Claude Code**; **no** cubre al agente externo (ChatGPT / + Minimax) ni a quien no instala la skill. La puerta pública del sitio (`llms.txt` + Referencia) y la + skill son **complementarias**, no sustitutas: distintas superficies de entrega del mismo motor. diff --git a/docs/decisiones/0043-posicionamiento-agent-native-cli.md b/docs/decisiones/0043-posicionamiento-agent-native-cli.md new file mode 100644 index 0000000..863f678 --- /dev/null +++ b/docs/decisiones/0043-posicionamiento-agent-native-cli.md @@ -0,0 +1,183 @@ +# 0043 — bib2graph implementa deliberadamente el contrato CLI-para-agentes: las relajaciones de trust son por bajo blast radius; tres grietas son roadmap explícito + +- **Estado:** Aceptada +- **Fecha:** 2026-06-30 +- **Decidido por:** mixto. Las decisiones de fondo —**(1)** ratificar que el CLI `b2g` + **implementa deliberadamente** el contrato CLI-para-agentes (postura de diseño, no accidente), + **(2)** declarar que las relajaciones de los principios de *trust & safety* (4–7) son **decisión + por bajo blast radius**, no huecos, y **(3)** nombrar tres grietas como **roadmap reconocido** sin + resolverlas en este ADR— son **decisiones del Product Owner humano**. El **encuadre** que las + ordena —la auditoría del CLI contra el *Rubric for Agent-Native CLI Design* (nueve principios), + separando *hueco* de *decisión de diseño*— es **síntesis de la IA (architect) validada por el PO**. +- **Extiende [0021](0021-cli-agente-native-contrato.md)** (Contrato del CLI agente-native). 0021 fijó + el **contrato concreto** (set de subcomandos, envelope `schema="1"`, exit codes 0–5 por tipo de + excepción, estado en el archivo y no en la sesión). Este ADR **no cambia ese contrato**: lo + **ratifica como postura de diseño explícita** y le agrega dos capas que 0021 no declaraba — el + *porqué* de las relajaciones de trust y la *deuda de roadmap* nombrada. Es un ADR-paraguas de + **posicionamiento** anclado en 0021, no una enmienda que toque el envelope, los exit codes ni la FSM. +- **Relacionada con:** [0010](0010-agente-native-columna.md) (la CLI agente-native como **columna + primaria** — este ADR explicita la postura que 0010 fijó como principio), + [0037](0037-superficie-cli-10-verbos-ciclo.md)/[0038](0038-destino-verbos-huerfanos-0037.md) (la + superficie de **10 verbos** del ciclo; la grieta (9) abajo se resuelve, si se aborda, como **comando + meta fuera de los 10** —patrón de [0039](0039-skill-comando-meta-distribucion.md)—, no como 11° verbo + del ciclo), [0039](0039-skill-comando-meta-distribucion.md) (precedente de comando meta auto-descriptivo + fuera del ciclo), [0041](0041-documentacion-por-superficie-de-entrega.md) (`docs/API.md` y el `llms.txt` + **publican** el mismo contrato que este ADR posiciona; la grieta (9) reduciría el *hop* a la doc en prosa). +- **No introduce IA** (coherente con [0022](0022-producto-sin-ia-generativa.md)): es **postura de + diseño y deuda declarada** sobre un CLI determinista. bib2graph no embebe ni invoca ningún modelo; + el "para agentes" describe al **consumidor** del contrato (un LLM por subprocess + JSON), no una + capacidad generativa del motor. +- **No cambia ningún contrato público.** El envelope `schema="1"`, los exit codes 0–5 y la FSM del + ciclo ([0021](0021-cli-agente-native-contrato.md)/[0016](0016-maquina-estados-lazo.md)) quedan + **intactos**. Las tres grietas, si se abordan, lo hacen de forma **aditiva** (campos nuevos en `data`, + un `error.subcode`, un comando meta) — cada una **exige su propio ADR/issue** antes de tocar `API.md`. +- **Origen:** unificación de **dos auditorías independientes** (PO + un agente) del CLI `b2g` contra + el *Rubric for Agent-Native CLI Design*, reconciliadas **contra el código** (verificadas as-built + con `archivo:línea`). Encuadre empírico de uso real: un agente que, ante un error de red opaco, + **abandonó la CLI y pegó directo contra OpenAlex con `urllib`**, perdiendo la procedencia que es la + razón de ser de la herramienta. *(Las notas de auditoría son trabajo local; este ADR se sostiene + solo: las afirmaciones falsables van ancladas con `archivo:línea`.)* + +## Contexto + +El ADR [0010](0010-agente-native-columna.md) fijó el **principio** ("la CLI agente-native es +superficie primaria") y el [0021](0021-cli-agente-native-contrato.md) fijó el **contrato concreto**. +Lo que **ninguno de los dos registró** es una cosa que en la práctica ya está decidida y conviene +volver inmutable: que ser *agent-native* es una **postura de diseño deliberada y verificable**, no un +subproducto del estilo de implementación — y, sobre todo, **dónde el contrato deliberadamente se +relaja y por qué**. + +Una auditoría del CLi contra los nueve principios de un rubric de diseño agent-native (legibilidad · +trust & safety · composabilidad/estabilidad) arrojó, verificado as-built: + +- **Legibilidad (1–3): sólida.** Salida estructurada por un único envelope versionado + (`{schema, ok, command, exit_code, data, warnings, error}`, `ENVELOPE_SCHEMA_VERSION = "1"`, + `service/envelope.py:26`), una sola flag de salida estructurada (`--json`, `cli/_options.py:85`; o + `B2G_JSON` por entorno), y exit codes 0–5 mapeados por tipo de excepción con una función pura + (`service/errors.py:71-97`). **Caveat:** dentro de `NETWORK_ERROR`/exit 4, no se distingue un `429` + reintentable de un `504` no-reintentable (`sources/openalex.py:150`, `cli/_errors.py:140-145`). +- **Trust & safety (4–7): relajada.** No hay `--dry-run` universal, ni *tagging* de canal de confianza + en los inputs (`seed.py:215`), ni *grading* legible de blast radius por comando (no hay `--force` ni + confirmación). El extremo destructivo del espectro —borrado de recursos— **directamente no existe**. +- **Composabilidad/estabilidad (8–9): sólida con dos caveats.** Cada comando es invocable en frío y el + canal entre invocaciones es **el archivo** (`library.duckdb` del workspace), no memoria de sesión — + la propiedad que hace a `b2g` sobrevivir la compactación de contexto. *Caveat (8):* **cuál** workspace + se resuelve por ambiente (precedencia `--workspace` > `B2G_WORKSPACE` > walk-up del cwd, + `workspace.py:246-286`); un agente que cambia de cwd sin flag puede operar en silencio sobre otra + investigación. *Caveat (9):* la **salida** está versionada, pero **no hay auto-descripción por el mismo + canal de invocación** (no existe `b2g schema`/introspección); el agente en frío debe ir a `docs/API.md` + en prosa — el *hop* débil. + +El rubric pide **no sumar** los nueve en un puntaje, sino mirar dónde **dos grietas juntas** crean +riesgo. La pregunta que este ADR cierra no es "¿cuántos principios cumple?", sino **qué es decisión y +qué es deuda** — para que la próxima auditoría (humana o de agente) no reabra lo ya decidido ni pierda +de vista lo que sigue abierto. + +## Decisión + +### (1) bib2graph implementa deliberadamente el contrato CLI-para-agentes + +El CLI `b2g` **implementa, por postura de diseño y no por accidente**, el contrato CLI-para-agentes +que [0021](0021-cli-agente-native-contrato.md) fijó: **envelope JSON versionado** (`schema="1"`), +**exit codes 0–5 tipados** por clase de error, **comandos self-contained** (estado en el archivo, no +en la sesión) e **identidad de recurso explícita** (papers por `--id` con resolución +`id > doi > source_id`, `read.py:205`, ADR [0036](0036-identidad-source-id-agnostica-doi-ancla.md)). +Esto **ratifica y se apoya en 0021**: aquel ADR decidió *qué* es el contrato; éste registra que +**sostenerlo es un objetivo de diseño de primera clase**, falsable con `archivo:línea`, y por tanto un +criterio contra el cual se evalúan cambios futuros de superficie. Un PR que erosione la legibilidad +estructurada (p. ej. reintroducir prosa en stdout en modo `--json`, o partir el contrato de salida en +variantes `--output`/`--pretty`) **contradice este ADR** y exige justificarse. + +### (2) Las relajaciones de los principios 4–7 son decisión por bajo blast radius, no huecos + +Las relajaciones de *trust & safety* (reversibilidad parcial, sin *tagging* de canal, riesgo plano sin +*grading* legible) son **decisión deliberada**, coherente con el *fail-open advisory* de 0021. El +fundamento es el **bajo blast radius** de esta herramienta, verificable: es un CLI de **analítica +local** sobre un store **DuckDB local single-writer** ([0009](0009-biblioteca-viva-duckdb.md)/[0019](0019-concurrencia-diferida.md)), +**sin borrado de recursos** (no hay `delete/reset/purge`), **sin estado multi-tenant ni credenciales +compartidas**, y con **daño recuperable por snapshot** (`snapshot restore` como red). El propio rubric +lo dice en su *worked example*: un CLI de analítica local no necesita la misma postura de trust que uno +que borra producción. + +**No se adopta fricción de confirmación interactiva** (`--force`, prompts, gates) porque **mataría la +autonomía del agente** —el `b2g` está pensado para correrse por subprocess sin humano en el loop— y el +daño que evitaría es local y reversible. Esta es la decisión explícita: la planicie de riesgo es +**benigna por construcción**, no un descuido a corregir. Quien proponga sumar fricción de confirmación +a un verbo del ciclo está **reabriendo esta decisión** y debe traer un ADR. + +> **Frontera de la decisión (2):** "relajado por diseño" cubre el espectro **actual** del CLI (lectura +> · escritura idempotente que transiciona el FSM · curación transversal persistente · `restore` +> irreversible-pero-local). **No** es licencia para introducir un blast radius nuevo (borrado remoto, +> multi-tenant, mutación destructiva no recuperable) sin reevaluar la postura de trust. Si el espectro +> cambia, este ADR no lo ampara. + +### (3) Tres grietas se declaran roadmap explícito (deuda reconocida, no resuelta acá) + +Las tres se nombran como **deuda reconocida**; **ninguna se resuelve en este ADR** y cada una, al +tocarse, **exige su propio ADR/issue** porque toca `docs/API.md`. Caben las tres **sin romper** el +contrato de 0021 ni la superficie de 10 verbos de [0037](0037-superficie-cli-10-verbos-ciclo.md): + +- **(3a) Subcódigo de error de red — `RATE_LIMITED` (429) vs `UPSTREAM_TIMEOUT`/`QUERY_TOO_COMPLEX` + (504).** Hoy todo cae en `NETWORK_ERROR`/exit 4 (`cli/_errors.py:140-145`), aunque el status code se + distingue **internamente** (`openalex.py:150`, `_RETRY_STATUS_CODES` en `openalex.py:70`). Un *retry + loop* del agente no puede separar transitorio (reintentable con backoff) de permanente (hay que + simplificar la query). Es la **única grieta con daño documentado en uso real**: el desenlace fue un + agente ruteando **alrededor** del motor (directo a OpenAlex con `urllib`), perdiendo la trazabilidad. + Fix aditivo (un `error.subcode` en el envelope; la información ya existe puertas adentro), efecto grande. +- **(3b) Volver legible el workspace resuelto.** La identidad del *recurso* es explícita, pero **cuál** + workspace se eligió por ambiente es implícito (`workspace.py:246-286`). Recomendación: **eco del + workspace en el envelope** (p. ej. en `data`) o **warning** cuando se resolvió por walk-up del cwd + (no por flag ni env explícitos), para que un agente que cambió de cwd no opere en silencio sobre otra + investigación. Aditivo; no cambia la precedencia. +- **(3c) `b2g schema` — introspección versionada de la superficie.** Un comando **meta** que vuelque + comandos, flags por comando y el JSON-schema del envelope con su `ENVELOPE_SCHEMA_VERSION`, por el + **mismo canal de invocación** que el agente ya usa para actuar — cerrando el *hop* a `docs/API.md` en + prosa. Debe modelarse como **comando meta fuera de los 10 verbos del ciclo** (no transiciona FSM, no + toca workspace), siguiendo el precedente de `skill` ([0039](0039-skill-comando-meta-distribucion.md)): + conteo "10 + `skill` + `schema`", no "11 verbos del ciclo". + +## Consecuencias + +**Lo que se gana** + +- **La postura agent-native deja de ser folclore.** Pasa a ser **decisión registrada e inmutable**: la + próxima auditoría parte de "esto ya está decidido" en vez de re-litigar si `b2g` "es de verdad" + agent-native. El criterio para evaluar cambios de superficie queda explícito. +- **Las relajaciones de trust dejan de leerse como huecos.** Cualquier revisor (o agente) que mida `b2g` + contra un rubric genérico y reporte "fallan 4–7" tiene la respuesta registrada: **es por blast + radius**, con la frontera de cuándo deja de valer. Se evita el churn de "arreglar" no-problemas. +- **La deuda real queda nombrada y acotada.** Tres grietas con *archivo:línea*, ordenadas por palanca, + cada una aditiva y sin romper contrato — listas para abrir issues sin re-descubrir el análisis. + +**Lo que cuesta** + +- **Disciplina de coherencia en cada cambio de superficie.** Este ADR es ahora un criterio: un PR que + erosione legibilidad estructurada o sume fricción de confirmación a un verbo del ciclo lo **contradice** + y debe justificarse con ADR. Es trabajo de revisión que antes no existía explícitamente. +- **Las tres grietas siguen abiertas hasta que alguien las tome.** Declararlas roadmap **no** las cierra; + en particular (3a) tiene daño documentado y cada ronda que pase sin subcódigo de red mantiene el riesgo + de que un agente vuelva a rutear alrededor del motor. +- **Cada grieta abierta arrastra su propio ADR/issue.** Por tocar `docs/API.md`, ninguna se mergea "de + paso": el costo de cerrar (3a)/(3b)/(3c) incluye su registro de decisión, aunque el código sea chico. + +## Alternativas + +- **Dejarlo como nota-mapa, sin graduar a ADR.** **Descartada:** las notas de auditoría son trabajo + local que no se commitea; la postura y la separación hueco/decisión se perderían y la próxima auditoría + re-litigaría lo ya decidido. El valor está precisamente en volver la decisión **inmutable y citable**. +- **Enmendar 0021 en vez de un ADR nuevo.** **Descartada:** 0021 fija el **contrato** (envelope/exit/FSM); + este ADR no lo cambia, agrega una capa de **posicionamiento + deuda**. Meterlo como enmienda de 0021 + mezclaría "qué es el contrato" con "por qué la postura y qué falta", y 0021 ya carga varias enmiendas + de superficie. Un ADR-paraguas que **extiende** 0021 mantiene cada decisión legible por separado. +- **Resolver las tres grietas en este mismo ADR.** **Descartada:** cada una toca `docs/API.md` (contrato + público) y por regla del repo exige su propio ADR/issue con su DoD y tests. Mezclarlas acá produciría un + ADR que decide cinco cosas a la vez y un PR imposible de revisar. Este ADR **nombra** la deuda; no la salda. +- **Adoptar fricción de confirmación (`--force`/prompts) para "cumplir" trust 4–7.** **Descartada:** es + exactamente lo que (2) rechaza — mataría la autonomía del agente para prevenir un daño local y reversible. + El rubric mismo desaconseja imponer postura de producción a una herramienta de analítica local. +- **Cerrar el caveat de red (3a) re-exponiendo `--api-key` o tocando el retry interno.** Fuera de alcance: + la grieta es de **legibilidad del outcome** (subcódigo en el envelope), no del retry —que ya existe + interno (`openalex.py:70`)— ni de la credencial —que ya entra solo por env `OPENALEX_API_KEY` + (`openalex.py:413`); el único `--api-key` literal vive en el alias deprecado `enrich` que se retira en + 0.11.0 ([0038](0038-destino-verbos-huerfanos-0037.md)). El footgun de la credencial **se cierra solo** + con esa deprecación; la acción mínima es **no re-introducir** `--api-key` en los verbos vivos. diff --git a/docs/decisiones/README.md b/docs/decisiones/README.md index c18535e..2488c5d 100644 --- a/docs/decisiones/README.md +++ b/docs/decisiones/README.md @@ -89,3 +89,5 @@ Qué se vuelve posible/fácil y qué se vuelve costoso/imposible. Trade-offs hon | [0038](0038-destino-verbos-huerfanos-0037.md) | Destino de los 5 verbos huérfanos que el 0037 no nombró: `gui` se mantiene fuera de los 10 (0027/0028); `enrich`→absorbido en `chain`/`build`; `restore`→`snapshot restore`; `thesaurus`→retirado; `resolve`→retirado (ruta única `seed --resolve`). Fija: ventana de deprecación cierra en **0.11.0**; `build --scope=all` default; forma de `maturity` en `docs/API.md` | **Aceptada** (2026-06-27). **Enmienda [0037](0037-superficie-cli-10-verbos-ciclo.md)** (cierra el conteo "10 verbos"); revisa el `thesaurus` de [0031](0031-preprocesamiento-automatico-en-ingesta.md); renombre de [0030](0030-ecuacion-declarativa-corpus-ejemplo.md); refuerza 0035; envelope `schema="1"`/exit/FSM intactos. Contexto: issues #149/#34 | | [0039](0039-skill-comando-meta-distribucion.md) | Distribución de la skill de Claude Code end-user: `b2g skill add [--user\|--project] [--force]` (comando **meta**; **fuera** del set de 10, no compite con `status`); skill vendoreada en el wheel (`src/bib2graph/skill/`, fuente commiteada incluida por `packages` — **no** `force-include`) → **version-lock skill==cli**; envelope `--json` sin FSM, sin workspace. **Descarta** el extra `[skill]` (no escribe en `~/.claude/skills/`) y plugin+marketplace como primario (desacopla versionado; ruta futura) | **Aceptada** (2026-06-28). **Enmienda [0038](0038-destino-verbos-huerfanos-0037.md)** (excepción meta); relacionada 0037/0028/0010/0021/0029; no introduce IA (0022). Epic [#188](https://github.com/complexluise/bib2graph/issues/188). **Nota (2026-06-28):** el [0040](0040-retiro-gui-local.md) retira `gui`, así que `skill` queda como **única** excepción meta (conteo "10 + skill") | | [0040](0040-retiro-gui-local.md) | Retirar la GUI local de la librería (BREAKING): se eliminan `b2g gui`, la API local FastAPI (`api/`), la SPA `frontend/`, el extra `[gui]` y el vendoreo del frontend en el wheel; el core es CLI/agente-native sobre la biblioteca viva. **La capa `service/` (incl. `reads.py`) se conserva** (la usa el CLI). Conteo: "10 verbos + `skill`" | **Aceptada** (2026-06-28). **Supersede [0027](0027-pivote-posicionamiento-gui-local.md)/[0028](0028-arquitectura-gui-api-capa-servicios.md)**; enmienda [0038](0038-destino-verbos-huerfanos-0037.md) (retira la excepción `gui`); relacionada 0010/0021/0037/0039/0005/0019/0032/0033/0034; no introduce IA (0022). Issue [#190](https://github.com/complexluise/bib2graph/issues/190); limpieza profunda de docs en [#191](https://github.com/complexluise/bib2graph/issues/191) | +| [0041](0041-documentacion-por-superficie-de-entrega.md) | Organizar la documentación por **superficie de entrega**, no por tipo de lector: los tres usuarios = **dos superficies + un mediador** (agente dentro del repo → `AGENTS.md`/código; humano-y-agente navegando → sitio Diátaxis; IA externa → `llms.txt`). **No se forkea el sitio por audiencia**; se publica `llms.txt` (derivado de `AGENTS.md` + referencia CLI) en la raíz del sitio; persona = **veneer de navegación** (3 puertas por intención, 1 cuerpo); `AGENTS.md` sube al nav. La operación-por-IA es objetivo de 1ª clase | **Aceptada** (2026-06-29). Net-new (ningún ADR gobernaba la estructura de la doc); **no cambia contratos** (envelope/exit/FSM intactos). Relacionada 0039 (skill = doc operativa mediada por IA, fuera del sitio)/0010/0021/0037/0038/0040; no introduce IA (0022) | +| [0043](0043-posicionamiento-agent-native-cli.md) | bib2graph **implementa deliberadamente** el contrato CLI-para-agentes (envelope `schema="1"` versionado, exit codes 0–5 tipados, comandos self-contained, identidad de recurso explícita): postura de diseño, no accidente. Las **relajaciones de trust & safety (principios 4–7)** son **decisión por bajo blast radius** (analítica local, store DuckDB local, sin borrado, daño recuperable por snapshot), no huecos — *fail-open advisory*; **no** se adopta fricción de confirmación (mataría la autonomía del agente). Tres grietas = **roadmap explícito**: subcódigo de red (`RATE_LIMITED` 429 vs `UPSTREAM_TIMEOUT` 504), eco del workspace resuelto, `b2g schema` (introspección versionada) | **Aceptada** (2026-06-30). **Extiende [0021](0021-cli-agente-native-contrato.md)** (posiciona el contrato; **no** lo cambia: envelope/exit/FSM intactos). Relacionada 0010/0037/0038/0039 (`schema` = comando meta fuera de los 10)/0041; no introduce IA (0022). Origen: dos auditorías (PO + agente) contra el *Rubric for Agent-Native CLI Design* | diff --git a/docs/tutoriales/sota-completo.md b/docs/tutoriales/sota-completo.md index 4b7d051..66b5679 100644 --- a/docs/tutoriales/sota-completo.md +++ b/docs/tutoriales/sota-completo.md @@ -555,8 +555,8 @@ git commit -m "SOTA: [Tu Tema] — corpus, redes, reporte" ## Referencias -- [Cómo elaborar un reporte de estado del arte (guía)](../guias/reporte-estado-del-arte.md) — - complemento con más detalles en curación y redacción. +- [Guías (how-to)](../guias/index.md) — recetas acotadas que complementan cada + paso: ecuación, forrajeo, curación PRISMA, lectura de redes y redacción del reporte. - [Arquitectura de bib2graph](../ARCHITECTURE.md) - [Referencia del CLI `b2g`](../reference/cli.md) - [API Python](../reference/python-api.md) diff --git a/exploracion/README.md b/exploracion/README.md deleted file mode 100644 index 4c2f477..0000000 --- a/exploracion/README.md +++ /dev/null @@ -1,103 +0,0 @@ -# exploracion/ — sandbox de validación del caso IED - -> **Qué es esto.** Scripts sueltos para **validar el caso de uso "intercambio -> ecológicamente desigual" (IED)** contra librerías externas (`pyalex`, -> `bibtexparser`, `networkx`). Sirve para **probar conceptos** y **tomar postura** -> sobre las tensiones del diseño de `bib2graph` antes de empezar a construir el núcleo. -> -> **Qué NO es.** No es código de `bib2graph`. No se importa desde -> `src/bib2graph/`. No se promueve a costuras del paquete. Es material de -> exploración, no producto. -> -> **Por qué existe fuera de `src/`.** El ROADMAP vigente (Hito 0 → núcleo puro -> primero) prohíbe traer librerías como `pyalex` o `bibtexparser` al núcleo. Estos -> scripts rompen esa prohibición a propósito: necesitan esas librerías para -> responder "¿la combinación de redes + IED entrega valor?". Si la respuesta es -> sí, el siguiente paso es **diseñar la costura** que el núcleo sí va a tener -> (no copiar este código adentro). - -## Caso de uso - -**Intercambio ecológicamente desigual (IED):** asimetrías Norte-Sur en el comercio -mundial, deuda ecológica, huella ecológica transferida. El objetivo del sandbox es -probar si la combinación de: - -- una **biblioteca semilla** de literatura sobre IED (papers que vos curás), -- **OpenAlex** para enriquecer (referencias, citas, afiliaciones), -- las **4 redes bibliométricas** (co-citación, co-autoría, co-word, coupling), - -expone de manera útil las **asimetrías de poder epistémico y geográfico** del campo: -quién publica sobre IED, desde dónde, con qué collaborations, citando a quién. - -## Estructura - -``` -exploracion/ - README.md # este archivo - requirements-exploracion.txt # libs externas usadas acá - scripts/ - 01_search_openalex.py # query OpenAlex -> CSV - 02_load_bibtex.py # parser .bib -> CSV (mismo schema) - 03_merge_corpus.py # une, dedup, dump parquet - 04_build_networks.py # 4 redes -> GraphML (--coupling-scope seeds|full) - 05_metrics_report.py # centralidad, asimetrías, asortatividad, informe - 06_apply_thesaurus.py # aplica thesaurus IED a keywords - _schema.py # schema común a todos los scripts - datos/ - semillas_ied.bib # input inicial curado - thesaurus_ied.json # thesaurus multilingüe manual (en/es/pt) - openalex_ied.csv # salida de 01 (datos reales) - corpus_ied.csv # salida de 03 - corpus_ied.parquet # misma, formato columnar - redes/ # GraphML por tipo de red - informe_ied.md # auto: datos cuantitativos (se regenera) - informe_ied_lectura_1.md # v1: sintético, 21 papers (2026-06-14) - informe_ied_lectura_2.md # v2: mixto, 103 papers (2026-06-14) -``` - -## Cómo correrlo - -```bash -pip install -r requirements-exploracion.txt -python scripts/01_search_openalex.py # red: requiere API key o polite pool -python scripts/02_load_bibtex.py # offline, sobre datos/semillas_ied.bib -python scripts/03_merge_corpus.py # une las dos fuentes -python scripts/04_build_networks.py # produce 4 GraphML en datos/redes/ -python scripts/05_metrics_report.py # produce informe_ied.md -``` - -Los scripts 02-05 corren **offline** sobre los datos sintéticos que viven en -`datos/`. El 01 sólo se usa para datos reales (requiere cuenta de OpenAlex con -API key gratis desde feb-2026). - -## Convenciones de la sandbox - -- **Schema común** en CSV: `id,doi,title,year,abstract,authors_raw,authors_id, - authors_affiliations,keywords_raw,keywords_id,references_doi,source, - language,is_seed`. Es **exploratorio**: lo más cercano al schema canónico - propuesto en `docs/ARCHITECTURE.md` §3, con la libertad de romperlo si los - datos reales lo exigen. -- **Idempotente**: correr dos veces no duplica. -- **Defensivo con campos faltantes**: refleja la regla del AGENTS.md para - `bibtexparser` (campos opcionales faltan seguido). -- **Sin red salvo en 01**: los demás scripts usan los dumps locales. -- **Sin secretos en código**: la API key de OpenAlex se lee de - `OPENALEX_API_KEY` (env var) o `~/.openalex/credentials`. - -## Decisiones y tensiones que se registran en `informe_ied.md` - -Cada vez que la sandbox fuerza una decisión que el `bib2graph` real va a tener -que tomar, se anota en el informe con el formato: - -- **Decisión:** qué hicimos acá. -- **Por qué:** qué evidenció. -- **Implicación para el diseño:** qué contracto del núcleo se ve afectado. -- **Pendiente:** qué no se pudo validar. - -## Estado - -- [x] Estructura y README -- [ ] requirements + seeds sintéticos -- [ ] scripts 01-05 -- [ ] pipeline end-to-end corrido -- [ ] informe con tensiones diff --git a/exploracion/datos/corpus_ied.csv b/exploracion/datos/corpus_ied.csv deleted file mode 100644 index efcd217..0000000 --- a/exploracion/datos/corpus_ied.csv +++ /dev/null @@ -1,130 +0,0 @@ -id,doi,title,year,abstract,authors_raw,authors_id,authors_affiliations,keywords_raw,keywords_id,references_doi,source,language,is_seed -10.1086/227972,10.1086/227972,"Modes of Extraction, Unequal Exchange, and the Progressive -Underdevelopment of an Extreme Periphery: The Brazilian Amazon, -1600--1980",1984,"We develop a framework for analyzing unequal ecological exchange -between core and peripheral regions, drawing on the case of the -Brazilian Amazon.","Bunker, Stephen G.",bunker_stephen_g,Paper affiliation: US,unequal exchange; ecological exchange; periphery; world-system,unequal_exchange; ecological_exchange; periphery; world-system,,American Journal of Sociology,,True -10.1016/S0921-8009(97)00100-6,10.1016/S0921-8009(97)00100-6,"Towards an Ecological Theory of Unequal Exchange: Articulating -World System Theory and Ecological Economics",1998,"We articulate world-system theory and ecological economics to -develop a biophysical theory of unequal exchange.","Hornborg, Alf",hornborg_alf,Paper affiliation: SE,unequal exchange; ecological economics; world-system; throughput,unequal_exchange; ecological_economics; world-system; throughput,,Ecological Economics,,True -10.1016/j.ecolecon.2017.08.001,10.1016/j.ecolecon.2017.08.001,"Biophysical Trade Balance of Ecuador: A Biophysical Perspective -on Asymmetric Exchange",2018,"We compute the physical trade balance of Ecuador to expose -asymmetric ecological exchange.","Aldas, C.; Álvarez, M.; Orta, L.",aldas_c; álvarez_m; orta_l,Paper affiliation: EC,biophysical trade; Ecuador; unequal exchange; Latin America,biophysical_trade; ecuador; unequal_exchange; latin_america,,Ecological Economics,,True -10.1111/jiec.12830,10.1111/jiec.12830,"Physical Trade Deficits of Brazil 1990--2015: A Material Flow -Analysis",2019,"Material flow analysis applied to Brazilian trade shows persistent -physical deficits with the Global North.","Pereira, J.; Silva, R.; Costa, P.",pereira_j; silva_r; costa_p,Paper affiliation: BR,material flow analysis; Brazil; biophysical trade; periphery,material_flow_analysis; brazil; biophysical_trade; periphery,,Journal of Industrial Ecology,,True -10.1080/01436597.2020.1723088,10.1080/01436597.2020.1723088,"South-South Trade and Ecological Unequal Exchange: The Case of -India's Pharmaceutical Exports",2020,"We challenge the assumption that South-South trade is intrinsically -more ecological, examining the Indian pharmaceutical sector.","Khor, M.; Narayanan, S.",khor_m; narayanan_s,Paper affiliation: IN,South-South trade; India; unequal exchange; pharmaceuticals,south-south_trade; india; unequal_exchange; pharmaceuticals,,Third World Quarterly,,True -W2342655129,10.1080/03066150.2016.1141198,Is there a global environmental justice movement?,2016,"One of the causes of the increasing number of ecological distribution conflicts around the world is the changing metabolism of the economy in terms of growing flows of energy and materials. There are conflicts on resource extraction, transport and waste disposal. Therefore, there are many local complaints, as shown in the Atlas of Environmental Justice (EJatlas) and other inventories. And not only complaints; there are also many successful examples of stopping projects and developing alternatives, testifying to the existence of a rural and urban global movement for environmental justice. Moreover, since the 1980s and 1990s, this movement has developed a set of concepts and campaign slogans to describe and intervene in such conflicts. They include environmental racism, popular epidemiology, the environmentalism of the poor and the indigenous, biopiracy, tree plantations are not forests, the ecological debt, climate justice, food sovereignty, land grabbing and water justice, among other concepts. These terms were born from socio-environmental activism, but sometimes they have also been taken up by academic political ecologists and ecological economists who, for their part, have contributed other concepts to the global environmental justice movement, such as 'ecologically unequal exchange' or the 'ecological footprint'.","Joan Martínez Alier; Leah Temper; Daniela Del Bene; Arnim Scheidel; Martínez-Alier, Joan; Temper, Leah; Del Bene, Daniela; Scheidel, Arnim",A5004042357; A5007427123; A5050277246; A5035350172; martínezalier_joan; temper_leah; del_bene_daniela; scheidel_arnim,Paper affiliation: ES,Environmental justice; Movement (music); Economic Justice; Political science; Global justice; Environmental ethics; Sociology; Political economy; Law; Aesthetics; Philosophy; environmental justice; ecological distribution; movements,environmental-justice; movement; economic-justice; political-science; global-justice; environmental-ethics; sociology; political-economy; law; aesthetics; philosophy; environmental_justice; ecological_distribution; movements,https://openalex.org/W24676063; https://openalex.org/W39838849; https://openalex.org/W106908474; https://openalex.org/W126445477; https://openalex.org/W160500913; https://openalex.org/W198530926; https://openalex.org/W562193577; https://openalex.org/W571924660; https://openalex.org/W573704088; https://openalex.org/W573931508; https://openalex.org/W608530620; https://openalex.org/W614736872; https://openalex.org/W616805653; https://openalex.org/W622111395; https://openalex.org/W640395149; https://openalex.org/W644940498; https://openalex.org/W651096281; https://openalex.org/W657620444; https://openalex.org/W836905562; https://openalex.org/W1408991106; https://openalex.org/W1479808467; https://openalex.org/W1482149660; https://openalex.org/W1495628681; https://openalex.org/W1506954881; https://openalex.org/W1531921269; https://openalex.org/W1536916917; https://openalex.org/W1539308977; https://openalex.org/W1597172957; https://openalex.org/W1597421676; https://openalex.org/W1601641141; https://openalex.org/W1602775671; https://openalex.org/W1607813434; https://openalex.org/W1659143523; https://openalex.org/W1746968135; https://openalex.org/W1750986932; https://openalex.org/W1803673662; https://openalex.org/W1875518958; https://openalex.org/W1902314391; https://openalex.org/W1942258133; https://openalex.org/W1961753951; https://openalex.org/W1963684733; https://openalex.org/W1970983746; https://openalex.org/W1973954730; https://openalex.org/W1974564128; https://openalex.org/W1975716168; https://openalex.org/W1977065782; https://openalex.org/W1980314759; https://openalex.org/W1981954908; https://openalex.org/W1987157513; https://openalex.org/W1998173620; https://openalex.org/W2006467409; https://openalex.org/W2012830928; https://openalex.org/W2013402297; https://openalex.org/W2014182960; https://openalex.org/W2016611404; https://openalex.org/W2026734915; https://openalex.org/W2028502628; https://openalex.org/W2030626342; https://openalex.org/W2034283967; https://openalex.org/W2035353157; https://openalex.org/W2040538614; https://openalex.org/W2041321854; https://openalex.org/W2041724919; https://openalex.org/W2045609492; https://openalex.org/W2048051304; https://openalex.org/W2056619110; https://openalex.org/W2056654591; https://openalex.org/W2056926496; https://openalex.org/W2057931959; https://openalex.org/W2060306247; https://openalex.org/W2061668231; https://openalex.org/W2062199894; https://openalex.org/W2062212647; https://openalex.org/W2063877192; https://openalex.org/W2071735537; https://openalex.org/W2073478361; https://openalex.org/W2074580217; https://openalex.org/W2076352747; https://openalex.org/W2076362506; https://openalex.org/W2076926005; https://openalex.org/W2077618140; https://openalex.org/W2079643502; https://openalex.org/W2082793946; https://openalex.org/W2085253317; https://openalex.org/W2086192290; https://openalex.org/W2086988135; https://openalex.org/W2087385946; https://openalex.org/W2088890647; https://openalex.org/W2089327955; https://openalex.org/W2091709473; https://openalex.org/W2113908401; https://openalex.org/W2122325078; https://openalex.org/W2128697261; https://openalex.org/W2131236975; https://openalex.org/W2133412156; https://openalex.org/W2137540105; https://openalex.org/W2143132840; https://openalex.org/W2148732650; https://openalex.org/W2150141679; https://openalex.org/W2155200498; https://openalex.org/W2159167826; https://openalex.org/W2164334321; https://openalex.org/W2167555648; https://openalex.org/W2169091890; https://openalex.org/W2175723801; https://openalex.org/W2180116906; https://openalex.org/W2300912211; https://openalex.org/W2319568853; https://openalex.org/W2482534035; https://openalex.org/W2488167377; https://openalex.org/W2499185134; https://openalex.org/W2509117576; https://openalex.org/W2565699167; https://openalex.org/W2578584143; https://openalex.org/W2588205325; https://openalex.org/W2592356138; https://openalex.org/W2592836093; https://openalex.org/W2598540519; https://openalex.org/W2603115376; https://openalex.org/W2606168528; https://openalex.org/W2621477277; https://openalex.org/W2741785244; https://openalex.org/W2760758743; https://openalex.org/W2772026272; https://openalex.org/W2772802389; https://openalex.org/W3058573125; https://openalex.org/W3123315369; https://openalex.org/W3152418774; https://openalex.org/W3159280209; https://openalex.org/W3175182508; https://openalex.org/W4205266477; https://openalex.org/W4206319759; https://openalex.org/W4206610535; https://openalex.org/W4211077846; https://openalex.org/W4229821295; https://openalex.org/W4230338987; https://openalex.org/W4230519330; https://openalex.org/W4230585566; https://openalex.org/W4233272295; https://openalex.org/W4233654598; https://openalex.org/W4233824991; https://openalex.org/W4236697295; https://openalex.org/W4239086245; https://openalex.org/W4239421629; https://openalex.org/W4239528198; https://openalex.org/W4239894112; https://openalex.org/W4240002859; https://openalex.org/W4240807311; https://openalex.org/W4241852105; https://openalex.org/W4242519425; https://openalex.org/W4243589412; https://openalex.org/W4299341209; https://openalex.org/W4300513965; https://openalex.org/W4301267015; https://openalex.org/W4301408177; https://openalex.org/W4380764505,The Journal of Peasant Studies,en,True -10.5194/esd-8-435-2017,10.5194/esd-8-435-2017,"Increased Food Production and Reduced Water Use Through -Teleconnection Between Producers and Consumers",2017,"We document increased teleconnections between food producers and -consumers globally, with implications for water resources.","Davis, K. F.; Rulli, M. C.; Seveso, A.; D'Odorico, P.",davis_k_f; rulli_m_c; seveso_a; dodorico_p,Paper affiliation: US,telecoupling; virtual water; food trade; teleconnections,telecoupling; virtual_water; food_trade; teleconnections,,Earth System Dynamics,,True -10.1080/09644016.2019.1549779,10.1080/09644016.2019.1549779,"Food Miles, Carbon Labeling, and the Hidden Ecological Costs of -Northern Consumption",2019,"We examine the political economy of carbon labeling in food trade -and the hidden ecological costs of Northern consumption.","Heikkineá, T.; Pietola, K.",heikkineá_t; pietola_k,Paper affiliation: FI,food miles; carbon labeling; consumption; Northern Europe,food_miles; carbon_labeling; consumption; northern_europe,,Environmental Politics,,True -10.1073/pnas.1220362110,10.1073/pnas.1220362110,The Material Footprint of Nations,2015,"We compute the material footprint of nations using multi-region -input-output analysis.","Wiedmann, T. O.; Schandl, H.; Lenzen, M.; Moran, D.; Suh, S.; West, J.; Kanemoto, K.",wiedmann_t_o; schandl_h; lenzen_m; moran_d; suh_s; west_j; kanemoto_k,Paper affiliation: AU,material footprint; MRIO; consumption; trade,material_footprint; mrio; consumption; trade,,Proceedings of the National Academy of Sciences,,True -10.1088/1748-9326/9/10/104005,10.1088/1748-9326/9/10/104005,"Rapidly Increasing Pressure on Commodity Agriculture in Latin -America",2014,"We map growing pressure on commodity agriculture in Latin America -driven by Northern demand.","Kastner, T.; Erb, K.-H.; Haberl, H.",kastner_t; erb_kh; haberl_h,Paper affiliation: AT,land use; commodity agriculture; Latin America; telecoupling,land_use; commodity_agriculture; latin_america; telecoupling,,Environmental Research Letters,,True -10.1080/10455752.2018.1556455,10.1080/10455752.2018.1556455,"A Critique of Material Flow Analysis as a Tool for Ecological -Unequal Exchange Research",2019,"We critically examine methodological assumptions in MFA-based IED -research and propose a political-ecology framing.","Warrior, R.; Álvarez, L.",warrior_r; álvarez_l,Paper affiliation: AR,methodology critique; MFA; unequal exchange; political ecology,methodology_critique; mfa; unequal_exchange; political_ecology,,Capitalism Nature Socialism,,True -10.5195/jwsr.2021.1011,10.5195/jwsr.2021.1011,"Postcolonial Critiques of the Treadmill of Production: The Case -of India-Brazil Mineral Trade",2021,"We bring postcolonial theory to bear on treadmill-of-production -analyses of mineral trade between India and Brazil.","Frey, B.; Subramaniam, B.",frey_b; subramaniam_b,Paper affiliation: US,postcolonial; treadmill of production; minerals; India; Brazil,postcolonial; treadmill_of_production; minerals; india; brazil,,Journal of World-Systems Research,,True -W2119211517,10.1353/sof.2007.0054,Ecological Unequal Exchange: International Trade and Uneven Utilization of Environmental Space in the World System,2007,"We evaluate the argument that international trade influences disproportionate cross-national utilization of global renewable natural resources. Such uneven dynamics are relevant to the consideration of inequitable appropriation of environmental space in particular and processes of ecological unequal exchange more generally. Using OLS regression with slope dummy interaction terms, we analyze the effects of trade upon environmental consumption, as measured by per capita ecological footprint demand for 2002, delineated by country income level. Based on data for 137 countries, analyses reveal low- and lower middle-income countries characterized by a greater proportion of exports to the core industrialized countries exhibit lower environmental consumption. The results contradict neoclassical economic thought. We find trade shapes uneven utilization of global environmental space by constraining consumption in low and lower middle-income countries.",James Rice,A5048848430,New Mexico State University (US),Ecological footprint; Economics; Consumption (sociology); Per capita; Per capita income; Natural resource; Space (punctuation); Natural resource economics; Sustainability; Ecology; Population,ecological-footprint; economics; consumption; per-capita; per-capita-income; natural-resource; space; natural-resource-economics; sustainability; ecology; population,https://openalex.org/W29128684; https://openalex.org/W98053437; https://openalex.org/W100254650; https://openalex.org/W121690023; https://openalex.org/W204270373; https://openalex.org/W564808682; https://openalex.org/W571185114; https://openalex.org/W579563895; https://openalex.org/W623848121; https://openalex.org/W651598703; https://openalex.org/W1526407077; https://openalex.org/W1530782558; https://openalex.org/W1539308977; https://openalex.org/W1541584794; https://openalex.org/W1551322995; https://openalex.org/W1981094349; https://openalex.org/W1982053377; https://openalex.org/W1990164247; https://openalex.org/W1996199418; https://openalex.org/W2013402297; https://openalex.org/W2020935901; https://openalex.org/W2030978014; https://openalex.org/W2033186995; https://openalex.org/W2036713768; https://openalex.org/W2041137602; https://openalex.org/W2047856663; https://openalex.org/W2051025186; https://openalex.org/W2056286657; https://openalex.org/W2056926496; https://openalex.org/W2085515592; https://openalex.org/W2100618934; https://openalex.org/W2101325537; https://openalex.org/W2105586900; https://openalex.org/W2116018954; https://openalex.org/W2122831705; https://openalex.org/W2126212614; https://openalex.org/W2133022495; https://openalex.org/W2141833713; https://openalex.org/W2143917121; https://openalex.org/W2163307695; https://openalex.org/W2170219305; https://openalex.org/W2174103482; https://openalex.org/W2181493251; https://openalex.org/W2187729256; https://openalex.org/W2274106087; https://openalex.org/W2279795386; https://openalex.org/W2280747592; https://openalex.org/W2297931742; https://openalex.org/W2528256758; https://openalex.org/W2797816625; https://openalex.org/W2806988935; https://openalex.org/W2918033867; https://openalex.org/W3010621220; https://openalex.org/W3146010958; https://openalex.org/W3159280209; https://openalex.org/W3211630684,Social Forces,en,False -W2142043891,10.1177/0020715207072159,"Ecological Unequal Exchange: Consumption, Equity, and Unsustainable Structural Relationships within the Global Economy",2007,"We discuss and elaborate upon the theory of cross-national ecological unequal exchange. Drawing upon world-systems theoretical propositions, ecological unequal exchange refers to the increasingly disproportionate utilization of ecological systems and externalization of negative environmental costs by core industrialized countries and, consequentially, declining utilization opportunities and imposition of exogenous environmental burdens within the periphery. We provide a descriptive overview of theoretical and empirical efforts to date examining this issue. Ecological unequal exchange provides a framework for conceptualizing how the socioeconomic metabolism or material throughput of core countries may negatively impact more marginalized countries in the global economy. It focuses attention upon the global uneven fl ow of energy, natural resources, and waste products of industrial activity. Further, the recognition of the distributional processes of ecological unequal exchange is relevant to considerations of both the socioeconomic and environmental imperatives underlying the pursuit of sustainable development, as it contributes to underdevelopment within the periphery of the world-system. We conclude by highlighting the interconnections between uneven natural resource fl ows, global environmental change, and the challenge of broad-based sustainable development.",James Rice,A5048848430,New Mexico State University (US),Ecological economics; Equity (law); Underdevelopment; Sustainable development; Natural resource; Sustainability; Economics; Environmental degradation; Consumption (sociology); Economic system; Ecology; Development economics; Natural resource economics; Economic growth; Political science; Sociology; Biology; Social science,ecological-economics; equity; underdevelopment; sustainable-development; natural-resource; sustainability; economics; environmental-degradation; consumption; economic-system; ecology; development-economics; natural-resource-economics; economic-growth; political-science; sociology; biology; social-science,https://openalex.org/W29128684; https://openalex.org/W174463555; https://openalex.org/W246163104; https://openalex.org/W595015540; https://openalex.org/W651598703; https://openalex.org/W1518714090; https://openalex.org/W1530782558; https://openalex.org/W1536788759; https://openalex.org/W1539308977; https://openalex.org/W1541584794; https://openalex.org/W1551322995; https://openalex.org/W1558000859; https://openalex.org/W1596919638; https://openalex.org/W1687549561; https://openalex.org/W1984695483; https://openalex.org/W1990164247; https://openalex.org/W1992984263; https://openalex.org/W1995485900; https://openalex.org/W1996199418; https://openalex.org/W2013402297; https://openalex.org/W2014480644; https://openalex.org/W2020935901; https://openalex.org/W2023864710; https://openalex.org/W2026865785; https://openalex.org/W2030978014; https://openalex.org/W2036713768; https://openalex.org/W2040057718; https://openalex.org/W2041137602; https://openalex.org/W2042226937; https://openalex.org/W2051025186; https://openalex.org/W2051998369; https://openalex.org/W2056926496; https://openalex.org/W2066932297; https://openalex.org/W2074809583; https://openalex.org/W2075693476; https://openalex.org/W2100618934; https://openalex.org/W2101108903; https://openalex.org/W2113337769; https://openalex.org/W2116018954; https://openalex.org/W2122512506; https://openalex.org/W2122831705; https://openalex.org/W2126212614; https://openalex.org/W2127329485; https://openalex.org/W2141833713; https://openalex.org/W2143917121; https://openalex.org/W2160934709; https://openalex.org/W2163307695; https://openalex.org/W2166671387; https://openalex.org/W2169776575; https://openalex.org/W2174103482; https://openalex.org/W2174143613; https://openalex.org/W2181493251; https://openalex.org/W2182089091; https://openalex.org/W2187729256; https://openalex.org/W2274106087; https://openalex.org/W2279795386; https://openalex.org/W2288595092; https://openalex.org/W2337659769; https://openalex.org/W2528256758; https://openalex.org/W2617515511; https://openalex.org/W2918033867; https://openalex.org/W3159280209; https://openalex.org/W4213234829; https://openalex.org/W4220804448; https://openalex.org/W4241852105; https://openalex.org/W4255286740; https://openalex.org/W4285719527,International Journal of Comparative Sociology,en,False -W1973954730,10.1177/0020715209105147,"Ecologically Unequal Exchange, Ecological Debt, and Climate Justice",2009,"Building on structuralist perspectives of the world economy, a small but growing group of researchers have forged a new literature on `ecologically unequal exchange' and documented that energy and materials disproportionately flow from the Global South to the Global North. These findings have begun to influence efforts to negotiate a `post-Kyoto' global climate regime. Since the extraction of resources and energy is one of the most damaging stages of the chain of commodity production, a logical next step is the mounting cry from developing countries that they are owed an `ecological debt' by the North. The G-77 and China have seized on these ideas and a movement for `climate justice' is now gaining strength in and exerting influence in international negotiations, including the UNFCCC meetings in Delhi, Bali, and Poznań. This article reviews the history of these related three ideas and examines their potential to reshape the discussion of `burden sharing' in the post-Kyoto world where development is constrained by climate change.",J. Timmons Roberts; Bradley C. Parks,A5082988195; A5047978847,William & Mary (US); Williams (United States) (US); Millennium Challenge Corporation (US),Negotiation; Kyoto Protocol; China; Economic Justice; Commodity; Climate change; Debt; Political science; Global warming; Economy; Development economics; International trade; Economics; Natural resource economics; Geography; Ecology; Market economy; Law,negotiation; kyoto-protocol; china; economic-justice; commodity; climate-change; debt; political-science; global-warming; economy; development-economics; international-trade; economics; natural-resource-economics; geography; ecology; market-economy; law,https://openalex.org/W18714912; https://openalex.org/W53023682; https://openalex.org/W181224196; https://openalex.org/W228880448; https://openalex.org/W363696262; https://openalex.org/W573167388; https://openalex.org/W613588134; https://openalex.org/W614211536; https://openalex.org/W651598703; https://openalex.org/W826469042; https://openalex.org/W1529106462; https://openalex.org/W1552736777; https://openalex.org/W1563281257; https://openalex.org/W1564726429; https://openalex.org/W1593994209; https://openalex.org/W1823886455; https://openalex.org/W1870280941; https://openalex.org/W1970732996; https://openalex.org/W1983474380; https://openalex.org/W1998804088; https://openalex.org/W2005340918; https://openalex.org/W2008178580; https://openalex.org/W2013402297; https://openalex.org/W2014105429; https://openalex.org/W2017032566; https://openalex.org/W2020935901; https://openalex.org/W2026255285; https://openalex.org/W2027255868; https://openalex.org/W2030978014; https://openalex.org/W2036713768; https://openalex.org/W2037466272; https://openalex.org/W2038981142; https://openalex.org/W2041202945; https://openalex.org/W2056926496; https://openalex.org/W2068157259; https://openalex.org/W2077858203; https://openalex.org/W2083170299; https://openalex.org/W2084528250; https://openalex.org/W2089327955; https://openalex.org/W2095092650; https://openalex.org/W2101108903; https://openalex.org/W2110438916; https://openalex.org/W2119211517; https://openalex.org/W2126212614; https://openalex.org/W2142043891; https://openalex.org/W2164304100; https://openalex.org/W2169776575; https://openalex.org/W2174103482; https://openalex.org/W2182089091; https://openalex.org/W2215129138; https://openalex.org/W2285306684; https://openalex.org/W2321434398; https://openalex.org/W2341034567; https://openalex.org/W2499185134; https://openalex.org/W2501585505; https://openalex.org/W2528256758; https://openalex.org/W2586432828; https://openalex.org/W3121380395; https://openalex.org/W3123592998; https://openalex.org/W3125260465; https://openalex.org/W3159280209; https://openalex.org/W3173126365; https://openalex.org/W3213090436; https://openalex.org/W4236004568; https://openalex.org/W4237128792; https://openalex.org/W4247796865; https://openalex.org/W4250217784; https://openalex.org/W4299448508; https://openalex.org/W4401185539; https://openalex.org/W6600476237,International Journal of Comparative Sociology,en,False -W1862702728,10.2458/v23i1.20220,Ecologically unequal exchange and ecological debt,2016,"This article introduces a Special Section on Ecologically Unequal Exchange (EUE), an underlying source of most of the environmental distribution conflicts in our time. The nine articles discuss theories, methodologies, and empirical case studies pertaining to ecologically unequal exchange, and address its relationship to ecological debt. This is the introductory article in Alf Hornborg and Joan Martinez-Alier (eds.) 2016. ""Ecologically unequal exchange and ecological debt"", Special Section of the Journal of Political Ecology 23: 328-491.",Alf Hornborg; Joan Martínez Alier,A5082311142; A5004042357,Lund University (SE); Universitat Autònoma de Barcelona (ES),Ecology; Debt; Section (typography); Political ecology; Politics; Distribution (mathematics); Geography; Economics; Political science; Business; Biology; Law; Macroeconomics; Mathematics,ecology; debt; section; political-ecology; politics; distribution; geography; economics; political-science; business; biology; law; macroeconomics; mathematics,https://openalex.org/W779134457; https://openalex.org/W1505091764; https://openalex.org/W1509006868; https://openalex.org/W1584129281; https://openalex.org/W1591166682; https://openalex.org/W1738944162; https://openalex.org/W1956760944; https://openalex.org/W1967879531; https://openalex.org/W2048051304; https://openalex.org/W2056926496; https://openalex.org/W2076881948; https://openalex.org/W2146638929; https://openalex.org/W2562324168; https://openalex.org/W2592356138; https://openalex.org/W2594589186; https://openalex.org/W2601697486; https://openalex.org/W2617245318; https://openalex.org/W2618067250; https://openalex.org/W2618110297; https://openalex.org/W2620413123; https://openalex.org/W2620457709; https://openalex.org/W2760758743; https://openalex.org/W2772802389; https://openalex.org/W3122052499; https://openalex.org/W3159280209; https://openalex.org/W6630499190; https://openalex.org/W6735424081; https://openalex.org/W6850696550,Journal of Political Ecology,en,False -W1967360446,10.1016/j.ecolecon.2012.08.019,Classifying and valuing ecosystem services for urban planning,2012,,Erik Gómez‐Baggethun; David N. Barton,A5047258935; A5076044834,Universidad Autónoma de Madrid (ES); Universitat Autònoma de Barcelona (ES); Norwegian Institute for Nature Research (NO),Ecosystem services; Urban ecosystem; Ecosystem valuation; Valuation (finance); Environmental resource management; Ecosystem health; Natural capital; Environmental planning; Business; Urban planning; Urbanization; Ecosystem; Geography; Ecology; Economic growth; Economics,ecosystem-services; urban-ecosystem; ecosystem-valuation; valuation; environmental-resource-management; ecosystem-health; natural-capital; environmental-planning; business; urban-planning; urbanization; ecosystem; geography; ecology; economic-growth; economics,https://openalex.org/W23687525; https://openalex.org/W32759665; https://openalex.org/W49771169; https://openalex.org/W93598551; https://openalex.org/W115394847; https://openalex.org/W118586622; https://openalex.org/W121311783; https://openalex.org/W170055257; https://openalex.org/W223539122; https://openalex.org/W353006067; https://openalex.org/W625547448; https://openalex.org/W884602397; https://openalex.org/W1480313761; https://openalex.org/W1481664197; https://openalex.org/W1482252354; https://openalex.org/W1483294716; https://openalex.org/W1496684753; https://openalex.org/W1506420918; https://openalex.org/W1515352398; https://openalex.org/W1540810178; https://openalex.org/W1543060629; https://openalex.org/W1550973209; https://openalex.org/W1557892264; https://openalex.org/W1568997834; https://openalex.org/W1578130959; https://openalex.org/W1594976441; https://openalex.org/W1597336755; https://openalex.org/W1744548356; https://openalex.org/W1763861884; https://openalex.org/W1810922710; https://openalex.org/W1829464153; https://openalex.org/W1912501444; https://openalex.org/W1952596777; https://openalex.org/W1965948158; https://openalex.org/W1966742813; https://openalex.org/W1967904512; https://openalex.org/W1971306837; https://openalex.org/W1978430273; https://openalex.org/W1979586283; https://openalex.org/W1981426302; https://openalex.org/W1983070409; https://openalex.org/W1989733534; https://openalex.org/W1990661456; https://openalex.org/W1992564957; https://openalex.org/W1995622160; https://openalex.org/W1995810372; https://openalex.org/W1997976641; https://openalex.org/W1999392262; https://openalex.org/W2000114865; https://openalex.org/W2003605835; https://openalex.org/W2013272331; https://openalex.org/W2013942505; https://openalex.org/W2014151831; https://openalex.org/W2017832456; https://openalex.org/W2020156654; https://openalex.org/W2020199061; https://openalex.org/W2025361974; https://openalex.org/W2026865252; https://openalex.org/W2026866485; https://openalex.org/W2029393861; https://openalex.org/W2031382955; https://openalex.org/W2037025736; https://openalex.org/W2038540510; https://openalex.org/W2039362164; https://openalex.org/W2039767034; https://openalex.org/W2042359144; https://openalex.org/W2042505652; https://openalex.org/W2045791326; https://openalex.org/W2045952749; https://openalex.org/W2049377387; https://openalex.org/W2053571334; https://openalex.org/W2055036922; https://openalex.org/W2055891847; https://openalex.org/W2055971368; https://openalex.org/W2056196195; https://openalex.org/W2056636584; https://openalex.org/W2060788579; https://openalex.org/W2062505214; https://openalex.org/W2062896939; https://openalex.org/W2064215173; https://openalex.org/W2073209479; https://openalex.org/W2076086867; https://openalex.org/W2079194441; https://openalex.org/W2082317060; https://openalex.org/W2083521896; https://openalex.org/W2083549445; https://openalex.org/W2083551253; https://openalex.org/W2085741390; https://openalex.org/W2087087771; https://openalex.org/W2093054800; https://openalex.org/W2095822147; https://openalex.org/W2097908993; https://openalex.org/W2097935015; https://openalex.org/W2100306352; https://openalex.org/W2103948957; https://openalex.org/W2105273997; https://openalex.org/W2105785737; https://openalex.org/W2109192612; https://openalex.org/W2111915155; https://openalex.org/W2112061527; https://openalex.org/W2113659878; https://openalex.org/W2113908401; https://openalex.org/W2116298059; https://openalex.org/W2116335571; https://openalex.org/W2119119035; https://openalex.org/W2121055000; https://openalex.org/W2121623889; https://openalex.org/W2125084023; https://openalex.org/W2125263324; https://openalex.org/W2127476821; https://openalex.org/W2129974232; https://openalex.org/W2131236975; https://openalex.org/W2131487209; https://openalex.org/W2134172371; https://openalex.org/W2135766384; https://openalex.org/W2139355960; https://openalex.org/W2140967696; https://openalex.org/W2145357497; https://openalex.org/W2146205007; https://openalex.org/W2147106775; https://openalex.org/W2151215040; https://openalex.org/W2151303390; https://openalex.org/W2152470386; https://openalex.org/W2153779825; https://openalex.org/W2155048660; https://openalex.org/W2157015782; https://openalex.org/W2162927621; https://openalex.org/W2165049059; https://openalex.org/W2176202906; https://openalex.org/W2180198116; https://openalex.org/W2265414043; https://openalex.org/W2318160089; https://openalex.org/W2336638668; https://openalex.org/W2372261786; https://openalex.org/W2401731262; https://openalex.org/W2506396755; https://openalex.org/W2589919727; https://openalex.org/W2781684356; https://openalex.org/W2911125293; https://openalex.org/W2918256237; https://openalex.org/W2955563833; https://openalex.org/W2979050244; https://openalex.org/W2999405483; https://openalex.org/W3087415472; https://openalex.org/W3121703175; https://openalex.org/W3204017152; https://openalex.org/W4285719527; https://openalex.org/W6600930186; https://openalex.org/W6601964155; https://openalex.org/W6603685060; https://openalex.org/W6604809202; https://openalex.org/W6630770533; https://openalex.org/W6635343553; https://openalex.org/W6676985424; https://openalex.org/W6677958204; https://openalex.org/W6681996459; https://openalex.org/W6747770711; https://openalex.org/W6764925827; https://openalex.org/W6772569954,Ecological Economics,en,False -W2048051304,10.1016/j.gloenvcha.2014.10.014,Reversing the arrow of arrears: The concept of “ecological debt” and its value for environmental justice,2014,,Rikard Warlenius; Gregory Pierce; Vasna Ramasar,A5020507738; A5053292068; A5024246120,Lund University (SE); Lund University (SE); Lund University (SE),Debt; Ecological economics; Environmental justice; Value (mathematics); Environmental law; Ecology; Sociology; Political science; Economics; Law; Sustainability; Finance; Biology,debt; ecological-economics; environmental-justice; value; environmental-law; ecology; sociology; political-science; economics; law; sustainability; finance; biology,https://openalex.org/W147937154; https://openalex.org/W222966551; https://openalex.org/W401135514; https://openalex.org/W568129555; https://openalex.org/W591561411; https://openalex.org/W1503706120; https://openalex.org/W1557989049; https://openalex.org/W1566890474; https://openalex.org/W1591166682; https://openalex.org/W1595403411; https://openalex.org/W1907583418; https://openalex.org/W1963798495; https://openalex.org/W1973176252; https://openalex.org/W1996628034; https://openalex.org/W2002033694; https://openalex.org/W2012254774; https://openalex.org/W2013402297; https://openalex.org/W2021001691; https://openalex.org/W2030602370; https://openalex.org/W2056630963; https://openalex.org/W2056926496; https://openalex.org/W2085683054; https://openalex.org/W2089327955; https://openalex.org/W2091709473; https://openalex.org/W2128207432; https://openalex.org/W2137540105; https://openalex.org/W2138587975; https://openalex.org/W2148732650; https://openalex.org/W2159167826; https://openalex.org/W2164334321; https://openalex.org/W2319568853; https://openalex.org/W2578584143; https://openalex.org/W2592356138; https://openalex.org/W2611750131; https://openalex.org/W2758381682; https://openalex.org/W2772747987; https://openalex.org/W3048682234; https://openalex.org/W3121653486; https://openalex.org/W3159280209; https://openalex.org/W3164354311; https://openalex.org/W3196992440; https://openalex.org/W4391865359; https://openalex.org/W6734053437; https://openalex.org/W6795926756,Global Environmental Change,en,False -W1986875667,10.1007/s10668-009-9219-y,The concept of ecological debt: some steps towards an enriched sustainability paradigm,2009,,Gert Goeminne; Erik Paredis,A5007488495; A5041144613,Vrije Universiteit Brussel (BE); Ghent University Hospital (BE); Ghent University Hospital (BE),Sustainability; Debt; Environmental resource management; Conceptual framework; Ecology; Management science; Sociology; Computer science; Business; Economics; Social science; Biology; Finance,sustainability; debt; environmental-resource-management; conceptual-framework; ecology; management-science; sociology; computer-science; business; economics; social-science; biology; finance,https://openalex.org/W49479346; https://openalex.org/W401135514; https://openalex.org/W610363635; https://openalex.org/W644940498; https://openalex.org/W810233521; https://openalex.org/W1588713494; https://openalex.org/W1967820238; https://openalex.org/W1973176252; https://openalex.org/W1983188187; https://openalex.org/W2012254774; https://openalex.org/W2015442086; https://openalex.org/W2019674121; https://openalex.org/W2036713768; https://openalex.org/W2061355442; https://openalex.org/W2071810998; https://openalex.org/W2085683054; https://openalex.org/W2089327955; https://openalex.org/W2108291685; https://openalex.org/W2133644181; https://openalex.org/W2319568853; https://openalex.org/W2489573637; https://openalex.org/W2554800123; https://openalex.org/W2758381682; https://openalex.org/W2810203815; https://openalex.org/W2913390697; https://openalex.org/W2916743836; https://openalex.org/W2951306510; https://openalex.org/W3027532949; https://openalex.org/W3037339115; https://openalex.org/W3048682234; https://openalex.org/W3159280209; https://openalex.org/W4241852105; https://openalex.org/W4243660887; https://openalex.org/W4252474431; https://openalex.org/W4300304138; https://openalex.org/W6676229473; https://openalex.org/W6730305667; https://openalex.org/W6744584497; https://openalex.org/W6752696883; https://openalex.org/W6832168704,Environment Development and Sustainability,en,False -W2951306510,10.4324/9781849771771-10,"Environmental Space, Equity and the Ecological Debt",2012,,Duncan McLaren,A5063262748,,Equity (law); Debt; Space (punctuation); Economics; Ecology; Geography; Business; Political science; Finance; Computer science; Biology,equity; debt; space; economics; ecology; geography; business; political-science; finance; computer-science; biology,,,en,False -W2137540105,10.1177/0896920508099193,North—South Relations and the Ecological Debt: Asserting a Counter-Hegemonic Discourse,2009,"We examine position papers by non-governmental organizations (NGOs) arguing for recognition of the ecological debt. We utilize Toulmin's (2003[1958]) model of argument analysis to outline the major claims advanced. The results illustrate the argument is comprised of four interrelated claims: 1) Northern historical development and present disproportionate production and consumption are founded on a socio-ecological subsidy or the underpayment and, at times, explicit looting of the natural resource assets of Southern countries; 2) the Southern external financial debt should be cancelled because it promotes the socio-ecological subsidy; 3) levels of Northern production and consumption are unsustainable over the long term because they are predicated on the North—South socio-ecological subsidy; 4) equity for present and rational obligations to future generations demands Northern countries begin paying back the accrued socio-ecological subsidy, an obligation defined as the ecological debt.",James Rice,A5048848430,New Mexico State University (US),Subsidy; Debt; Consumption (sociology); Economics; Argument (complex analysis); Equity (law); Hegemony; Ecological economics; Ecology; Economy; Sociology; Political science; Market economy; Sustainability; Law; Finance; Social science; Politics,subsidy; debt; consumption; economics; argument; equity; hegemony; ecological-economics; ecology; economy; sociology; political-science; market-economy; sustainability; law; finance; social-science; politics,https://openalex.org/W156951739; https://openalex.org/W191687221; https://openalex.org/W254725204; https://openalex.org/W651598703; https://openalex.org/W1966138599; https://openalex.org/W1973176252; https://openalex.org/W1980186344; https://openalex.org/W1997210479; https://openalex.org/W2012254774; https://openalex.org/W2027221797; https://openalex.org/W2030978014; https://openalex.org/W2036713768; https://openalex.org/W2045488269; https://openalex.org/W2056926496; https://openalex.org/W2059612188; https://openalex.org/W2082879918; https://openalex.org/W2085683054; https://openalex.org/W2091709473; https://openalex.org/W2093703872; https://openalex.org/W2101108903; https://openalex.org/W2104859737; https://openalex.org/W2119211517; https://openalex.org/W2123098762; https://openalex.org/W2126212614; https://openalex.org/W2142043891; https://openalex.org/W2166241449; https://openalex.org/W2169776575; https://openalex.org/W2188254548; https://openalex.org/W2279795386; https://openalex.org/W3048682234; https://openalex.org/W3159280209; https://openalex.org/W4232387830; https://openalex.org/W4233203094; https://openalex.org/W4241852105; https://openalex.org/W4254245014,Critical Sociology,en,False -W4400018219,10.2307/jj.16275969.4,ECOLOGICAL DEBT:,2009,,Ariel Salleh,A5050075228,,Ecology; Geography; Economics; Environmental science; Biology,ecology; geography; economics; environmental-science; biology,,Pluto Press eBooks,en,False -W2108953279,10.1177/1086026610385903,"Natural Resource Extraction, Armed Violence, and Environmental Degradation",2010,"The goal of this article is to demonstrate that environmental sociologists cannot fully explain the relationship between humans and the natural world without theorizing a link between natural resource extraction, armed violence, and environmental degradation. The authors begin by arguing that armed violence is one of several overlapping mechanisms that provide powerful actors with the means to (a) prevail over others in conflicts over natural resources and (b) ensure that natural resources critical to industrial production and state power continue to be extracted and sold in sufficient quantities to promote capital accumulation, state power, and ecological unequal exchange. The authors then identify 10 minerals that are critical to the functioning of the U.S. economy and/or military and demonstrate that the extraction of these minerals often involves the use of armed violence. They further demonstrate that armed violence is associated with the activities of the world's three largest mining companies, with African mines that receive World Bank funding, and with petroleum and rainforest timber extraction. The authors conclude that the natural resource base on which industrial societies stand is constructed in large part through the use and threatened use of armed violence. As a result, armed violence plays a critical role in fostering environmental degradation and ecological unequal exchange.",Liam Downey; Eric Bonds; Katherine Clark,A5054738225; A5039102853; A5042577538,University of Colorado Boulder (US); University of Colorado Boulder (US); University of Colorado Boulder (US),Natural resource; Environmental degradation; Natural (archaeology); Resource (disambiguation); Environmental planning; Environmental resource management; Environmental science; Computer science; Political science; Geography; Ecology,natural-resource; environmental-degradation; natural; resource; environmental-planning; environmental-resource-management; environmental-science; computer-science; political-science; geography; ecology,https://openalex.org/W117956444; https://openalex.org/W389691207; https://openalex.org/W397816860; https://openalex.org/W416238589; https://openalex.org/W417693152; https://openalex.org/W590315936; https://openalex.org/W619831140; https://openalex.org/W624601757; https://openalex.org/W638714931; https://openalex.org/W1482286954; https://openalex.org/W1508764670; https://openalex.org/W1509006868; https://openalex.org/W1526407077; https://openalex.org/W1558825610; https://openalex.org/W1590831936; https://openalex.org/W1978972867; https://openalex.org/W1982690502; https://openalex.org/W1990164247; https://openalex.org/W1990960672; https://openalex.org/W2013694221; https://openalex.org/W2033082879; https://openalex.org/W2040836015; https://openalex.org/W2048293151; https://openalex.org/W2070152105; https://openalex.org/W2070344959; https://openalex.org/W2075340793; https://openalex.org/W2081265676; https://openalex.org/W2089188580; https://openalex.org/W2093230995; https://openalex.org/W2094745203; https://openalex.org/W2096565435; https://openalex.org/W2108057681; https://openalex.org/W2115328246; https://openalex.org/W2149022830; https://openalex.org/W2149047800; https://openalex.org/W2327298447; https://openalex.org/W2332541332; https://openalex.org/W2333578156; https://openalex.org/W2801582997; https://openalex.org/W3049491599; https://openalex.org/W4213156901; https://openalex.org/W4232492387; https://openalex.org/W4235844245; https://openalex.org/W4237476521; https://openalex.org/W4247020758; https://openalex.org/W4300360800; https://openalex.org/W4301175738; https://openalex.org/W4319588009; https://openalex.org/W4386178082; https://openalex.org/W4394717023,Organization & Environment,en,False -W2104859737,10.1080/104557502101245404,Ecological Debt and Property Rights on Carbon Sinks and Reservoirs,2002,"(2002). Ecological Debt and Property Rights on Carbon Sinks and Reservoirs. Capitalism Nature Socialism: Vol. 13, No. 1, pp. 115-119.",Joan Martínez Alier,A5004042357,,Socialism; Capitalism; Property rights; Debt; Property (philosophy); Carbon fibers; Economic system; Natural resource economics; Ecology; Economics; Political science; Business; Environmental science; Finance; Law; Biology; Microeconomics; Philosophy; Materials science; Politics,socialism; capitalism; property-rights; debt; property; carbon-fibers; economic-system; natural-resource-economics; ecology; economics; political-science; business; environmental-science; finance; law; biology; microeconomics; philosophy; materials-science; politics,,Capitalism Nature Socialism,en,False -W2048293151,10.1177/0020715209105140,The Transnational Organization of Production and Uneven Environmental Degradation and Change in the World Economy,2009,"The intent of the present article is to expand upon the discussion concerning the transnational organization of production, the treadmill logic which drives this organization, and highlight theoretical and empirical research regarding ecological unequal exchange, which we envision as a central dynamic enhancing capital accumulation within the world economy. Ecological unequal exchange refers to the environmentally damaging withdrawal of energy and other natural resources and the addition or externalization of environmentally damaging production and disposal activities within the periphery of the world-system as a consequence of exchange relations with more industrialized countries. It is based upon both the obtainment of natural capital and the usurpation of sink-capacity or waste assimilation properties of ecological systems in a manner that enlarges the domestic carrying capacity of the industrialized countries to the detriment of peripheral societies. Future research oriented towards further articulating the political-economic processes underlying ecological unequal exchange dynamics holds the potential to contribute to a more refined dialogue and debate regarding the prospects for the sustainable development of human societies.",James Rice,A5048848430,New Mexico State University (US),Environmental degradation; Economic system; World economy; Sustainable development; Production (economics); Economics; Natural resource; Human capital; Economy; Business; Ecology; Economic growth,environmental-degradation; economic-system; world-economy; sustainable-development; production; economics; natural-resource; human-capital; economy; business; ecology; economic-growth,https://openalex.org/W204270373; https://openalex.org/W619831140; https://openalex.org/W651598703; https://openalex.org/W1497773661; https://openalex.org/W1509006868; https://openalex.org/W1509209592; https://openalex.org/W1518806022; https://openalex.org/W1526407077; https://openalex.org/W1551322995; https://openalex.org/W1569664822; https://openalex.org/W1572762085; https://openalex.org/W1583902308; https://openalex.org/W1687549561; https://openalex.org/W1968305520; https://openalex.org/W1982690502; https://openalex.org/W1983474380; https://openalex.org/W1990164247; https://openalex.org/W1996199418; https://openalex.org/W2013402297; https://openalex.org/W2019093495; https://openalex.org/W2030978014; https://openalex.org/W2036713768; https://openalex.org/W2039073802; https://openalex.org/W2040057718; https://openalex.org/W2041137602; https://openalex.org/W2048664497; https://openalex.org/W2049466825; https://openalex.org/W2052400186; https://openalex.org/W2062232620; https://openalex.org/W2069332984; https://openalex.org/W2083319128; https://openalex.org/W2087385946; https://openalex.org/W2091709473; https://openalex.org/W2099961141; https://openalex.org/W2100231337; https://openalex.org/W2100884759; https://openalex.org/W2101108903; https://openalex.org/W2101119900; https://openalex.org/W2101325537; https://openalex.org/W2108057681; https://openalex.org/W2117981547; https://openalex.org/W2119211517; https://openalex.org/W2123826585; https://openalex.org/W2126212614; https://openalex.org/W2143917121; https://openalex.org/W2148732650; https://openalex.org/W2166671387; https://openalex.org/W2169776575; https://openalex.org/W2170219305; https://openalex.org/W2174143613; https://openalex.org/W2182089091; https://openalex.org/W2184765626; https://openalex.org/W2274106087; https://openalex.org/W2274245168; https://openalex.org/W2279795386; https://openalex.org/W2288595092; https://openalex.org/W2321434398; https://openalex.org/W2331134723; https://openalex.org/W2345240133; https://openalex.org/W2526098611; https://openalex.org/W2578584143; https://openalex.org/W2617515511; https://openalex.org/W2796317886; https://openalex.org/W2803072236; https://openalex.org/W2939094508; https://openalex.org/W3123592998; https://openalex.org/W3159280209; https://openalex.org/W4206802175; https://openalex.org/W4214548923; https://openalex.org/W4241852105; https://openalex.org/W4247796865; https://openalex.org/W4249632517; https://openalex.org/W4255576894; https://openalex.org/W4285719527; https://openalex.org/W4300360800; https://openalex.org/W4319588009,International Journal of Comparative Sociology,en,False -W4401069570,10.1016/j.tree.2024.07.002,Ecological debts induced by heat extremes,2024,"Heat extremes have become the new norm in the Anthropocene. Their potential to trigger major ecological responses is widely acknowledged, but their unprecedented severity hinders our ability to predict the magnitude of such responses, both during and after extreme heat events. To address this challenge we propose a conceptual framework inspired by the core concepts of ecological stability and thermal biology to depict how responses of populations and communities accumulate at three response stages (exposure, resistance, and recovery). Biological mechanisms mitigating responses at a given stage incur associated costs that only become apparent at other response stages; these are known as 'ecological debts'. We outline several scenarios for how ecological responses associate with debts to better understand biodiversity changes caused by heat extremes.",Gerard Martínez‐De León; Madhav P. Thakur,A5033341488; A5007221758,University of Bern (CH); University of Bern (CH),Ecology; Anthropocene; Biodiversity; Debt; Climate change; Environmental resource management; Biology; Environmental science; Economics,ecology; anthropocene; biodiversity; debt; climate-change; environmental-resource-management; biology; environmental-science; economics,https://openalex.org/W1512370820; https://openalex.org/W1574421132; https://openalex.org/W1604509704; https://openalex.org/W1978503775; https://openalex.org/W1980404368; https://openalex.org/W1992244678; https://openalex.org/W2007120691; https://openalex.org/W2008059407; https://openalex.org/W2041982026; https://openalex.org/W2050858470; https://openalex.org/W2055116474; https://openalex.org/W2075946103; https://openalex.org/W2091074640; https://openalex.org/W2104973579; https://openalex.org/W2117400326; https://openalex.org/W2117706404; https://openalex.org/W2118337700; https://openalex.org/W2123386026; https://openalex.org/W2130385086; https://openalex.org/W2131045871; https://openalex.org/W2140847080; https://openalex.org/W2145820498; https://openalex.org/W2158321278; https://openalex.org/W2220700318; https://openalex.org/W2261671681; https://openalex.org/W2284669351; https://openalex.org/W2327696339; https://openalex.org/W2330949818; https://openalex.org/W2342479537; https://openalex.org/W2411690146; https://openalex.org/W2485490013; https://openalex.org/W2508512371; https://openalex.org/W2525809904; https://openalex.org/W2613361848; https://openalex.org/W2613636640; https://openalex.org/W2731464211; https://openalex.org/W2765899323; https://openalex.org/W2766531104; https://openalex.org/W2788933461; https://openalex.org/W2809648736; https://openalex.org/W2902891963; https://openalex.org/W2909190731; https://openalex.org/W2926335840; https://openalex.org/W2926961192; https://openalex.org/W2949382350; https://openalex.org/W2952286408; https://openalex.org/W2956694137; https://openalex.org/W2965549179; https://openalex.org/W2966652567; https://openalex.org/W2999260711; https://openalex.org/W3004989685; https://openalex.org/W3008040120; https://openalex.org/W3023186923; https://openalex.org/W3036732835; https://openalex.org/W3081568437; https://openalex.org/W3083358975; https://openalex.org/W3087646956; https://openalex.org/W3089859006; https://openalex.org/W3090725528; https://openalex.org/W3092211264; https://openalex.org/W3094688652; https://openalex.org/W3126829818; https://openalex.org/W3135870899; https://openalex.org/W3138125591; https://openalex.org/W3153504491; https://openalex.org/W3177052045; https://openalex.org/W3183552297; https://openalex.org/W3185009012; https://openalex.org/W3188840573; https://openalex.org/W3196596956; https://openalex.org/W3202497626; https://openalex.org/W3215426448; https://openalex.org/W4200200708; https://openalex.org/W4220740641; https://openalex.org/W4221102046; https://openalex.org/W4225524936; https://openalex.org/W4281261659; https://openalex.org/W4281617394; https://openalex.org/W4292148468; https://openalex.org/W4292315840; https://openalex.org/W4296698538; https://openalex.org/W4298088823; https://openalex.org/W4300689515; https://openalex.org/W4308307224; https://openalex.org/W4311503626; https://openalex.org/W4311532616; https://openalex.org/W4312157409; https://openalex.org/W4317242233; https://openalex.org/W4317874579; https://openalex.org/W4318071662; https://openalex.org/W4319656044; https://openalex.org/W4323661018; https://openalex.org/W4353015204; https://openalex.org/W4383228121; https://openalex.org/W4384923447; https://openalex.org/W4385568992; https://openalex.org/W4386919492; https://openalex.org/W4386954376; https://openalex.org/W4388425161; https://openalex.org/W4394614104; https://openalex.org/W6636226513; https://openalex.org/W6782074871; https://openalex.org/W6784677898; https://openalex.org/W6809913591,Trends in Ecology & Evolution,en,False -W4292338315,10.1088/1748-9326/ac5f95,"Ecological unequal exchange: quantifying emissions of toxic chemicals embodied in the global trade of chemicals, products, and waste",2022,"Abstract Ecologically unequal exchange arises if more developed economies (‘core’) shift the environmental burden of their consumption and capital accumulation to less developed economies (‘periphery’/‘semi-core’). Here we demonstrate that human populations in core regions can benefit from the use of products containing toxic chemicals while transferring to the periphery the risk of human and ecological exposure to emissions associated with manufacturing and waste disposal. We use a global scale substance flow analysis approach to quantify the emissions of polybrominated diphenyl ethers (PBDEs), a group of flame retardants added to consumer products, that are embodied in the trade of chemicals, products and wastes between seven world regions over the 2000–2020 time period. We find that core regions have off-loaded PBDE emissions, mostly associated with the disposal of electrical and electronic waste (e-waste), to semi-core and peripheral regions in mainland China and the Global South. In core regions this results in small emissions that mostly occur during the product use phase, whereas in peripheral regions emissions are much higher and dominated by end of life disposal. The transfer of toxic chemical emissions between core and periphery can be quantified and should be accounted for when appraising the costs and benefits of global trade relationships.",Kate Tong; Li Li; Knut Breivik; Frank Wania,A5043194607; A5100361186; A5033816340; A5091794038,"University of Toronto (CA); The Scarborough Hospital (CA); University of Nevada, Reno (US); NILU (NO); University of Toronto (CA); The Scarborough Hospital (CA)",Environmental science; Polybrominated diphenyl ethers; Core (optical fiber); Mainland China; Consumption (sociology); Product (mathematics); Natural resource economics; China; Business; Ecology; Pollutant; Economics; Engineering; Geography; Biology,environmental-science; polybrominated-diphenyl-ethers; core; mainland-china; consumption; product; natural-resource-economics; china; business; ecology; pollutant; economics; engineering; geography; biology,https://openalex.org/W602304841; https://openalex.org/W1602862435; https://openalex.org/W1974875802; https://openalex.org/W1991748615; https://openalex.org/W1992683955; https://openalex.org/W1995997697; https://openalex.org/W1997508526; https://openalex.org/W2013613091; https://openalex.org/W2014714853; https://openalex.org/W2016026479; https://openalex.org/W2016466957; https://openalex.org/W2029686895; https://openalex.org/W2038770449; https://openalex.org/W2056926496; https://openalex.org/W2057796385; https://openalex.org/W2058971325; https://openalex.org/W2059473546; https://openalex.org/W2095568477; https://openalex.org/W2097169217; https://openalex.org/W2105456127; https://openalex.org/W2117216350; https://openalex.org/W2195484168; https://openalex.org/W2308866298; https://openalex.org/W2505135441; https://openalex.org/W2507896846; https://openalex.org/W2599875507; https://openalex.org/W2803186374; https://openalex.org/W2804725826; https://openalex.org/W2945875354; https://openalex.org/W2991062290; https://openalex.org/W3091914576; https://openalex.org/W3125862735; https://openalex.org/W4200272527; https://openalex.org/W4206351340; https://openalex.org/W4300113213,Environmental Research Letters,en,False -W2930040016,10.1111/soc4.12693,Ecologically unequal exchange: A theory of global environmental in justice,2019,"Abstract In this article, we review the theory of ecologically unequal exchange and its relevance for global environmental injustice. According to this theory, global political–economic factors, especially the structure of international trade, shape the unequal distribution of environmental harms and human development; wealthier and more powerful Global North nations have disproportionate access to both natural resources and sink capacity for waste in Global South nations. We discuss how the theory has roots in multiple perspectives on development, world‐systems analysis, environmental sociology, and ecological economics. We detail research that tests hypotheses derived from ecological unequal exchange theory on several environmental harms, including deforestation, greenhouse gas emissions, biodiversity loss, and water pollution as well as related human well‐being outcomes. We also discuss research on social forces that counter the harmful impacts of ecologically unequal exchange, including institutions, organizations, and environmental justice movements. We suggest that ecologically unequal exchange theory provides an important global political–economic approach for research in environmental sociology and other environmental social sciences as well as for sustainability studies more broadly.",Jennifer E. Givens; Xiaorui Huang; Andrew K. Jorgenson,A5008980382; A5003829664; A5017287640,Utah State University (US); Boston College (US); Boston College (US),Environmental sociology; Sustainability; Environmental justice; Injustice; Natural resource; Sociology; Politics; Environmental studies; Ecological modernization; Economics; Environmental ethics; Ecology; Social science; Political science; Biology; Law,environmental-sociology; sustainability; environmental-justice; injustice; natural-resource; sociology; politics; environmental-studies; ecological-modernization; economics; environmental-ethics; ecology; social-science; political-science; biology; law,https://openalex.org/W21053915; https://openalex.org/W392175924; https://openalex.org/W564021603; https://openalex.org/W619831140; https://openalex.org/W651598703; https://openalex.org/W1504658872; https://openalex.org/W1509006868; https://openalex.org/W1527254452; https://openalex.org/W1542915826; https://openalex.org/W1551322995; https://openalex.org/W1572762085; https://openalex.org/W1576743615; https://openalex.org/W1591166682; https://openalex.org/W1750986932; https://openalex.org/W1845845515; https://openalex.org/W1862702728; https://openalex.org/W1966605003; https://openalex.org/W1968441806; https://openalex.org/W1973954730; https://openalex.org/W1978300657; https://openalex.org/W1983474380; https://openalex.org/W1983716515; https://openalex.org/W1983784355; https://openalex.org/W1986552857; https://openalex.org/W1990164247; https://openalex.org/W1991239653; https://openalex.org/W1994726768; https://openalex.org/W1997466867; https://openalex.org/W2003242061; https://openalex.org/W2006759735; https://openalex.org/W2013091981; https://openalex.org/W2013402297; https://openalex.org/W2020935901; https://openalex.org/W2020950665; https://openalex.org/W2030680762; https://openalex.org/W2038398724; https://openalex.org/W2041490855; https://openalex.org/W2043201903; https://openalex.org/W2048051304; https://openalex.org/W2056926496; https://openalex.org/W2057810683; https://openalex.org/W2069332984; https://openalex.org/W2075340793; https://openalex.org/W2087385946; https://openalex.org/W2091709473; https://openalex.org/W2091748877; https://openalex.org/W2093580857; https://openalex.org/W2096565435; https://openalex.org/W2101108903; https://openalex.org/W2104679059; https://openalex.org/W2115328246; https://openalex.org/W2119211517; https://openalex.org/W2126212614; https://openalex.org/W2128555255; https://openalex.org/W2134016622; https://openalex.org/W2141833713; https://openalex.org/W2142043891; https://openalex.org/W2143917121; https://openalex.org/W2154286831; https://openalex.org/W2167545656; https://openalex.org/W2169566190; https://openalex.org/W2169776575; https://openalex.org/W2174103482; https://openalex.org/W2174143613; https://openalex.org/W2182089091; https://openalex.org/W2184625852; https://openalex.org/W2186681442; https://openalex.org/W2195484168; https://openalex.org/W2274762189; https://openalex.org/W2279795386; https://openalex.org/W2291058877; https://openalex.org/W2318673027; https://openalex.org/W2321434398; https://openalex.org/W2325659324; https://openalex.org/W2342655129; https://openalex.org/W2347141676; https://openalex.org/W2559805026; https://openalex.org/W2562324168; https://openalex.org/W2579888126; https://openalex.org/W2594589186; https://openalex.org/W2601697486; https://openalex.org/W2617245318; https://openalex.org/W2618067250; https://openalex.org/W2743178718; https://openalex.org/W2743381055; https://openalex.org/W2743592665; https://openalex.org/W2743816187; https://openalex.org/W2745006276; https://openalex.org/W2745249395; https://openalex.org/W2772693920; https://openalex.org/W2789494266; https://openalex.org/W2789854516; https://openalex.org/W2790147032; https://openalex.org/W2790286726; https://openalex.org/W2791909668; https://openalex.org/W2792425554; https://openalex.org/W2793864940; https://openalex.org/W2796817348; https://openalex.org/W2801608957; https://openalex.org/W2809710149; https://openalex.org/W2810012926; https://openalex.org/W2810843218; https://openalex.org/W2811136084; https://openalex.org/W2890144647; https://openalex.org/W2890848907; https://openalex.org/W2899009236; https://openalex.org/W2905655852; https://openalex.org/W2911646076; https://openalex.org/W3011395350; https://openalex.org/W3122477235; https://openalex.org/W3123592998; https://openalex.org/W3159280209; https://openalex.org/W3192802838; https://openalex.org/W3204258186; https://openalex.org/W4206802175; https://openalex.org/W4229773784; https://openalex.org/W4232543764; https://openalex.org/W4235510638; https://openalex.org/W4241755629; https://openalex.org/W4248342069,Sociology Compass,en,False -W1539308977,10.4324/9781849771771,Just Sustainabilities,2012,"Introduction: Joined-Up Thinking: Bringing Together Sustainability, Environmental Justice and Equity * Part 1 - Some Theories and Concepts: Environmental Space, Equity and the Ecological Debt * Neo-Liberalism, Globalization and the Struggle for Ecological Democracy: Linking Sustainability and Environmental Justice * Inequality and Community and the Challenge to Modernization: Evidence from the Nuclear Oases * Part 2 - Challenges: Social Justice and Environmental Sustainability: Ne'er the Twain Shall Meet * Part 3 - Cities, Communities and Social and Environmental Justice: When Consumption Does Violence: Can there be Sustainability and Environmental Justice in a Resource-Limited World? * Race, Politics and Pollution: Environmental Justice in the Mississippi River Chemical Corridor * Identity, Place and Communities of Resistance * Environmental Justice in State Policy Decisions * Part 4 - Selected Regional Perspectives on Sustainability and Environmental Justice: Sustainability and Equity: Reflection of a Local Government Practitioner in Southern Africa * Mining Conflicts, Environmental Justice and Valuation * Women and Environmental Justice in South Asia * Maori Kaupapa and the Inseparability of Social and Environmental Justice: An Analysis of Bioprospecting and a People's Resistance to Biocultural Assimilation * Political Economy of Petroleum Resources Development, Environmental Injustice and Selective Victimization: A Case Study of the Niger Delta Region of Nigeria * Environmental Protection, Economic Growth and Environmental Justice: Are They Compatible in Central and Eastern Europe? * the Campaign for Environmental Justice in Scotland as a Response to Poverty in a Northern Nation * Conclusion: Towards Just Sustainabilities: Perspectives and Possibilities * Index",,,,Psychology,psychology,,,en,False -W4403094069,10.1016/j.landusepol.2024.107378,Ecological unequal exchange: Evidence from imbalanced cropland soil erosion and agricultural value-added embodied in global agricultural trade,2024,,Guangyi Zhai; Keke Li; Huwei Cui; Zhen Wang; Ling Wang; Shuxia Yu; Zhihua Shi,A5114239456; A5100764802; A5005960026; A5100703397; A5100398679; A5015878848; A5066117382,Huazhong Agricultural University (CN); Huazhong Agricultural University (CN); Shanxi Academy of Building Research (CN); Huazhong Agricultural University (CN); Huazhong Agricultural University (CN); Huazhong Agricultural University (CN); Huazhong Agricultural University (CN),Agriculture; Value (mathematics); Ecology; Natural resource economics; Erosion; Agroforestry; Economics; Geography; Environmental science; Biology,agriculture; value; ecology; natural-resource-economics; erosion; agroforestry; economics; geography; environmental-science; biology,https://openalex.org/W1756771308; https://openalex.org/W1994291694; https://openalex.org/W1999687518; https://openalex.org/W1999800292; https://openalex.org/W2010497130; https://openalex.org/W2011487104; https://openalex.org/W2015576035; https://openalex.org/W2050901796; https://openalex.org/W2085959640; https://openalex.org/W2094119292; https://openalex.org/W2137538574; https://openalex.org/W2761050322; https://openalex.org/W2770259518; https://openalex.org/W2772366318; https://openalex.org/W2782111327; https://openalex.org/W2784325229; https://openalex.org/W2803186374; https://openalex.org/W2889413447; https://openalex.org/W2901680960; https://openalex.org/W2954095111; https://openalex.org/W2964767065; https://openalex.org/W3027625958; https://openalex.org/W3042715654; https://openalex.org/W3081374149; https://openalex.org/W3082861471; https://openalex.org/W3092296592; https://openalex.org/W3107063072; https://openalex.org/W3128603360; https://openalex.org/W3136167071; https://openalex.org/W3139350080; https://openalex.org/W3143824118; https://openalex.org/W3158842017; https://openalex.org/W3169474548; https://openalex.org/W3210969200; https://openalex.org/W3213426324; https://openalex.org/W4210795368; https://openalex.org/W4213325773; https://openalex.org/W4220684364; https://openalex.org/W4283662442; https://openalex.org/W4283768434; https://openalex.org/W4289884374; https://openalex.org/W4293202085; https://openalex.org/W4296743457; https://openalex.org/W4297996724; https://openalex.org/W4378782638; https://openalex.org/W4389839144; https://openalex.org/W6782577047; https://openalex.org/W6786154653,Land Use Policy,en,False -W4409540095,10.5195/jwsr.2025.1298,Ecological Unequal Exchange,2025,"The Marxist theory of unequal exchange challenges the idea that trade never results in outright losses. As a biophysical process, ecological unequal exchange reveals global disparities in resource flows. Using material flow analysis, alternative indicators, and new country clusters, this study updates earlier research and identifies a new phase of intensified disparities since 2015, with rising net outflows of resources from low-income countries (LICs) to high-income countries (HICs). From 1970 to 2024, HICs accumulated 290 gigatons (Gt) of raw material equivalents (RMEs) as net imports, while upper-middle-income, lower-middle-income, and low-income countries net-exported 164 Gt, 53.1 Gt, and 9.6 Gt, respectively. In a relative sense, LICs consume 13.3 percent less RMEs than they extract domestically, while HICs consume 25.4 percent more. This study challenges assumptions about global divisions of labor: not all HICs are net-importers of RMEs, nor are all LICs net-exporters. However, net-exporter HICs earn more than net-exporter LICs, and net-importer HICs spend less than net-importer LICs. On average, LICs export 6 tons of RMEs to earn what HICs earns from 1 ton; for net-exporter LICs, this ratio rises to 12.7 tons. The more a country exploits the environment, domestically or abroad, the more it earns.",Crelis Rammelt; Raimon C. Ylla-Catala,A5005445191; A5117191733,University of Amsterdam (NL); University of Amsterdam (NL),Ecology; Geography; Environmental science; Biology,ecology; geography; environmental-science; biology,https://openalex.org/W1738944162; https://openalex.org/W1983716515; https://openalex.org/W1990164247; https://openalex.org/W1997312490; https://openalex.org/W2056926496; https://openalex.org/W2059456161; https://openalex.org/W2074078642; https://openalex.org/W2088030007; https://openalex.org/W2111068618; https://openalex.org/W2115328246; https://openalex.org/W2119211517; https://openalex.org/W2162141368; https://openalex.org/W2169776575; https://openalex.org/W2291058877; https://openalex.org/W2321483768; https://openalex.org/W2345419491; https://openalex.org/W2557909387; https://openalex.org/W2562324168; https://openalex.org/W2618852203; https://openalex.org/W2729743235; https://openalex.org/W2737793390; https://openalex.org/W2743381055; https://openalex.org/W2788955535; https://openalex.org/W2811505433; https://openalex.org/W2980187407; https://openalex.org/W3083280272; https://openalex.org/W3097124494; https://openalex.org/W3109596871; https://openalex.org/W3144452147; https://openalex.org/W3175677670; https://openalex.org/W4206320582; https://openalex.org/W4212948295; https://openalex.org/W4281481120; https://openalex.org/W4292338315; https://openalex.org/W4388794117; https://openalex.org/W4396494537; https://openalex.org/W4396634190; https://openalex.org/W6642755805; https://openalex.org/W6657204294; https://openalex.org/W6751473861; https://openalex.org/W6831152815; https://openalex.org/W6850946828; https://openalex.org/W7057735341,Journal of World-Systems Research,en,False -W3209184812,10.1016/j.ecolecon.2021.107269,Ecological unequal exchange between Turkey and the European Union: An assessment from value added perspective,2021,,Gül İpek Tunç; Elif Akbostancı; Serap Türüt-Aşık,A5007464332; A5030808514; A5041222077,Middle East Technical University (TR); Middle East Technical University (TR); Middle East Technical University (TR),European union; Greenhouse gas; Context (archaeology); Economics; Value (mathematics); Consumption (sociology); International trade; International economics; Globalization; Added value; Goods and services; Agricultural economics; Natural resource economics; Business; Economy; Geography; Ecology; Macroeconomics; Market economy,european-union; greenhouse-gas; context; economics; value; consumption; international-trade; international-economics; globalization; added-value; goods-and-services; agricultural-economics; natural-resource-economics; business; economy; geography; ecology; macroeconomics; market-economy,https://openalex.org/W1588495026; https://openalex.org/W1616101857; https://openalex.org/W1970139579; https://openalex.org/W1992683955; https://openalex.org/W2013402297; https://openalex.org/W2030319020; https://openalex.org/W2041490855; https://openalex.org/W2056926496; https://openalex.org/W2069921900; https://openalex.org/W2102966366; https://openalex.org/W2111102226; https://openalex.org/W2119211517; https://openalex.org/W2156203513; https://openalex.org/W2159596579; https://openalex.org/W2162141368; https://openalex.org/W2181218826; https://openalex.org/W2321511225; https://openalex.org/W2321835891; https://openalex.org/W2347141676; https://openalex.org/W2557126631; https://openalex.org/W2788955535; https://openalex.org/W2930040016; https://openalex.org/W2979882099; https://openalex.org/W2991195287; https://openalex.org/W2995072805; https://openalex.org/W3010507923; https://openalex.org/W3016082502; https://openalex.org/W3083280272; https://openalex.org/W3097124494; https://openalex.org/W3125711463; https://openalex.org/W6636465677; https://openalex.org/W6776617174,Ecological Economics,en,False -W2562324168,10.2458/v23i1.20223,"Linking ecological debt and ecologically unequal exchange: stocks, flows, and unequal sink appropriation",2016,"Ecological debt is usually conceptualized as the accumulated result of different kinds of uneven flows of natural resources and waste, but these flows are seldom referred to as ecologically unequal exchange. Ecologically unequal exchange, on the other hand, is usually defined as different flows of resources and waste, but the accumulated results of these flows are seldom referred to as ecological debt. In this article, influential definitions and conceptualizations of ecological debt and ecologically unequal exchange are compared and the notions linked together analytically with a stock-flow perspective. A particular challenge is presented by emissions of substances that have global consequences, most importantly carbon dioxide and other greenhouse gases. They form part of ecologically unequal exchange, but what is unequal is not the exchange of resources or energy, but the appropriation of the sinks that absorb these substances. New concepts, unequal sink appropriation and the more specific carbon sink appropriation are proposed as a way of highlighting this distinction.",Rikard Warlenius,A5020507738,Lund University (SE),Appropriation; Natural resource economics; Greenhouse gas; Debt; Sink (geography); Carbon sink; Economics; Ecology; Business; Environmental science; Climate change; Geography; Finance; Biology,appropriation; natural-resource-economics; greenhouse-gas; debt; sink; carbon-sink; economics; ecology; business; environmental-science; climate-change; geography; finance; biology,https://openalex.org/W148464764; https://openalex.org/W222966551; https://openalex.org/W401135514; https://openalex.org/W591561411; https://openalex.org/W636349284; https://openalex.org/W651598703; https://openalex.org/W1247171326; https://openalex.org/W1509006868; https://openalex.org/W1557989049; https://openalex.org/W1569701617; https://openalex.org/W1572762085; https://openalex.org/W1591166682; https://openalex.org/W1687549561; https://openalex.org/W1738944162; https://openalex.org/W1760358764; https://openalex.org/W1873550992; https://openalex.org/W1966605003; https://openalex.org/W1970139579; https://openalex.org/W1973176252; https://openalex.org/W1974797333; https://openalex.org/W1986552857; https://openalex.org/W1988958743; https://openalex.org/W1990164247; https://openalex.org/W1996628034; https://openalex.org/W1997312490; https://openalex.org/W1999061137; https://openalex.org/W2003132638; https://openalex.org/W2006759735; https://openalex.org/W2012254774; https://openalex.org/W2013402297; https://openalex.org/W2030680762; https://openalex.org/W2030978014; https://openalex.org/W2031736557; https://openalex.org/W2032498967; https://openalex.org/W2040057718; https://openalex.org/W2041490855; https://openalex.org/W2048034272; https://openalex.org/W2048051304; https://openalex.org/W2048293151; https://openalex.org/W2051049084; https://openalex.org/W2056926496; https://openalex.org/W2057002878; https://openalex.org/W2057810683; https://openalex.org/W2059456161; https://openalex.org/W2085683054; https://openalex.org/W2089327955; https://openalex.org/W2091709473; https://openalex.org/W2091748877; https://openalex.org/W2100231337; https://openalex.org/W2108057681; https://openalex.org/W2119211517; https://openalex.org/W2137540105; https://openalex.org/W2142043891; https://openalex.org/W2167545656; https://openalex.org/W2169776575; https://openalex.org/W2184625852; https://openalex.org/W2319568853; https://openalex.org/W2329021176; https://openalex.org/W2581233708; https://openalex.org/W2618067250; https://openalex.org/W2949513949; https://openalex.org/W3159280209; https://openalex.org/W3216928223; https://openalex.org/W4236975506; https://openalex.org/W4298026979; https://openalex.org/W4298162800; https://openalex.org/W4300992326; https://openalex.org/W4312100536; https://openalex.org/W6628336124; https://openalex.org/W6630499190; https://openalex.org/W6634205608; https://openalex.org/W6639486880; https://openalex.org/W6658666898; https://openalex.org/W6660395347; https://openalex.org/W6671780278; https://openalex.org/W6675024767; https://openalex.org/W6850696550; https://openalex.org/W6986386144; https://openalex.org/W7002005117; https://openalex.org/W7014770401; https://openalex.org/W7056187441,Journal of Political Ecology,en,False -W2620457709,10.2458/v23i1.20222,Cumulative material flows provide indicators to quantify the ecological debt,2016,"There is ample evidence that an unabated growth in material consumption is likely to pass the earth system's source and sink capacities. In the face of limited resources, distributional questions increasingly gain importance. Material flow accounting is a methodological tool to trace biophysical patterns of disproportionate resource consumption across countries and the debt towards the environment, other parts of the world, and towards future generations through the excessive consumption of natural resources. At the core of this article, we address different developments of material use for individual countries and world regions from 1950 to 2010. During this phase, fossil fuel-based industrialization triggered an unprecedented growth in material consumption, mainly in the wealthy world regions of Europe, Australia, North America, and partly in the countries of the former Soviet Union, while low resource consumption persists in other regions. We thus calculated cumulative resource use from 1950 to 2010 to show the extent of this wealth built up upon countries' own resources, or through imports from other countries or world regions. We use the degree of net-import dependency of individual countries as a proxy for the ecological debt, and relate it to the domestic resource extraction in a country. Our observations show that there was a highly uneven distribution of resource extraction and use in the 60 years analyzed, which has important implications for future global resource policies.",Andreas Mayer; Willi Haas,A5101736941; A5090760544,,Natural resource; Natural resource economics; Proxy (statistics); Resource (disambiguation); Consumption (sociology); Debt; Industrialisation; Economics; Geography; Economic geography; Business; Ecology; Macroeconomics; Market economy,natural-resource; natural-resource-economics; proxy; resource; consumption; debt; industrialisation; economics; geography; economic-geography; business; ecology; macroeconomics; market-economy,https://openalex.org/W266724779; https://openalex.org/W651096281; https://openalex.org/W1540309666; https://openalex.org/W1567277510; https://openalex.org/W1571298011; https://openalex.org/W1577300141; https://openalex.org/W1865643671; https://openalex.org/W1965592156; https://openalex.org/W1967546379; https://openalex.org/W1980314759; https://openalex.org/W1986875667; https://openalex.org/W1992391390; https://openalex.org/W2010425532; https://openalex.org/W2017541733; https://openalex.org/W2023211834; https://openalex.org/W2024024581; https://openalex.org/W2026087447; https://openalex.org/W2028502628; https://openalex.org/W2028648240; https://openalex.org/W2030608117; https://openalex.org/W2043402897; https://openalex.org/W2045987553; https://openalex.org/W2048051304; https://openalex.org/W2061216116; https://openalex.org/W2075381148; https://openalex.org/W2083455829; https://openalex.org/W2085683054; https://openalex.org/W2086036483; https://openalex.org/W2088965446; https://openalex.org/W2089327955; https://openalex.org/W2090967692; https://openalex.org/W2093154430; https://openalex.org/W2096885696; https://openalex.org/W2101025401; https://openalex.org/W2105537763; https://openalex.org/W2113908401; https://openalex.org/W2124622654; https://openalex.org/W2126212614; https://openalex.org/W2128956132; https://openalex.org/W2133920545; https://openalex.org/W2143874113; https://openalex.org/W2144902479; https://openalex.org/W2151691147; https://openalex.org/W2153505582; https://openalex.org/W2153820558; https://openalex.org/W2156659366; https://openalex.org/W2160750143; https://openalex.org/W2164706901; https://openalex.org/W2167555648; https://openalex.org/W2179946186; https://openalex.org/W2275435861; https://openalex.org/W2319568853; https://openalex.org/W2898123036; https://openalex.org/W2951306510; https://openalex.org/W3106083306; https://openalex.org/W3159280209; https://openalex.org/W6609921129; https://openalex.org/W6657958280; https://openalex.org/W6669647426; https://openalex.org/W6675404599; https://openalex.org/W6675798746; https://openalex.org/W6850696550; https://openalex.org/W7056187441,Journal of Political Ecology,en,False -W4316371191,10.1016/j.apr.2023.101661,Ecological unequal exchange between China and European Union: An investigation from global value chains and carbon emissions viewpoint,2023,,Yulong Zhang; Cuiping Liao; Binbin Pan,A5100635551; A5048207347; A5068630072,Chinese Academy of Sciences (CN); Guangzhou Institute of Energy Conversion (CN); Guangzhou Institute of Energy Conversion (CN); Chinese Academy of Sciences (CN); Sun Yat-sen University (CN),China; European union; Value (mathematics); International trade; International economics; Business; Bilateral trade; Economics; Geography,china; european-union; value; international-trade; international-economics; business; bilateral-trade; economics; geography,https://openalex.org/W1997312490; https://openalex.org/W2051959187; https://openalex.org/W2346836002; https://openalex.org/W2760889115; https://openalex.org/W2800846169; https://openalex.org/W2809856553; https://openalex.org/W2887557516; https://openalex.org/W2902471502; https://openalex.org/W2913051656; https://openalex.org/W2917881351; https://openalex.org/W2943374163; https://openalex.org/W2945557658; https://openalex.org/W2954575718; https://openalex.org/W2972156512; https://openalex.org/W2995485375; https://openalex.org/W3010013823; https://openalex.org/W3094148576; https://openalex.org/W3097124494; https://openalex.org/W3100428128; https://openalex.org/W3119953297; https://openalex.org/W3125711463; https://openalex.org/W3127559052; https://openalex.org/W3158748634; https://openalex.org/W3188598489; https://openalex.org/W3201145281; https://openalex.org/W3212768009; https://openalex.org/W4200295247; https://openalex.org/W4226025179; https://openalex.org/W6762409507; https://openalex.org/W6771720264,Atmospheric Pollution Research,en,False -W1978028715,10.1080/15239081003719193,Ecological Debt: Exploring the Factors that Affect National Footprints,2010,"Environmental or ‘ecological’ footprints have been widely used as aggregate indicators of the human appropriation of natural capital with prevailing technology. They represent a partial measure of a community's pathway towards sustainable development. Footprints vary between countries at different stages of economic development and varying geographic characteristics. Dimensional analysis techniques from engineering and the thermal sciences have been employed to determine the influence of a wide range of parameters on per capita national footprints, including per capita national income, population density, pollutant emission intensity, local climate, soil productivity, and technology. One hundred and nine countries made up the final database (based on 2003 international statistical data sets). Per capita national environmental footprints are found to be strongly dependent on per capita national income, and only weakly on population density. The implications of the findings are illustrated by reference to the situation in the G8 + 5 nations. Variations about the resulting power–law correlation suggest the extent to which individual nations are frugal or profligate in terms of their resource use and environmental impacts. The ecological debt owed by the industrialized countries of the North to the developing nations of the populous South is highlighted.",Gemma Cranston; Geoffrey P. Hammond; R. C. Johnson,A5065872877; A5069523442; A5113609421,University of Bath (GB); University of Bath (GB); Centre for Sustainable Energy (GB); University of Bath (GB),Ecological footprint; Per capita; Population; Geography; Sustainability; Natural capital; Natural resource; Per capita income; Sustainable development; Natural resource economics; Gross national income; Gross domestic product; Economics; Ecology; Environmental resource management; Economic growth; Ecosystem services,ecological-footprint; per-capita; population; geography; sustainability; natural-capital; natural-resource; per-capita-income; sustainable-development; natural-resource-economics; gross-national-income; gross-domestic-product; economics; ecology; environmental-resource-management; economic-growth; ecosystem-services,https://openalex.org/W33517402; https://openalex.org/W49479346; https://openalex.org/W101135972; https://openalex.org/W280163183; https://openalex.org/W623224144; https://openalex.org/W644940498; https://openalex.org/W1483677947; https://openalex.org/W1524961168; https://openalex.org/W1539804594; https://openalex.org/W1581862528; https://openalex.org/W1970852348; https://openalex.org/W1989838436; https://openalex.org/W2031307450; https://openalex.org/W2033216070; https://openalex.org/W2047856663; https://openalex.org/W2057305715; https://openalex.org/W2061195351; https://openalex.org/W2072572975; https://openalex.org/W2103363550; https://openalex.org/W2116018954; https://openalex.org/W2127867569; https://openalex.org/W2554800123; https://openalex.org/W3037339115; https://openalex.org/W3135109524,Journal of Environmental Policy & Planning,en,False -W2592356138,10.2458/v21i1.21124,Between activism and science: grassroots concepts for sustainability coined by Environmental Justice Organizations,2014,"In their own battles and strategy meetings since the early 1980s, EJOs (environmental justice organizations) and their networks have introduced several concepts to political ecology that have also been taken up by academics and policy makers. In this paper, we explain the contexts in which such notions have arisen, providing definitions of a wide array of concepts and slogans related to environmental inequities and sustainability, and explore the connections and relations between them. These concepts include: environmental justice, ecological debt, popular epidemiology, environmental racism, climate justice, environmentalism of the poor, water justice, biopiracy, food sovereignty, ""green deserts"", ""peasant agriculture cools downs the Earth"", land grabbing, Ogonization and Yasunization, resource caps, corporate accountability, ecocide, and indigenous territorial rights, among others. We examine how activists have coined these notions and built demands around them, and how academic research has in turn further applied them and supplied other related concepts, working in a mutually reinforcing way with EJOs. We argue that these processes and dynamics build an activist-led and co-produced social sustainability science, furthering both academic scholarship and activism on environmental justice.",Joan Martínez Alier; Stanislav Shmelev,A5004042357; A5049502952,Universitat Autònoma de Barcelona (ES),Environmental justice; Environmentalism; Grassroots; Environmental ethics; Sustainability; Scholarship; Sociology; Indigenous; Political science; Political ecology; Climate justice; Environmental studies; Economic Justice; Politics; Law; Ecology; Climate change,environmental-justice; environmentalism; grassroots; environmental-ethics; sustainability; scholarship; sociology; indigenous; political-science; political-ecology; climate-justice; environmental-studies; economic-justice; politics; law; ecology; climate-change,https://openalex.org/W39838849; https://openalex.org/W82976660; https://openalex.org/W91194789; https://openalex.org/W147937154; https://openalex.org/W160500913; https://openalex.org/W193929132; https://openalex.org/W316671780; https://openalex.org/W435401431; https://openalex.org/W564851044; https://openalex.org/W568129555; https://openalex.org/W570650193; https://openalex.org/W571924660; https://openalex.org/W573704088; https://openalex.org/W573931508; https://openalex.org/W576583604; https://openalex.org/W578778883; https://openalex.org/W589250096; https://openalex.org/W591561411; https://openalex.org/W614736872; https://openalex.org/W616805653; https://openalex.org/W621862612; https://openalex.org/W622111395; https://openalex.org/W644940498; https://openalex.org/W654686773; https://openalex.org/W655364166; https://openalex.org/W656720890; https://openalex.org/W657620444; https://openalex.org/W1239215947; https://openalex.org/W1247171326; https://openalex.org/W1421354461; https://openalex.org/W1479808467; https://openalex.org/W1482149660; https://openalex.org/W1487319106; https://openalex.org/W1495278944; https://openalex.org/W1500660161; https://openalex.org/W1506954881; https://openalex.org/W1512117345; https://openalex.org/W1516080007; https://openalex.org/W1518215334; https://openalex.org/W1523248977; https://openalex.org/W1538244819; https://openalex.org/W1539308977; https://openalex.org/W1539621049; https://openalex.org/W1547879894; https://openalex.org/W1553033536; https://openalex.org/W1557989049; https://openalex.org/W1562479083; https://openalex.org/W1566890474; https://openalex.org/W1567962490; https://openalex.org/W1572893935; https://openalex.org/W1573302411; https://openalex.org/W1575914683; https://openalex.org/W1591166682; https://openalex.org/W1595403411; https://openalex.org/W1595652305; https://openalex.org/W1597172957; https://openalex.org/W1601590165; https://openalex.org/W1602775671; https://openalex.org/W1607813434; https://openalex.org/W1659143523; https://openalex.org/W1750986932; https://openalex.org/W1884434851; https://openalex.org/W1902314391; https://openalex.org/W1942258133; https://openalex.org/W1963684733; https://openalex.org/W1966605003; https://openalex.org/W1973176252; https://openalex.org/W1973318389; https://openalex.org/W1973954730; https://openalex.org/W1974075073; https://openalex.org/W1974564128; https://openalex.org/W1980314759; https://openalex.org/W1982053377; https://openalex.org/W1996316216; https://openalex.org/W1996349744; https://openalex.org/W1996628034; https://openalex.org/W1998173620; https://openalex.org/W1998742855; https://openalex.org/W2004961518; https://openalex.org/W2006467409; https://openalex.org/W2008114235; https://openalex.org/W2008996531; https://openalex.org/W2010516257; https://openalex.org/W2012254774; https://openalex.org/W2013402297; https://openalex.org/W2014182960; https://openalex.org/W2021001691; https://openalex.org/W2022814637; https://openalex.org/W2023723950; https://openalex.org/W2025982662; https://openalex.org/W2030655414; https://openalex.org/W2030787275; https://openalex.org/W2033583754; https://openalex.org/W2034283967; https://openalex.org/W2035353157; https://openalex.org/W2040538614; https://openalex.org/W2040777013; https://openalex.org/W2041819150; https://openalex.org/W2043070898; https://openalex.org/W2043699734; https://openalex.org/W2051321812; https://openalex.org/W2054308231; https://openalex.org/W2056926496; https://openalex.org/W2057357715; https://openalex.org/W2057931959; https://openalex.org/W2060306247; https://openalex.org/W2061668231; https://openalex.org/W2063059716; https://openalex.org/W2063877192; https://openalex.org/W2067361057; https://openalex.org/W2067580676; https://openalex.org/W2068549644; https://openalex.org/W2069878420; https://openalex.org/W2071735537; https://openalex.org/W2073478361; https://openalex.org/W2074580217; https://openalex.org/W2076362506; https://openalex.org/W2076566559; https://openalex.org/W2082793946; https://openalex.org/W2089327955; https://openalex.org/W2091709473; https://openalex.org/W2091795684; https://openalex.org/W2098871663; https://openalex.org/W2112560808; https://openalex.org/W2115012914; https://openalex.org/W2116417465; https://openalex.org/W2116575632; https://openalex.org/W2118434792; https://openalex.org/W2122325078; https://openalex.org/W2125058066; https://openalex.org/W2126585096; https://openalex.org/W2126838209; https://openalex.org/W2128207432; https://openalex.org/W2128697261; https://openalex.org/W2137540105; https://openalex.org/W2138587975; https://openalex.org/W2140675380; https://openalex.org/W2143132840; https://openalex.org/W2143767744; https://openalex.org/W2148732650; https://openalex.org/W2149970882; https://openalex.org/W2150141679; https://openalex.org/W2153194442; https://openalex.org/W2159167826; https://openalex.org/W2164334321; https://openalex.org/W2165082200; https://openalex.org/W2169091890; https://openalex.org/W2171848356; https://openalex.org/W2175723801; https://openalex.org/W2212707908; https://openalex.org/W2298327222; https://openalex.org/W2302608887; https://openalex.org/W2319568853; https://openalex.org/W2320646653; https://openalex.org/W2487318391; https://openalex.org/W2488167377; https://openalex.org/W2509117576; https://openalex.org/W2558607969; https://openalex.org/W2565699167; https://openalex.org/W2568822415; https://openalex.org/W2578584143; https://openalex.org/W2580230008; https://openalex.org/W2592836093; https://openalex.org/W2603115376; https://openalex.org/W2604442016; https://openalex.org/W2606168528; https://openalex.org/W2741785244; https://openalex.org/W2753514269; https://openalex.org/W2761366574; https://openalex.org/W2765155369; https://openalex.org/W2782164276; https://openalex.org/W2783900590; https://openalex.org/W2785127367; https://openalex.org/W2901206765; https://openalex.org/W2941444685; https://openalex.org/W3021686098; https://openalex.org/W3048682234; https://openalex.org/W3106760113; https://openalex.org/W3121653486; https://openalex.org/W3124676054; https://openalex.org/W3127572256; https://openalex.org/W3128101214; https://openalex.org/W3140490681; https://openalex.org/W3144039943; https://openalex.org/W3152418774; https://openalex.org/W3159280209; https://openalex.org/W3196959624; https://openalex.org/W3217220183; https://openalex.org/W4232305462; https://openalex.org/W4232526858; https://openalex.org/W4233189840; https://openalex.org/W4233915062; https://openalex.org/W4238073656; https://openalex.org/W4239054152; https://openalex.org/W4239421629; https://openalex.org/W4239528198; https://openalex.org/W4240035647; https://openalex.org/W4242732899; https://openalex.org/W4245805227; https://openalex.org/W4248432196; https://openalex.org/W4250449328; https://openalex.org/W4252487411; https://openalex.org/W4252748097; https://openalex.org/W4285719527; https://openalex.org/W4293402844; https://openalex.org/W4299341209; https://openalex.org/W4301011076; https://openalex.org/W4301267015; https://openalex.org/W4301378955; https://openalex.org/W4301408177; https://openalex.org/W4380764505; https://openalex.org/W4389266611; https://openalex.org/W4395699796; https://openalex.org/W4399989433; https://openalex.org/W6601673023; https://openalex.org/W6616702184; https://openalex.org/W6616805983; https://openalex.org/W6619722480; https://openalex.org/W6621187288; https://openalex.org/W6621883857; https://openalex.org/W6628336124; https://openalex.org/W6630123270; https://openalex.org/W6636116788; https://openalex.org/W6636467996; https://openalex.org/W6641865735; https://openalex.org/W6644093368; https://openalex.org/W6645660529; https://openalex.org/W6651703445; https://openalex.org/W6677729076; https://openalex.org/W6678504357; https://openalex.org/W6678592594; https://openalex.org/W6680228642; https://openalex.org/W6683203252; https://openalex.org/W6685120645; https://openalex.org/W6688961690; https://openalex.org/W6692378038; https://openalex.org/W6730548376; https://openalex.org/W6827908398; https://openalex.org/W6850696550; https://openalex.org/W7010406827; https://openalex.org/W7037984302; https://openalex.org/W7046701048; https://openalex.org/W7056187441; https://openalex.org/W7073934388,Journal of Political Ecology,en,False -W2801148776,10.4337/9781840649093.00014,The Ecological Debt,2002,,Joan Martínez Alier,A5004042357,,Ecology; Geography; Business; Biology,ecology; geography; business; biology,,Edward Elgar Publishing eBooks,en,False -W2041321854,10.1016/j.ecolecon.2014.04.005,The ‘Environmentalism of the Poor’ revisited: Territory and place in disconnected glocal struggles,2014,,Isabelle Anguelovski; Joan Martínez Alier,A5082142224; A5004042357,Universitat Autònoma de Barcelona (ES); Universitat Autònoma de Barcelona (ES),Environmentalism; Environmental justice; Environmental movement; Sociology; Environmental ethics; Appropriation; Political science; Law; Politics,environmentalism; environmental-justice; environmental-movement; sociology; environmental-ethics; appropriation; political-science; law; politics,https://openalex.org/W39838849; https://openalex.org/W59841739; https://openalex.org/W160500913; https://openalex.org/W356139667; https://openalex.org/W397816860; https://openalex.org/W435401431; https://openalex.org/W562156689; https://openalex.org/W562451465; https://openalex.org/W570834956; https://openalex.org/W571924660; https://openalex.org/W573704088; https://openalex.org/W573931508; https://openalex.org/W576583604; https://openalex.org/W579402700; https://openalex.org/W589062013; https://openalex.org/W589250096; https://openalex.org/W614736872; https://openalex.org/W619318923; https://openalex.org/W624155561; https://openalex.org/W642358081; https://openalex.org/W642451705; https://openalex.org/W645077254; https://openalex.org/W646521148; https://openalex.org/W654686773; https://openalex.org/W1482927345; https://openalex.org/W1499479468; https://openalex.org/W1506411789; https://openalex.org/W1512117345; https://openalex.org/W1535725372; https://openalex.org/W1536916917; https://openalex.org/W1550437797; https://openalex.org/W1584129281; https://openalex.org/W1597172957; https://openalex.org/W1602775671; https://openalex.org/W1606706423; https://openalex.org/W1846573417; https://openalex.org/W1966823031; https://openalex.org/W1975580813; https://openalex.org/W1980314759; https://openalex.org/W1987153398; https://openalex.org/W1987362680; https://openalex.org/W1991915295; https://openalex.org/W2000958319; https://openalex.org/W2005343642; https://openalex.org/W2008114235; https://openalex.org/W2009964700; https://openalex.org/W2010152327; https://openalex.org/W2013949792; https://openalex.org/W2024414180; https://openalex.org/W2027774628; https://openalex.org/W2030130399; https://openalex.org/W2030626342; https://openalex.org/W2030787275; https://openalex.org/W2032938810; https://openalex.org/W2034283967; https://openalex.org/W2034983915; https://openalex.org/W2035353157; https://openalex.org/W2036513938; https://openalex.org/W2036832562; https://openalex.org/W2040538614; https://openalex.org/W2041819150; https://openalex.org/W2042276094; https://openalex.org/W2045609492; https://openalex.org/W2046738530; https://openalex.org/W2049611326; https://openalex.org/W2051049084; https://openalex.org/W2057357715; https://openalex.org/W2060306247; https://openalex.org/W2061660593; https://openalex.org/W2062212647; https://openalex.org/W2064519090; https://openalex.org/W2064656059; https://openalex.org/W2069859898; https://openalex.org/W2072930541; https://openalex.org/W2074483086; https://openalex.org/W2074580217; https://openalex.org/W2074600421; https://openalex.org/W2076352747; https://openalex.org/W2076566559; https://openalex.org/W2076926005; https://openalex.org/W2077880498; https://openalex.org/W2078002056; https://openalex.org/W2080510919; https://openalex.org/W2081971958; https://openalex.org/W2083185167; https://openalex.org/W2083310114; https://openalex.org/W2086192290; https://openalex.org/W2086498757; https://openalex.org/W2087489269; https://openalex.org/W2092783574; https://openalex.org/W2095616782; https://openalex.org/W2102454002; https://openalex.org/W2102503308; https://openalex.org/W2104935650; https://openalex.org/W2105405962; https://openalex.org/W2105865885; https://openalex.org/W2108173127; https://openalex.org/W2113021103; https://openalex.org/W2113097858; https://openalex.org/W2116488332; https://openalex.org/W2118434792; https://openalex.org/W2118594453; https://openalex.org/W2119119035; https://openalex.org/W2124472031; https://openalex.org/W2130310224; https://openalex.org/W2132230285; https://openalex.org/W2133412156; https://openalex.org/W2140175400; https://openalex.org/W2144754868; https://openalex.org/W2147220924; https://openalex.org/W2147419241; https://openalex.org/W2149970882; https://openalex.org/W2150219368; https://openalex.org/W2153194442; https://openalex.org/W2157229390; https://openalex.org/W2166866622; https://openalex.org/W2167026714; https://openalex.org/W2167251327; https://openalex.org/W2167555648; https://openalex.org/W2169091890; https://openalex.org/W2236678118; https://openalex.org/W2243371407; https://openalex.org/W2260680087; https://openalex.org/W2278391005; https://openalex.org/W2315840321; https://openalex.org/W2331037351; https://openalex.org/W2331696864; https://openalex.org/W2333398935; https://openalex.org/W2334710259; https://openalex.org/W2338244508; https://openalex.org/W2339740280; https://openalex.org/W2344198449; https://openalex.org/W2487318391; https://openalex.org/W2499185134; https://openalex.org/W2514996577; https://openalex.org/W2540459781; https://openalex.org/W2568822415; https://openalex.org/W2592356138; https://openalex.org/W2593779134; https://openalex.org/W2595644036; https://openalex.org/W2603115376; https://openalex.org/W2739626300; https://openalex.org/W2741785244; https://openalex.org/W2782048220; https://openalex.org/W2790398204; https://openalex.org/W2888799796; https://openalex.org/W2901216850; https://openalex.org/W2977594498; https://openalex.org/W3121548831; https://openalex.org/W3124677426; https://openalex.org/W3125863435; https://openalex.org/W3152418774; https://openalex.org/W3159280209; https://openalex.org/W4233919019; https://openalex.org/W4238073656; https://openalex.org/W4239054152; https://openalex.org/W4242122157; https://openalex.org/W4242732899; https://openalex.org/W4243589412; https://openalex.org/W4246152242; https://openalex.org/W4250141681; https://openalex.org/W4251191652; https://openalex.org/W4285719527; https://openalex.org/W4299341209; https://openalex.org/W4299430935; https://openalex.org/W4299951319; https://openalex.org/W4301378955; https://openalex.org/W4301408177; https://openalex.org/W4389266611; https://openalex.org/W6630404162; https://openalex.org/W6652986982; https://openalex.org/W6662262605; https://openalex.org/W6677729132; https://openalex.org/W6677826818; https://openalex.org/W6692737411; https://openalex.org/W6698844043; https://openalex.org/W6704601003; https://openalex.org/W6726234040; https://openalex.org/W6734053437; https://openalex.org/W6736368873; https://openalex.org/W6742195171; https://openalex.org/W6747364542; https://openalex.org/W6777812432; https://openalex.org/W6805501799,Ecological Economics,en,False -W2896815490,10.4324/9780203094402-13,Great expectations: the psychodynamics of ecological debt,2012,Bob Ward and Margaret Rustin share with me a desire to bring people from a state of irrationality to one where they are able to think and act creatively in response to climate change. How to arrive there is the question.,Rosemary Randall,A5090366355,,Psychodynamics; Ecology; Debt; Economics; Psychology; Biology; Psychotherapist; Macroeconomics,psychodynamics; ecology; debt; economics; psychology; biology; psychotherapist; macroeconomics,,,en,False -W2767845126,10.1080/15487733.2008.11908010,A modest proposal: global rationalization of ecological footprint to eliminate ecological debt,2008,"In the context of ecological overshoot, extreme poverty, and profligate consumption, we propose using ecological footprint analysis (EFA) to regulate and rationalize material consumption worldwide. EFA quantifies humanconsumption flows relative to renewable natural capital stocks given specified levels of technology. Worldwide, 1.8 global hectares (gha) of bioproductive land exist per person, yet the human population is currently consuming 2.2 gha per person. Given global overshoot and the radically uneven distribution of consumption, we propose a global regime of cap-and-trade of ecological footprint. Under the terms of our modest proposal, all nations would be allocated population- based ecological footprints of an “earthshare” of 1.8 gha per person. Nations with large per capita footprints would be obligated to make reductions through some combination of reduced consumption, resource-productivity gains, population decreases, ecological restoration, and purchase of footprint credits. In contrast, countries with small per capita footprints could sell footprint credits to finance modernization along ecological lines. Mathematical simulation of our proposal indicates global convergence of nations’ ecological footprints in 136 years. In our view, the obscenity of contemporary ecological degradation and human suffering is perhaps rivaled by the audacity of our proposal to commodify biocapacity worldwide. We leave it to the reader to compare our response to institutional failure and the problem of distributive justice to the remedy Swift offered in 1729.",Brian Ohl; Steven A. Wolf; William Anderson,A5090121896; A5025856415; A5008298357,Cornell University (US); Cornell University (US); Cornell University (US),Ecological footprint; Per capita; Population; Economics; Consumption (sociology); Overshoot (microwave communication); Context (archaeology); Natural resource economics; Sustainability; Ecology; Geography; Demography,ecological-footprint; per-capita; population; economics; consumption; overshoot; context; natural-resource-economics; sustainability; ecology; geography; demography,https://openalex.org/W181162704; https://openalex.org/W370891183; https://openalex.org/W417693152; https://openalex.org/W592098796; https://openalex.org/W602719314; https://openalex.org/W624977706; https://openalex.org/W644178155; https://openalex.org/W644940498; https://openalex.org/W1482286954; https://openalex.org/W1539453952; https://openalex.org/W1544813361; https://openalex.org/W1551533759; https://openalex.org/W1565850046; https://openalex.org/W1584710685; https://openalex.org/W1663957662; https://openalex.org/W1746595101; https://openalex.org/W1971425631; https://openalex.org/W1976414428; https://openalex.org/W1996199418; https://openalex.org/W1998733902; https://openalex.org/W2002402372; https://openalex.org/W2003242061; https://openalex.org/W2017522204; https://openalex.org/W2027271929; https://openalex.org/W2044314202; https://openalex.org/W2068622922; https://openalex.org/W2071868072; https://openalex.org/W2076618941; https://openalex.org/W2085850565; https://openalex.org/W2092463295; https://openalex.org/W2096314897; https://openalex.org/W2098470815; https://openalex.org/W2103605303; https://openalex.org/W2108173127; https://openalex.org/W2116018954; https://openalex.org/W2127251305; https://openalex.org/W2127329485; https://openalex.org/W2183646201; https://openalex.org/W2315346373; https://openalex.org/W2497172328; https://openalex.org/W2613902989; https://openalex.org/W2746485780; https://openalex.org/W2796817348; https://openalex.org/W3123160752; https://openalex.org/W4235523545; https://openalex.org/W4246142122; https://openalex.org/W4285719527; https://openalex.org/W6621187288; https://openalex.org/W6633942408; https://openalex.org/W6634768567; https://openalex.org/W6675164879; https://openalex.org/W7014238125; https://openalex.org/W7027486164,Sustainability Science Practice and Policy,en,False -W2012254774,10.1016/j.worlddev.2003.09.001,An Ecological Footprint Approach to External Debt Relief,2003,,Mariano Torras,A5108671234,Adelphi University (US),Debt; Ecological footprint; External debt; Economics; Scale (ratio); Ecology; Natural resource economics; Macroeconomics; Geography; Sustainability; Biology,debt; ecological-footprint; external-debt; economics; scale; ecology; natural-resource-economics; macroeconomics; geography; sustainability; biology,https://openalex.org/W574631479; https://openalex.org/W1492572403; https://openalex.org/W1500610626; https://openalex.org/W1503706120; https://openalex.org/W1521449382; https://openalex.org/W1578611532; https://openalex.org/W1601422492; https://openalex.org/W1912073849; https://openalex.org/W1968401264; https://openalex.org/W1973176252; https://openalex.org/W1973318389; https://openalex.org/W1975396409; https://openalex.org/W1978430273; https://openalex.org/W1991198037; https://openalex.org/W2007702159; https://openalex.org/W2016989466; https://openalex.org/W2033738926; https://openalex.org/W2038398724; https://openalex.org/W2040211876; https://openalex.org/W2041366075; https://openalex.org/W2045726339; https://openalex.org/W2054046533; https://openalex.org/W2056619110; https://openalex.org/W2077293631; https://openalex.org/W2126212614; https://openalex.org/W2127808655; https://openalex.org/W2146015287; https://openalex.org/W2150406300; https://openalex.org/W2257218250; https://openalex.org/W2261224620; https://openalex.org/W2278324116; https://openalex.org/W2291453814; https://openalex.org/W2587150717; https://openalex.org/W2746485780; https://openalex.org/W2948251683; https://openalex.org/W3006319601; https://openalex.org/W3184353705; https://openalex.org/W4250099039; https://openalex.org/W4285719527; https://openalex.org/W6692146916; https://openalex.org/W6696847344; https://openalex.org/W6759830232; https://openalex.org/W6763176171; https://openalex.org/W6798644758; https://openalex.org/W7027910921,World Development,en,False -W2945557658,10.3390/su11102752,"Environmental Homogenization or Heterogenization? The Effects of Globalization on Carbon Dioxide Emissions, 1970–2014",2019,"Globalization significantly influences climate change. Ecological modernization theory and world polity theory suggest that globalization reduces carbon dioxide emissions worldwide by facilitating economic, political, social, and cultural homogenization, whereas ecological unequal exchange theory indicates that cumulative economic and political disparities lead to an uneven distribution of emissions in developed and less developed countries. This study addresses this controversy and systematically investigates the extent to which different dimensions of globalization influence carbon emissions in developed and less developed countries by treating globalization as a dynamic historical process involving economic, political, and social/cultural dimensions in a long-term, cross-national context. Drawing on data for 137 countries from 1970 to 2014, we find that while globalization, social and cultural globalization in particular, has enabled developed countries to significantly decrease their carbon emissions, it has led to more emissions in less developed countries, lending support to the ecological unequal exchange theory. Consistent with world polity theory, international political integration has contributed to carbon reductions over time. We highlight the internal tension between environmental conservation and degradation in a globalizing world and discuss the opportunities for less developed countries to reduce emissions.",Yan Wang; Tao Zhou; Hao Chen; Zhihai Rong,A5100779879; A5090925242; A5112542518; A5082080991,Nankai University (CN); University of Electronic Science and Technology of China (CN); Nankai University (CN); University of Electronic Science and Technology of China (CN),Globalization; Polity; Ecological modernization; Economics; Politics; Economic globalization; Greenhouse gas; Economic system; Development economics; Political science; Market economy; Ecology,globalization; polity; ecological-modernization; economics; politics; economic-globalization; greenhouse-gas; economic-system; development-economics; political-science; market-economy; ecology,https://openalex.org/W265486299; https://openalex.org/W392175924; https://openalex.org/W584301089; https://openalex.org/W619753928; https://openalex.org/W651598703; https://openalex.org/W1490058783; https://openalex.org/W1495220204; https://openalex.org/W1504629721; https://openalex.org/W1504658872; https://openalex.org/W1509008845; https://openalex.org/W1520806764; https://openalex.org/W1527990863; https://openalex.org/W1532443266; https://openalex.org/W1535732848; https://openalex.org/W1541225134; https://openalex.org/W1562678381; https://openalex.org/W1895451490; https://openalex.org/W1905814523; https://openalex.org/W1919782393; https://openalex.org/W1964940275; https://openalex.org/W1966472464; https://openalex.org/W1966605003; https://openalex.org/W1968305520; https://openalex.org/W1973954730; https://openalex.org/W1977714269; https://openalex.org/W1980595917; https://openalex.org/W1983784355; https://openalex.org/W1984190418; https://openalex.org/W1984759356; https://openalex.org/W1984844509; https://openalex.org/W1993740158; https://openalex.org/W1996199418; https://openalex.org/W1997222271; https://openalex.org/W1998601161; https://openalex.org/W2000568622; https://openalex.org/W2001358707; https://openalex.org/W2003629458; https://openalex.org/W2012426895; https://openalex.org/W2014480644; https://openalex.org/W2018225362; https://openalex.org/W2021458480; https://openalex.org/W2021851134; https://openalex.org/W2022220920; https://openalex.org/W2025421307; https://openalex.org/W2027529454; https://openalex.org/W2032899120; https://openalex.org/W2034301206; https://openalex.org/W2036713768; https://openalex.org/W2037088854; https://openalex.org/W2041750432; https://openalex.org/W2048293151; https://openalex.org/W2051421096; https://openalex.org/W2057810683; https://openalex.org/W2066023656; https://openalex.org/W2073716048; https://openalex.org/W2076089921; https://openalex.org/W2078685020; https://openalex.org/W2078807003; https://openalex.org/W2080351687; https://openalex.org/W2087385946; https://openalex.org/W2089248864; https://openalex.org/W2089855706; https://openalex.org/W2091841200; https://openalex.org/W2098470815; https://openalex.org/W2100310745; https://openalex.org/W2101119900; https://openalex.org/W2101498657; https://openalex.org/W2107196054; https://openalex.org/W2108419099; https://openalex.org/W2110278387; https://openalex.org/W2114833267; https://openalex.org/W2114923443; https://openalex.org/W2115328246; https://openalex.org/W2117945141; https://openalex.org/W2118463881; https://openalex.org/W2118924669; https://openalex.org/W2119211517; https://openalex.org/W2126890312; https://openalex.org/W2127329485; https://openalex.org/W2130689244; https://openalex.org/W2130829561; https://openalex.org/W2131222167; https://openalex.org/W2133920545; https://openalex.org/W2136802851; https://openalex.org/W2142043891; https://openalex.org/W2144603483; https://openalex.org/W2145082971; https://openalex.org/W2145987797; https://openalex.org/W2147796004; https://openalex.org/W2151732839; https://openalex.org/W2152256466; https://openalex.org/W2156363664; https://openalex.org/W2156594237; https://openalex.org/W2157115909; https://openalex.org/W2157285565; https://openalex.org/W2158611883; https://openalex.org/W2160934709; https://openalex.org/W2169378432; https://openalex.org/W2170433190; https://openalex.org/W2171918020; https://openalex.org/W2171949063; https://openalex.org/W2182089091; https://openalex.org/W2195484168; https://openalex.org/W2217330188; https://openalex.org/W2274106087; https://openalex.org/W2274762189; https://openalex.org/W2280828964; https://openalex.org/W2288595092; https://openalex.org/W2291058877; https://openalex.org/W2321511225; https://openalex.org/W2322108528; https://openalex.org/W2331134723; https://openalex.org/W2347132681; https://openalex.org/W2473564103; https://openalex.org/W2511414028; https://openalex.org/W2515235557; https://openalex.org/W2588410872; https://openalex.org/W2796817348; https://openalex.org/W3122477235; https://openalex.org/W3122952990; https://openalex.org/W3125639714; https://openalex.org/W4234606244; https://openalex.org/W4236066262; https://openalex.org/W4237176860; https://openalex.org/W4241852105; https://openalex.org/W4242147106; https://openalex.org/W4244280225; https://openalex.org/W4247134726; https://openalex.org/W4248553182; https://openalex.org/W4249225451; https://openalex.org/W4253981452; https://openalex.org/W4300044763; https://openalex.org/W4300351783; https://openalex.org/W4385886409; https://openalex.org/W4385886475; https://openalex.org/W4385886502; https://openalex.org/W6630389085; https://openalex.org/W6725896018,Sustainability,en,False -W2771312157,10.1177/1070496517744593,Decolonizing the Atmosphere: The Climate Justice Movement on Climate Debt,2017,"A central concept raised by the climate justice movement is climate debt. Here, the claims and warrants of the movement support for climate debt is identified through an argumentation analysis of their central manifestos. It is found that the climate debt claim is understood as primarily restorative, in the sense that the environmental space of the developing countries must be returned, “decolonized.” The damage caused by climate change also gives rise to a compensatory adaptation debt. The result is compared with an earlier study on ecological debt. Both concepts are framed within an unjust power relation between North and South, but there are differences. Ecological debt is mainly analyzed in terms of an unjust economic exploitation, which is congenial with its use as an argument for cancellation of Southern external debts; climate debt is rather seen as a violation of communal rights and territories, an argument for climate justice.",Rikard Warlenius,A5020507738,Lund University (SE),Debt; Climate justice; Argument (complex analysis); Economics; Climate change; Economic Justice; Political science; Political economy; Law; Ecology; Macroeconomics,debt; climate-justice; argument; economics; climate-change; economic-justice; political-science; political-economy; law; ecology; macroeconomics,https://openalex.org/W632137373; https://openalex.org/W1514086398; https://openalex.org/W1555942496; https://openalex.org/W1933499598; https://openalex.org/W1973954730; https://openalex.org/W2015411663; https://openalex.org/W2037239387; https://openalex.org/W2039510076; https://openalex.org/W2048051304; https://openalex.org/W2048951262; https://openalex.org/W2103865635; https://openalex.org/W2113214343; https://openalex.org/W2132214484; https://openalex.org/W2137540105; https://openalex.org/W2214644351; https://openalex.org/W2273426814; https://openalex.org/W2319568853; https://openalex.org/W2337292833; https://openalex.org/W2462873503; https://openalex.org/W2472086250; https://openalex.org/W2498551401; https://openalex.org/W2567084427; https://openalex.org/W2578584143; https://openalex.org/W2594382053; https://openalex.org/W2621477277; https://openalex.org/W2994166306; https://openalex.org/W4232387830; https://openalex.org/W4241852105; https://openalex.org/W4285719527,The Journal of Environment & Development,en,False -W1598844417,10.4324/9780203094402,Engaging with Climate Change,2012,"Rapley. Foreword. Weintrobe, Preface. Weintrobe, Introduction. Hamilton, What History Can Teach Us About Climate Change Denial. Weintrobe, The Difficult Problem Of Anxiety In Thinking About Climate Change. Lehtonen, Valimaki, Discussion The Environmental Neurosis Of Modern Man: The Illusion Of Autonomy And The Real Dependence Denied. Mause-Hanke, Discussion. Hoggett, Climate Change Denial In A Perverse Culture. Steiner, Discussion. Cohen, Discussion. Hoggett, Reply. Randall, Great Expectations: Some Psychic Consequences Of The Discovery Of Personal Ecological Debt. Rustin, Discussion. Ward, Discussion. Randall, Reply. Lertzman, The Myth Of Apathy. Brenman-Pick, Discussion Not I. Bichard, Discussion How Sustainable Change Agents Can Adopt Psychoanalytic Perspectives On Climate Change. Keene,Unconscious Obstacles To Caring For The Planet. Brearley, Discussion. Hinshelwood, Discussion Goods And Bads. Rustin, How Is Psychoanalysis An Issue For Climate Change? Alexander, Discussion. Benton, Discussion. Rustin, Reply. Weintrobe, On The Love Of Nature And On Human Nature. Crompton, Discussion On Love Of Nature And The Nature Of Love. Hannis, Discussion Nature, Capitalism And Human Flourishing. Harrison, Climate Change, Uncertainty And Risk.",,,,Computer science; Environmental science,computer-science; environmental-science,,,en,False -W2195484168,10.1080/23251042.2015.1114208,Unequal carbon exchanges: understanding pollution embodied in global trade,2015,"We examine carbon emission transfers via trade among countries over a 20-year period. A net transfer of carbon emission means that the emission embodied in a country’s imports exceeds the emission embodied in exports. We consider a number of socio-economic drivers to explain variations in such net transfers across countries. Our findings show a U-shaped curvilinear relationship between countries’ GDP per capita and their net carbon transfer, suggesting that countries are typically heavy net importers of carbon in early phases of economic development, become balanced or even net exporters of carbon in middle stages of development, and then return to being heavy net importers of carbon in later stages of development. We reflect on these findings in the context of ecological modernization (EM) and ecological unequal exchange (EUE) theories, as well as the environmental Kuznets curve (EKC) hypothesis.",Christina Prell; Laixiang Sun,A5037616102; A5041464316,"University of Maryland, College Park (US); University of Maryland, College Park (US)",Kuznets curve; Context (archaeology); Per capita; Economics; Industrialisation; Natural resource economics; Economic growth; Geography; Population,kuznets-curve; context; per-capita; economics; industrialisation; natural-resource-economics; economic-growth; geography; population,https://openalex.org/W564808682; https://openalex.org/W605044516; https://openalex.org/W631285250; https://openalex.org/W638585138; https://openalex.org/W652486963; https://openalex.org/W652794575; https://openalex.org/W1504658872; https://openalex.org/W1511395520; https://openalex.org/W1534847451; https://openalex.org/W1566187841; https://openalex.org/W1590488950; https://openalex.org/W1591166682; https://openalex.org/W1840907900; https://openalex.org/W1965014002; https://openalex.org/W1967879531; https://openalex.org/W1968305520; https://openalex.org/W1970139579; https://openalex.org/W1983474380; https://openalex.org/W1983784355; https://openalex.org/W1984190418; https://openalex.org/W1986325149; https://openalex.org/W1987019268; https://openalex.org/W1992698519; https://openalex.org/W1994450298; https://openalex.org/W1996848963; https://openalex.org/W2006255049; https://openalex.org/W2007436220; https://openalex.org/W2013386523; https://openalex.org/W2018502693; https://openalex.org/W2019199332; https://openalex.org/W2022542406; https://openalex.org/W2024725622; https://openalex.org/W2027529454; https://openalex.org/W2034221877; https://openalex.org/W2036219106; https://openalex.org/W2037088854; https://openalex.org/W2038399826; https://openalex.org/W2039839403; https://openalex.org/W2040342446; https://openalex.org/W2041490855; https://openalex.org/W2041776077; https://openalex.org/W2043357381; https://openalex.org/W2044269414; https://openalex.org/W2047045802; https://openalex.org/W2050986266; https://openalex.org/W2052094794; https://openalex.org/W2056926496; https://openalex.org/W2056944867; https://openalex.org/W2057810683; https://openalex.org/W2061046454; https://openalex.org/W2062797837; https://openalex.org/W2071572611; https://openalex.org/W2072688741; https://openalex.org/W2075510806; https://openalex.org/W2076902169; https://openalex.org/W2080577950; https://openalex.org/W2087759377; https://openalex.org/W2089560544; https://openalex.org/W2093347332; https://openalex.org/W2096317677; https://openalex.org/W2096565435; https://openalex.org/W2112698403; https://openalex.org/W2113153173; https://openalex.org/W2119211517; https://openalex.org/W2122831705; https://openalex.org/W2125388400; https://openalex.org/W2125481562; https://openalex.org/W2126205604; https://openalex.org/W2131554966; https://openalex.org/W2131665065; https://openalex.org/W2136276883; https://openalex.org/W2137775183; https://openalex.org/W2143917121; https://openalex.org/W2148185586; https://openalex.org/W2148732650; https://openalex.org/W2161438705; https://openalex.org/W2162141368; https://openalex.org/W2164703638; https://openalex.org/W2182089091; https://openalex.org/W2201508122; https://openalex.org/W2243371407; https://openalex.org/W2279795386; https://openalex.org/W2288595092; https://openalex.org/W2337659769; https://openalex.org/W2339391629; https://openalex.org/W2578584143; https://openalex.org/W2614181444; https://openalex.org/W3122477235; https://openalex.org/W3124139326; https://openalex.org/W3124532690; https://openalex.org/W3148332745; https://openalex.org/W4242058497; https://openalex.org/W4242216426; https://openalex.org/W4254027994; https://openalex.org/W4300778821,Environmental Sociology,en,False -W2594589186,10.2458/v23i1.20225,Measuring environmental injustice: how ecological debt defines a radical change in the international legal system,2016,"This paper takes ecological debt as a measure of environmental injustice, and appraises this idea as a driving force for change in the international legal system. Environmental justice is understood here as a fair distribution of charges and benefits derived from using natural resources, in order to provide minimal welfare standards to all human beings, including future generations. Ecological debt measures this injustice, as an unfair and illegitimate distribution of benefits and burdens within the social metabolism, including ecologically unequal exchange, as a disproportionate appropriation and impairment of common goods, such as the atmosphere. Structural features of the international system promote a lack of transparency, control and accountability of power, through a pro-growth and pro-freedom language. In theory, this discourse comes with the promise of compensation for ordinary people, but in fact it benefits only a few. Ecological debt, as a symptom of the pervasive injustice of the current balance of power, demands an equivalent response, unravelling and deconstructing real power behind the imagery of equally sovereign states. It claims a counterhegemonic agenda aiming at rebuilding international law from a pluralist, 'third world' or Southern perspective and improving the balance of power. Ecological debt should not only serve as a means of compensation, but as a conceptual definition of an unfair system of human relations, which needs change. It may also help to define the burdens to be assumed as costs for the change required in international relations, i.e. by promoting the constitutionalization of international law and providing appropriate protection to human beings under the paradigms of sustainability (not sustainable development) and equity.",Antoni Pigrau i Solé; Antonio Cardesa Salzmann; Jordi Jaria i Manzano; Susana Borràs Pentinat,A5012821152; A5072650099; A5020697726; A5026396746,Universitat Rovira i Virgili (ES); University of Strathclyde (GB); Universitat Rovira i Virgili (ES); Universitat Rovira i Virgili (ES),Injustice; Appropriation; Environmental justice; Human rights; Sustainable development; Environmental law; Debt; Law and economics; Economics; Political science; Law; Finance,injustice; appropriation; environmental-justice; human-rights; sustainable-development; environmental-law; debt; law-and-economics; economics; political-science; law; finance,https://openalex.org/W6418695; https://openalex.org/W393785938; https://openalex.org/W614736872; https://openalex.org/W654027561; https://openalex.org/W756773437; https://openalex.org/W1121996343; https://openalex.org/W1248118106; https://openalex.org/W1509463507; https://openalex.org/W1535393865; https://openalex.org/W1587294828; https://openalex.org/W1589361174; https://openalex.org/W1684472600; https://openalex.org/W1799887369; https://openalex.org/W1907583418; https://openalex.org/W1965253625; https://openalex.org/W1992461584; https://openalex.org/W2027802007; https://openalex.org/W2046173547; https://openalex.org/W2070333231; https://openalex.org/W2082018652; https://openalex.org/W2087694774; https://openalex.org/W2087992692; https://openalex.org/W2094520873; https://openalex.org/W2104519673; https://openalex.org/W2119590495; https://openalex.org/W2159289211; https://openalex.org/W2167382412; https://openalex.org/W2319568853; https://openalex.org/W2336527297; https://openalex.org/W2339685604; https://openalex.org/W2395851320; https://openalex.org/W2481067057; https://openalex.org/W2567118993; https://openalex.org/W2594243269; https://openalex.org/W2736628311; https://openalex.org/W2799975152; https://openalex.org/W2806647172; https://openalex.org/W2978374962; https://openalex.org/W3121349663; https://openalex.org/W3123409510; https://openalex.org/W3125314127; https://openalex.org/W3159280209; https://openalex.org/W3211177043; https://openalex.org/W4233566767; https://openalex.org/W4244209322; https://openalex.org/W4249578445; https://openalex.org/W4254835415; https://openalex.org/W4299402866; https://openalex.org/W6627316930; https://openalex.org/W6633206287; https://openalex.org/W6635261573; https://openalex.org/W6660154277; https://openalex.org/W6676331168; https://openalex.org/W6740903121; https://openalex.org/W6751054145; https://openalex.org/W6755130354; https://openalex.org/W6803608743; https://openalex.org/W6820768008; https://openalex.org/W6820861918; https://openalex.org/W6986524961; https://openalex.org/W7056187441,Journal of Political Ecology,en,False -W4240411357,10.1007/978-3-030-29901-9_27,Ecological Unequal Exchange,2021,,Jan O. Andersson,A5070191512,Åbo Akademi University (FI),Ecology; Geography; Biology,ecology; geography; biology,https://openalex.org/W651598703; https://openalex.org/W1484177660; https://openalex.org/W1551322995; https://openalex.org/W1616101857; https://openalex.org/W1738944162; https://openalex.org/W1970139579; https://openalex.org/W1988324589; https://openalex.org/W1990164247; https://openalex.org/W2002269579; https://openalex.org/W2013402297; https://openalex.org/W2024828896; https://openalex.org/W2025874583; https://openalex.org/W2026865785; https://openalex.org/W2033186995; https://openalex.org/W2036713768; https://openalex.org/W2052630221; https://openalex.org/W2057002878; https://openalex.org/W2099161992; https://openalex.org/W2115070437; https://openalex.org/W2119211517; https://openalex.org/W2267106946; https://openalex.org/W2291058877; https://openalex.org/W2324550751; https://openalex.org/W2347141676; https://openalex.org/W2480022570; https://openalex.org/W2559805026; https://openalex.org/W2605728354; https://openalex.org/W2607635248; https://openalex.org/W2618067250; https://openalex.org/W2753417580; https://openalex.org/W3123592998; https://openalex.org/W4211244051; https://openalex.org/W6616702184; https://openalex.org/W6639620335; https://openalex.org/W6694662396; https://openalex.org/W7042237278,,en,False -W4255108584,10.1007/978-3-319-91206-6_27-1,Ecological Unequal Exchange,2019,,Jan O. Andersson,A5070191512,Åbo Akademi University (FI),Ecology; Environmental science; Geography; Biology,ecology; environmental-science; geography; biology,https://openalex.org/W651598703; https://openalex.org/W1484177660; https://openalex.org/W1551322995; https://openalex.org/W1616101857; https://openalex.org/W1738944162; https://openalex.org/W1970139579; https://openalex.org/W1988324589; https://openalex.org/W1990164247; https://openalex.org/W2002269579; https://openalex.org/W2013402297; https://openalex.org/W2024828896; https://openalex.org/W2025874583; https://openalex.org/W2026865785; https://openalex.org/W2033186995; https://openalex.org/W2036713768; https://openalex.org/W2052630221; https://openalex.org/W2057002878; https://openalex.org/W2099161992; https://openalex.org/W2115070437; https://openalex.org/W2119211517; https://openalex.org/W2267106946; https://openalex.org/W2291058877; https://openalex.org/W2324550751; https://openalex.org/W2347141676; https://openalex.org/W2480022570; https://openalex.org/W2559805026; https://openalex.org/W2605728354; https://openalex.org/W2607635248; https://openalex.org/W2618067250; https://openalex.org/W2753417580; https://openalex.org/W3123592998; https://openalex.org/W4211244051; https://openalex.org/W6616702184; https://openalex.org/W6639620335; https://openalex.org/W6694662396; https://openalex.org/W7042237278,,en,False -W4387873668,10.4337/9781802200416.ch23,Ecological unequal exchange,2023,"Ecological Unequal Exchange (EUE) arises from Ecological Economics concerns about issues of distributional environmental equity between countries as a result of international trade (IT). EUE shows that IT is asymmetric not only in economic but also in ecological terms. This asymmetry especially affects Southern countries that specialise in extracting and exporting raw materials. And it favours Northern countries that produce and export capital- and knowledge-intensive goods. Identifying EUE requires consideration of the biophysical aspects of production, transport, and consumption, where the Second Law of Thermodynamics is essential. The inverse relationship between the biophysical value of natural resources and their economic valuation is what enables the metabolism of society in its global organisation. The price differential resulting from this relationship, supported by an asymmetric power structure at the international level, allows industrialised countries to obtain the energy available for their metabolic functioning, and the unequal exchange and ecological deterioration in the countries of the South are the most obvious results.",Mario Alejandro Pérez Rincón,A5006382147,,Economics; Equity (law); Valuation (finance); Natural resource economics; Ecology; Ecological economics; Consumption (sociology); Sustainability; Political science; Biology,economics; equity; valuation; natural-resource-economics; ecology; ecological-economics; consumption; sustainability; political-science; biology,,Edward Elgar Publishing eBooks,en,False -W2117633894,10.1080/01436590802622987,"Contemporary Contradictions of the Global Development Project: geopolitics, global ecology and the ‘development climate’",2009,"Abstract The global development project faces newly evident challenges in the combination of energy, climate and food crises. Their interrelationships create a powerful moment in world history in which analysts and practitioners grope for solutions, limited by the narrow market episteme. This contribution argues that official development, in advocating green market solutions, recycles the problem as solution—a problem rooted in the geopolitics of an unsustainable global ‘metabolic rift’ and a discourse of global ecology reinforcing international power relations through monetary valuation, and deepening the North's ‘ecological debt’.",Philip McMichael,A5077240588,Cornell University (US),Geopolitics; Climate change; Global warming; Ecology; International development; Political science; Economics; Sociology; Economic growth; Biology; Law; Politics,geopolitics; climate-change; global-warming; ecology; international-development; political-science; economics; sociology; economic-growth; biology; law; politics,https://openalex.org/W3159280209,Third World Quarterly,en,False -W2321511225,10.1016/j.socnet.2016.03.001,The evolution of global trade and impacts on countries’ carbon trade imbalances,2016,,Christina Prell; Kuishuang Feng,A5037616102; A5049493168,"University of Maryland, College Park (US); University of Maryland, College Park (US)",Economics; Context (archaeology); International economics; Gravity model of trade; Carbon fibers; Trade barrier; International trade; Computer science; Geography,economics; context; international-economics; gravity-model-of-trade; carbon-fibers; trade-barrier; international-trade; computer-science; geography,https://openalex.org/W31487802; https://openalex.org/W244587596; https://openalex.org/W286295083; https://openalex.org/W291831081; https://openalex.org/W570362212; https://openalex.org/W582090430; https://openalex.org/W605044516; https://openalex.org/W610187120; https://openalex.org/W1493472778; https://openalex.org/W1504658872; https://openalex.org/W1520463711; https://openalex.org/W1533643283; https://openalex.org/W1535196592; https://openalex.org/W1591166682; https://openalex.org/W1968342703; https://openalex.org/W1969128202; https://openalex.org/W1970139579; https://openalex.org/W1973749534; https://openalex.org/W1976868072; https://openalex.org/W1983716515; https://openalex.org/W1986325149; https://openalex.org/W1987458928; https://openalex.org/W1989968173; https://openalex.org/W1996848963; https://openalex.org/W2006255049; https://openalex.org/W2007080465; https://openalex.org/W2011049045; https://openalex.org/W2013386523; https://openalex.org/W2014480644; https://openalex.org/W2020829974; https://openalex.org/W2022542406; https://openalex.org/W2041490855; https://openalex.org/W2041786698; https://openalex.org/W2044269414; https://openalex.org/W2054166232; https://openalex.org/W2055325415; https://openalex.org/W2056926496; https://openalex.org/W2057222804; https://openalex.org/W2057810683; https://openalex.org/W2059368404; https://openalex.org/W2062797837; https://openalex.org/W2067793019; https://openalex.org/W2071572611; https://openalex.org/W2073562966; https://openalex.org/W2073916725; https://openalex.org/W2074724691; https://openalex.org/W2076881948; https://openalex.org/W2099699569; https://openalex.org/W2099815494; https://openalex.org/W2100194699; https://openalex.org/W2113153173; https://openalex.org/W2119211517; https://openalex.org/W2120104040; https://openalex.org/W2122465344; https://openalex.org/W2122831705; https://openalex.org/W2125481562; https://openalex.org/W2135622701; https://openalex.org/W2139310104; https://openalex.org/W2143893259; https://openalex.org/W2145251530; https://openalex.org/W2145917034; https://openalex.org/W2146527895; https://openalex.org/W2148732650; https://openalex.org/W2160268549; https://openalex.org/W2160508096; https://openalex.org/W2163362767; https://openalex.org/W2164703638; https://openalex.org/W2184625852; https://openalex.org/W2194406924; https://openalex.org/W2201508122; https://openalex.org/W2207225886; https://openalex.org/W2212083538; https://openalex.org/W2262220628; https://openalex.org/W2262759381; https://openalex.org/W2284583324; https://openalex.org/W2288595092; https://openalex.org/W2337659769; https://openalex.org/W2475644619; https://openalex.org/W2564098583; https://openalex.org/W2578584143; https://openalex.org/W2607554261; https://openalex.org/W2800079351; https://openalex.org/W2806566552; https://openalex.org/W2902911166; https://openalex.org/W3122661090; https://openalex.org/W3122821355; https://openalex.org/W3124139326; https://openalex.org/W3124405280; https://openalex.org/W3126109796; https://openalex.org/W4301620991; https://openalex.org/W4302354913; https://openalex.org/W6601281690; https://openalex.org/W6631606621; https://openalex.org/W6680968406; https://openalex.org/W6686669974; https://openalex.org/W6687811615; https://openalex.org/W6695537366,Social Networks,en,False -W2788955535,10.1016/j.ecolecon.2018.01.030,Modelling Multi-regional Ecological Exchanges: The Case of UK and Africa,2018,,Eunice Oppon; Adolf Acquaye; Taofeeq Ibn‐Mohammed; Lenny Koh,A5010245794; A5032608262; A5091745047; A5079714997,University of Sheffield (GB); University of Kent (GB); University of Sheffield (GB); University of Sheffield (GB),Poverty; Developing country; Goods and services; Natural resource economics; Economics; Ecosystem services; Work (physics); Business; Environmental resource management; Ecology; Economic growth; Economy; Ecosystem,poverty; developing-country; goods-and-services; natural-resource-economics; economics; ecosystem-services; work; business; environmental-resource-management; ecology; economic-growth; economy; ecosystem,https://openalex.org/W88898997; https://openalex.org/W97188817; https://openalex.org/W222914877; https://openalex.org/W1493472778; https://openalex.org/W1511877300; https://openalex.org/W1533063787; https://openalex.org/W1586936537; https://openalex.org/W1820544219; https://openalex.org/W1965592156; https://openalex.org/W1966605003; https://openalex.org/W1970139579; https://openalex.org/W1973954730; https://openalex.org/W1984190418; https://openalex.org/W1986552857; https://openalex.org/W1987458928; https://openalex.org/W1995968610; https://openalex.org/W1998804088; https://openalex.org/W1999009515; https://openalex.org/W2004010203; https://openalex.org/W2007080465; https://openalex.org/W2010101976; https://openalex.org/W2012011920; https://openalex.org/W2017760134; https://openalex.org/W2020297434; https://openalex.org/W2020374898; https://openalex.org/W2024725622; https://openalex.org/W2030517974; https://openalex.org/W2032167419; https://openalex.org/W2041490855; https://openalex.org/W2044269414; https://openalex.org/W2045987553; https://openalex.org/W2051808875; https://openalex.org/W2060603126; https://openalex.org/W2068856199; https://openalex.org/W2086977164; https://openalex.org/W2093219469; https://openalex.org/W2095019212; https://openalex.org/W2096314897; https://openalex.org/W2103536707; https://openalex.org/W2105414963; https://openalex.org/W2113219607; https://openalex.org/W2113414401; https://openalex.org/W2119211517; https://openalex.org/W2125390913; https://openalex.org/W2128405303; https://openalex.org/W2137775183; https://openalex.org/W2153118634; https://openalex.org/W2162141368; https://openalex.org/W2163045437; https://openalex.org/W2164703638; https://openalex.org/W2166807870; https://openalex.org/W2167785727; https://openalex.org/W2170273768; https://openalex.org/W2274330233; https://openalex.org/W2315103963; https://openalex.org/W2342456945; https://openalex.org/W2460243609; https://openalex.org/W2549877311; https://openalex.org/W2557126631; https://openalex.org/W2564956283; https://openalex.org/W2765557092; https://openalex.org/W3094249809; https://openalex.org/W6608882148; https://openalex.org/W6704186375; https://openalex.org/W6745755860,Ecological Economics,en,False -W2066023656,10.4337/9781843768593,The International Handbook of Environmental Sociology,1997,"Contents: Introduction Graham Woodgate PART I: CONCEPTS AND THEORIES IN ENVIRONMENTAL SOCIOLOGY Editorial Commentary Graham Woodgate 1. The Maturation and Diversification of Environmental Sociology: From Constructivism and Realism to Agnosticism and Pragmatism Riley E. Dunlap 2. Social Institutions and Environmental Change Frederick H. Buttel 3. From Environment Sociology to Global Ecosociology: The Dunlap - Buttel Debates Jean-Guy Vaillancourt 4. Ecological Modernization as a Social Theory of Environmental Reform Arthur P.J. Mol 5. Ecological Modernization Theory: Theoretical and Empirical Challenges Richard York, Eugene A. Rosa and Thomas Dietz 6. Postconstructivist Political Ecologies Arturo Escobar 7. Marx's Ecology and its Historical Significance John Bellamy Foster 8. The Transition Out of Carbon Dependence: The Crises of Environment and Markets Michael R. Redclift 9. Socio-ecological Agency: From 'Human Exceptionalism' to Coping with 'Exceptional' Global Environmental Change David Manuel-Navarrete and Christine N. Buzinde 10. Ecological Debt: An Integrating Concept for Socio-Environmental Change Inaki Barcena Hinojal and Rosa Lago Aurrekoetxea 11. The Emergence Model of Environment and Society John Hannigan 12. Peering into the Abyss: Environment, Research and Absurdity in the 'Age of Stupid' Raymond L. Bryant PART II: SUBSTANTIVE ISSUES FOR ENVIRONMENTAL SOCIOLOGY Editorial Commentary Graham Woodgate 13. Animals and Us Ted Benton 14. Science and the Environment in the Twenty-first Century Steven Yearley 15. New Challenges for Twenty-first Century Environmental Movements: Agricultural Biotechnology and Nanotechnology Maria Kousis 16. Sustainable Consumption: Developments, Considerations and New Directions Emma D. Hinton and Michael K. Goodman 17. Globalisation, Convergence and the Euro-Atlantic Development Model Wolfgang Sachs 18. Environmental Hazards and Human Disasters Raymond Murphy 19. Structural Obstacles to an Effective Post-2012 Global Climate Agreement: Why Social Structure Matters and How Addressing it Can Help Break the Impasse Bradley C. Parks and J. Timmons Roberts 20. Environmental Sociology and International Forestry: Historical Overview and Future Directions Bianca Ambrose-Oji PART III: INTERNATIONAL PERSPECTIVES ON ENVIRONMENT AND SOCIETY Editorial Commentary Graham Woodgate 21. The Role of Place in the Margins of Space David Manuel-Navarrete and Michael R. Redclift 22. Society, Environment and Development in Africa William M. Adams 23. Neoliberal Regimes of Environmental Governance: Climate Change, Biodiversity and Agriculture in Australia Stewart Lockie 24. Environmental Reform in Modernizing China Arthur P.J. Mol 25. Civic Engagement in Environmental Governance in Central and Eastern Europe JoAnn Carmin 26. A 'Sustaining Conservation' for Mexico? Nora Haenn Index",Michael Redclift; Graham Woodgate,A5059724271; A5065950333,,Sociology; Environmental sociology; Regional science; Social science,sociology; environmental-sociology; regional-science; social-science,https://openalex.org/W1538243852; https://openalex.org/W2009872045; https://openalex.org/W2062199894; https://openalex.org/W2093955358; https://openalex.org/W2318735428; https://openalex.org/W2906689523,Edward Elgar Publishing eBooks,en,False -W2999036754,10.1073/pnas.1910023117,Land-use history impacts functional diversity across multiple trophic groups,2020,"Land-use change is a major driver of biodiversity loss worldwide. Although biodiversity often shows a delayed response to land-use change, previous studies have typically focused on a narrow range of current landscape factors and have largely ignored the role of land-use history in shaping plant and animal communities and their functional characteristics. Here, we used a unique database of 220,000 land-use records to investigate how 20-y of land-use changes have affected functional diversity across multiple trophic groups (primary producers, mutualists, herbivores, invertebrate predators, and vertebrate predators) in 75 grassland fields with a broad range of land-use histories. The effects of land-use history on multitrophic trait diversity were as strong as other drivers known to impact biodiversity, e.g., grassland management and current landscape composition. The diversity of animal mobility and resource-acquisition traits was lower in landscapes where much of the land had been historically converted from grassland to crop. In contrast, functional biodiversity was higher in landscapes containing old permanent grasslands, most likely because they offer a stable and high-quality habitat refuge for species with low mobility and specialized feeding niches. Our study shows that grassland-to-crop conversion has long-lasting impacts on the functional biodiversity of agricultural ecosystems. Accordingly, land-use legacy effects must be considered in conservation programs aiming to protect agricultural biodiversity. In particular, the retention of permanent grassland sanctuaries within intensive landscapes may offset ecological debts.",Gaëtane Le Provost; Isabelle Badenhausser; Yoann Le Bagousse‐Pinguet; Yann Clough; Laura Henckel; Cyrille Violle; Vincent Bretagnolle; Marilyn Roncoroni; Peter Manning; Nicolas Gross,A5062110875; A5087152591; A5075472835; A5057350038; A5075950463; A5073523465; A5011716970; A5017649985; A5003868914; A5085089162,"Centre National de la Recherche Scientifique (FR); Senckenberg - Leibniz Institution for Biodiversity and Earth System Research (DE); Institut National de Recherche pour l'Agriculture, l'Alimentation et l'Environnement (FR); Centre d'Etudes Biologiques de Chizé (FR); Senckenberg Biodiversity and Climate Research Centre (DE); La Rochelle Université (FR); Centre National de la Recherche Scientifique (FR); Institut National de Recherche pour l'Agriculture, l'Alimentation et l'Environnement (FR); Centre d'Etudes Biologiques de Chizé (FR); Unité de Recherche Pluridisciplinaire Prairies et Plantes Fourragères (FR); La Rochelle Université (FR); Centre National de la Recherche Scientifique (FR); Institut Méditerranéen de Biodiversité et d'Ecologie Marine et Continentale (FR); Institut de Recherche pour le Développement (FR); Lund University (SE); Centre National de la Recherche Scientifique (FR); Swedish University of Agricultural Sciences (SE); Institut National de Recherche pour l'Agriculture, l'Alimentation et l'Environnement (FR); Centre d'Etudes Biologiques de Chizé (FR); Swedish Species Information Centre (SE); La Rochelle Université (FR); Centre National de la Recherche Scientifique (FR); École Pratique des Hautes Études (FR); Université de Montpellier (FR); Institut de Recherche pour le Développement (FR); Centre National de la Recherche Scientifique (FR); Centre d'Etudes Biologiques de Chizé (FR); La Rochelle Université (FR); Centre National de la Recherche Scientifique (FR); Institut National de Recherche pour l'Agriculture, l'Alimentation et l'Environnement (FR); Centre d'Etudes Biologiques de Chizé (FR); La Rochelle Université (FR); Senckenberg - Leibniz Institution for Biodiversity and Earth System Research (DE); Senckenberg Biodiversity and Climate Research Centre (DE); Université Clermont Auvergne (FR); Institut National de Recherche pour l'Agriculture, l'Alimentation et l'Environnement (FR); VetAgro Sup (FR)","Biodiversity; Ecology; Land use; Grassland; Trophic level; Geography; Habitat; Agroforestry; Land use, land-use change and forestry; Biodiversity hotspot; Agricultural land; Habitat destruction; Ecosystem services; Ecosystem; Biology",biodiversity; ecology; land-use; grassland; trophic-level; geography; habitat; agroforestry; land-use-land-use-change-and-forestry; biodiversity-hotspot; agricultural-land; habitat-destruction; ecosystem-services; ecosystem; biology,https://openalex.org/W1571840503; https://openalex.org/W1575330260; https://openalex.org/W1609810996; https://openalex.org/W1840185503; https://openalex.org/W1929835448; https://openalex.org/W1965701022; https://openalex.org/W1977909820; https://openalex.org/W1987431381; https://openalex.org/W1999205818; https://openalex.org/W2002615685; https://openalex.org/W2003236917; https://openalex.org/W2004909198; https://openalex.org/W2034563189; https://openalex.org/W2037902495; https://openalex.org/W2047384175; https://openalex.org/W2056280096; https://openalex.org/W2100773609; https://openalex.org/W2105156559; https://openalex.org/W2107665951; https://openalex.org/W2109274990; https://openalex.org/W2110065044; https://openalex.org/W2114795157; https://openalex.org/W2117867889; https://openalex.org/W2124478410; https://openalex.org/W2132272855; https://openalex.org/W2133311386; https://openalex.org/W2149301124; https://openalex.org/W2155157807; https://openalex.org/W2155430569; https://openalex.org/W2167094923; https://openalex.org/W2472420705; https://openalex.org/W2510103516; https://openalex.org/W2515058020; https://openalex.org/W2558519551; https://openalex.org/W2590280115; https://openalex.org/W2605879233; https://openalex.org/W2786039766; https://openalex.org/W2799896813; https://openalex.org/W2803418977; https://openalex.org/W2896211727; https://openalex.org/W2926255641; https://openalex.org/W2938463896; https://openalex.org/W2966436668; https://openalex.org/W2966589851; https://openalex.org/W3105481948; https://openalex.org/W3189621076; https://openalex.org/W6920670411,Proceedings of the National Academy of Sciences,en,False -W147127987,10.5195/jwsr.2015.529,"Breaking Ships in the World-System: An Analysis of Two Ship Breaking Capitals, Alang-Sosiya, India and Chittagong, Bangladesh",2015,"Centrality in the world-system allows countries to externalize their hazards or environmental harms on others. Core countries, for instance, dump heavy metals and greenhouse gases into the global sinks, and some of the core's hazardous products, production processes and wastes are displaced to the (semi) peripheral zones of the world-system. Since few (semi) peripheral countries have the ability to assess and manage the risks associated with such hazards, the transfer of core hazards to the (semi) periphery has adverse environmental and socio-economic consequences for many of these countries and it has spawned conflict and resistance, as well as a variety of other responses. Most discussions of this risk globalization problem have failed to situate it firmly in the world-system frame emphasizing the process of ecological unequal exchange. Using secondary sources, I begin such a discussion by examining the specific problem of ship breaking (recycling core-based ocean going vessels for steel and other materials) at the yards in Alang-Sosiya, India and Chittagong, Bangladesh. Attention centers on the nature and scope of ship breaking in these two locations, major drivers operating in the world-system, adverse consequences, the unequal mix of costs and benefits, and the failure of existing political responses at the domestic and international levels to reduce adequately the adverse consequences of ship breaking.",R. Scott Frey,A5084438873,University of Tennessee at Knoxville (US),Environmental hazard; Development economics; Business; Engineering; Natural resource economics; Environmental planning; Environmental protection; Geography; Economics; Ecology,environmental-hazard; development-economics; business; engineering; natural-resource-economics; environmental-planning; environmental-protection; geography; economics; ecology,https://openalex.org/W42362159; https://openalex.org/W76548049; https://openalex.org/W80867919; https://openalex.org/W165365298; https://openalex.org/W356139667; https://openalex.org/W370890276; https://openalex.org/W562385678; https://openalex.org/W576583604; https://openalex.org/W585808560; https://openalex.org/W586618947; https://openalex.org/W619831140; https://openalex.org/W1491531314; https://openalex.org/W1502624808; https://openalex.org/W1514279324; https://openalex.org/W1524520169; https://openalex.org/W1526407077; https://openalex.org/W1531882100; https://openalex.org/W1531974919; https://openalex.org/W1541482107; https://openalex.org/W1547552412; https://openalex.org/W1570612162; https://openalex.org/W1572762085; https://openalex.org/W1579803630; https://openalex.org/W1588550464; https://openalex.org/W1591166682; https://openalex.org/W1602775671; https://openalex.org/W1607409573; https://openalex.org/W1914921294; https://openalex.org/W1963697600; https://openalex.org/W1964310327; https://openalex.org/W1965633248; https://openalex.org/W1971800003; https://openalex.org/W1973417601; https://openalex.org/W1980314759; https://openalex.org/W1986435662; https://openalex.org/W1997312490; https://openalex.org/W1997466867; https://openalex.org/W1997912364; https://openalex.org/W2013091981; https://openalex.org/W2013402297; https://openalex.org/W2015031013; https://openalex.org/W2019093495; https://openalex.org/W2021001691; https://openalex.org/W2025718926; https://openalex.org/W2026597243; https://openalex.org/W2027529454; https://openalex.org/W2030674088; https://openalex.org/W2040342446; https://openalex.org/W2043201903; https://openalex.org/W2048293151; https://openalex.org/W2049611326; https://openalex.org/W2054113825; https://openalex.org/W2054525842; https://openalex.org/W2056526392; https://openalex.org/W2056926496; https://openalex.org/W2061660593; https://openalex.org/W2061916247; https://openalex.org/W2062199894; https://openalex.org/W2074115438; https://openalex.org/W2075340793; https://openalex.org/W2076007148; https://openalex.org/W2078583896; https://openalex.org/W2080458794; https://openalex.org/W2083193007; https://openalex.org/W2086769519; https://openalex.org/W2097737947; https://openalex.org/W2099990298; https://openalex.org/W2100231337; https://openalex.org/W2102618055; https://openalex.org/W2102668013; https://openalex.org/W2104935650; https://openalex.org/W2109111177; https://openalex.org/W2119106412; https://openalex.org/W2119211517; https://openalex.org/W2124565737; https://openalex.org/W2126547557; https://openalex.org/W2128169869; https://openalex.org/W2130441850; https://openalex.org/W2131621631; https://openalex.org/W2134506903; https://openalex.org/W2136134260; https://openalex.org/W2148732650; https://openalex.org/W2149022830; https://openalex.org/W2152976252; https://openalex.org/W2155895810; https://openalex.org/W2160797101; https://openalex.org/W2169385286; https://openalex.org/W2170219305; https://openalex.org/W2182089091; https://openalex.org/W2185907665; https://openalex.org/W2199190077; https://openalex.org/W2201508122; https://openalex.org/W2202864547; https://openalex.org/W2215504314; https://openalex.org/W2253709277; https://openalex.org/W2477738313; https://openalex.org/W2492032746; https://openalex.org/W2578584143; https://openalex.org/W2737078647; https://openalex.org/W2806988935; https://openalex.org/W2891423662; https://openalex.org/W2905180499; https://openalex.org/W2907664459; https://openalex.org/W2945273314; https://openalex.org/W2975405677; https://openalex.org/W3022828466; https://openalex.org/W3024309230; https://openalex.org/W3122477235; https://openalex.org/W3122661090; https://openalex.org/W3125166879; https://openalex.org/W3125379867; https://openalex.org/W3159280209; https://openalex.org/W3213090436; https://openalex.org/W4205870317; https://openalex.org/W4229570833; https://openalex.org/W4244108096; https://openalex.org/W4250340634; https://openalex.org/W4285719527; https://openalex.org/W4299475623; https://openalex.org/W4300550956; https://openalex.org/W4301378955; https://openalex.org/W4319588009; https://openalex.org/W4389266611; https://openalex.org/W4405224716; https://openalex.org/W6603117862; https://openalex.org/W6643473431; https://openalex.org/W6655074950; https://openalex.org/W6656842085; https://openalex.org/W6677619370; https://openalex.org/W6679465770; https://openalex.org/W6688080868; https://openalex.org/W6723228808; https://openalex.org/W7037423374; https://openalex.org/W7051802513,Journal of World-Systems Research,en,False -W2119904838,10.1080/09644016.2015.1090370,Unpacking the politics of natural capital and economic metaphors in environmental policy discourse,2015,"Economic metaphors – including natural capital, natural assets, ecosystem services, and ecological debt – are becoming commonplace in environmental policy discourse. Proponents consider such terms provide a clearer idea of the ‘value’ of nature, and are useful for ensuring the environment is given due attention in decision making. Critical discourse analysis highlights the ideological work language does; the way in which we think, write, and talk about the environment has important implications for how it is governed. Consequently, the widespread use of economic metaphors is politically significant. This article discusses how metaphors have been analysed in environmental policy research, surveys the use of prominent economic metaphors in environmental policy, and considers the politics associated with such terms. The uptake of various economic metaphors represents a form of reverse discourse, varies in politically significant ways, and narrows the terms of environmental debate.",Brian Coffey,A5056992144,RMIT University (AU),Natural capital; Unpacking; Politics; Metaphor; Ideology; Sociology; Capital (architecture); Environmental studies; Discourse analysis; Critical discourse analysis; Natural (archaeology); Environmental politics; Value (mathematics); Environmental policy; Debt; Environmental ethics; Economics; Positive economics; Political science; Ecosystem services; Environmental resource management; Law; Ecology; Linguistics,natural-capital; unpacking; politics; metaphor; ideology; sociology; capital; environmental-studies; discourse-analysis; critical-discourse-analysis; natural; environmental-politics; value; environmental-policy; debt; environmental-ethics; economics; positive-economics; political-science; ecosystem-services; environmental-resource-management; law; ecology; linguistics,https://openalex.org/W54670680; https://openalex.org/W364675936; https://openalex.org/W586058454; https://openalex.org/W591561411; https://openalex.org/W621617282; https://openalex.org/W634424833; https://openalex.org/W1487575620; https://openalex.org/W1505416059; https://openalex.org/W1511186454; https://openalex.org/W1511736487; https://openalex.org/W1528074835; https://openalex.org/W1528113760; https://openalex.org/W1537333624; https://openalex.org/W1545442817; https://openalex.org/W1572302632; https://openalex.org/W1586469975; https://openalex.org/W1595331308; https://openalex.org/W1899753561; https://openalex.org/W1919517363; https://openalex.org/W1994590651; https://openalex.org/W1996951807; https://openalex.org/W2007161913; https://openalex.org/W2007403982; https://openalex.org/W2009489151; https://openalex.org/W2014629333; https://openalex.org/W2020487534; https://openalex.org/W2025810582; https://openalex.org/W2030775185; https://openalex.org/W2035983503; https://openalex.org/W2036219106; https://openalex.org/W2040061106; https://openalex.org/W2046109790; https://openalex.org/W2052417512; https://openalex.org/W2054691965; https://openalex.org/W2061352695; https://openalex.org/W2069034186; https://openalex.org/W2073031385; https://openalex.org/W2090746889; https://openalex.org/W2104024295; https://openalex.org/W2108991971; https://openalex.org/W2124758952; https://openalex.org/W2125467995; https://openalex.org/W2131554966; https://openalex.org/W2134615644; https://openalex.org/W2161586993; https://openalex.org/W2188641303; https://openalex.org/W4210838977; https://openalex.org/W4232184570; https://openalex.org/W4237329516; https://openalex.org/W4239357219; https://openalex.org/W4241244678; https://openalex.org/W4244238918; https://openalex.org/W4245260055; https://openalex.org/W4246027354; https://openalex.org/W4248308225; https://openalex.org/W4255373279; https://openalex.org/W4292917376; https://openalex.org/W4300645397; https://openalex.org/W4301819063; https://openalex.org/W4320800888; https://openalex.org/W4389657267,Environmental Politics,en,False -W4391474705,10.1080/23251042.2024.2309407,The semi-periphery and ecologically unequal exchange: carbon emissions and recursive exploitation,2024,"Social science research has been increasingly interested in the relationships between the environment and the economy. One critical research agenda – ecological unequal exchange – has explored the asymmetric flow of resources and unequal distribution of environmental harms across the world economy, particularly between high-income and low-income countries. However, research into the relationship between middle-income nations and low-income nations has been relatively minimal. This study, building off a world-systems taxonomy of core, semi-periphery, and periphery states, looks to extend research into the ecological dynamics captured in the trade among the non-core states, with regards to carbon emissions, over the course of 1996–2018. I find that patterns of ecological unequal exchange vary among the tiers of the semi-periphery – identified as the 'Semi-Core,' the 'Regional Powers,' and the 'Secondary Regional States' – suggesting the importance of tier-specific political-economic features in generating ecological unequal exchange outcomes.",Hassan El Tinay,A5028079790,,Environmental sociology; Carbon fibers; Natural resource economics; Greenhouse gas; Ecology; Environmental science; Sociology; Economics; Social science; Biology; Computer science,environmental-sociology; carbon-fibers; natural-resource-economics; greenhouse-gas; ecology; environmental-science; sociology; economics; social-science; biology; computer-science,https://openalex.org/W651598703; https://openalex.org/W1484384217; https://openalex.org/W1495220204; https://openalex.org/W1504658872; https://openalex.org/W1544989902; https://openalex.org/W1681545227; https://openalex.org/W1975490723; https://openalex.org/W1992762801; https://openalex.org/W2002961660; https://openalex.org/W2020935901; https://openalex.org/W2057810683; https://openalex.org/W2072408946; https://openalex.org/W2080351687; https://openalex.org/W2088030007; https://openalex.org/W2115768128; https://openalex.org/W2123567146; https://openalex.org/W2143917121; https://openalex.org/W2169776575; https://openalex.org/W2187258560; https://openalex.org/W2243318061; https://openalex.org/W2249688373; https://openalex.org/W2345240133; https://openalex.org/W2500221348; https://openalex.org/W2617245318; https://openalex.org/W2735485714; https://openalex.org/W2743178718; https://openalex.org/W2753028055; https://openalex.org/W2789854516; https://openalex.org/W2790147032; https://openalex.org/W2791909668; https://openalex.org/W2796317886; https://openalex.org/W2811505433; https://openalex.org/W2930040016; https://openalex.org/W2956268707; https://openalex.org/W2973704988; https://openalex.org/W2999137147; https://openalex.org/W3014912319; https://openalex.org/W3033244837; https://openalex.org/W3037550216; https://openalex.org/W3045540281; https://openalex.org/W3080367007; https://openalex.org/W3110745579; https://openalex.org/W3206338816; https://openalex.org/W4232456625; https://openalex.org/W4233208757; https://openalex.org/W4236945833; https://openalex.org/W4238756271; https://openalex.org/W4242816708; https://openalex.org/W4246066143; https://openalex.org/W4254461681; https://openalex.org/W4372348656; https://openalex.org/W4400789899; https://openalex.org/W7002005117; https://openalex.org/W7047669798,Environmental Sociology,en,False -W1765082176,10.60082/2817-5069.1347,"Leading Towards a Level Playing Field, Repaying Ecological Debt, or Making Environmental Space: Three Stories about International Environmental Cooperation",2005,"This article considers a number of different ways of conceptualizing the relationship between South and North in the environmental context, focusing on international responses to climate change and, in particular, the Kyoto Protocol to the United Nations Framework Convention on Climate Change. It explores three stories about international environmental cooperation. One derives from the concept of ""ecological debt,"" the second comes from the concept of ""environmental space,"" and the third, which might be said to underlie the U.S. approach to the Kyoto Protocol at the present time, is labelled ""leading towards a level playing field."" The article provides an overview of all three stories, and attempts to offer some insight into the very different visions of the international community that they encapsulate.",Karin Mickelson,A5075761661,Universidad Braulio Carrillo (CR),Vision; United Nations Framework Convention on Climate Change; Kyoto Protocol; Convention; Context (archaeology); Field (mathematics); Debt; Climate change; Space (punctuation); International community; Political science; Environmental resource management; Environmental ethics; Ecology; Sociology; Geography; Business; Law; Economics; Politics; Computer science,vision; united-nations-framework-convention-on-climate-change; kyoto-protocol; convention; context; field; debt; climate-change; space; international-community; political-science; environmental-resource-management; environmental-ethics; ecology; sociology; geography; business; law; economics; politics; computer-science,,Osgoode Hall law journal,en,False -W2901782820,10.2458/v25i1.22013,"Public knowledge, attitudes and perception of ecological debt",2018,"The concept of ecological debt describes the ecological relations between industrialized (developed) and developing countries and the environment. It refers to the responsibility held by those who live in industrialized countries, as well as their accomplices in the South, for the continuing destruction of the planet due to production and consumption patterns. Ecological debt is a potentially powerful tool for re-discussing relations between North and South and for rethinking sustainable development policies. The aim of the current study is to evaluate the public's knowledge, attitude towards, and perceptions of topics related to the concept of ecological debt. A survey was conducted using a structured questionnaire among residents of Athens, the capital of Greece. To the best of our knowledge this is the first time that this issue has been explored, with regard to public opinion and this is the beginning of a discussion on public understanding of ecological debt. The survey reveals that the concept of ecological debt is not widely understood; but the participants seem to agree on the causes of its generation and on its association with external financial debt. The research findings guide alternative proposals to relevant social movements and/or organizations for the design of wake-up policies.",Efi Drimili; Efthimios Zervas,A5107969561; A5010764655,Hellenic Open University (GR); Hellenic Open University (GR),Debt; Public opinion; Perception; Consumption (sociology); Sustainable development; Political science; Business; Sociology; Psychology; Finance; Social science,debt; public-opinion; perception; consumption; sustainable-development; political-science; business; sociology; psychology; finance; social-science,https://openalex.org/W810233521; https://openalex.org/W1515669283; https://openalex.org/W1523895391; https://openalex.org/W1581783538; https://openalex.org/W1584129281; https://openalex.org/W1605140183; https://openalex.org/W1963486613; https://openalex.org/W1973899709; https://openalex.org/W1986875667; https://openalex.org/W1992688562; https://openalex.org/W2012254774; https://openalex.org/W2038699019; https://openalex.org/W2048051304; https://openalex.org/W2085683054; https://openalex.org/W2089327955; https://openalex.org/W2126212614; https://openalex.org/W2137540105; https://openalex.org/W2272890368; https://openalex.org/W2319568853; https://openalex.org/W2562324168; https://openalex.org/W2592356138; https://openalex.org/W2594589186; https://openalex.org/W2618067250; https://openalex.org/W2620457709; https://openalex.org/W2757478421; https://openalex.org/W2759503593; https://openalex.org/W2913390697; https://openalex.org/W3159280209; https://openalex.org/W4300483823; https://openalex.org/W4301375542; https://openalex.org/W4394846027; https://openalex.org/W6629265512; https://openalex.org/W6631258106; https://openalex.org/W6850696550,Journal of Political Ecology,en,False -W3017089289,10.4324/9781315207094-4,Expanding treadmill of production analysis within green criminology by integrating metabolic rift and ecological unequal exchange theories,2020,"This chapter draws upon the treadmill of production (ToP) theoretical framework to demonstrate how capitalism produces environmental crimes and harms at both the local and global level. The chapter begins with a description of ToP before extending the political economic orientation of ToP by connecting it to two other radical political economic theories designed to make the linkage between capitalism and ecological destruction more visible: metabolic rift theory and ecological unequal exchange theory. The authors of this chapter argue that these views help round out the ToP approach and can be applied to understand any number of environmental crimes and injustices associated with ecological disorganisation. Encouraging further exploration by green criminologists, the authors make the case for establishing stronger connections to the ecological Marxist and environmental sociology literatures, as well as to the growing number of empirical studies in those fields that support these approaches.",Michael J. Lynch; Paul B. Stretesky; Michael A. Long; Kimberly L. Barrett,A5018094670; A5001040330; A5088849050; A5088301346,,Environmental sociology; Production (economics); Ecology; Sociology; Economics; Biology; Microeconomics,environmental-sociology; production; ecology; sociology; economics; biology; microeconomics,,,en,False -W4387183420,10.3389/fenvs.2023.1269691,The impact of FDI on ecological unequal exchange in China’s manufacturing industry,2023,"This paper uses the panel data of manufacturing subdivision industry from 2000 to 2014 to calculate the exchange of ecological inequality through MRIO model. On this basis, the systematic GMM model is used to investigate the direct and indirect effects of Foreign Direct Investment on the unequal exchange of manufacturing ecology. In addition, the ecological unequal exchange in China’s manufacturing industry is decomposed into ecological unequal exchange on the production side, on the consumption side, with developed regions and with lessdeveloped regions. The study finds that: 1) Industry-wide research indicates that FDI inflows have a significant positive impact on reducing the unequal exchange in the manufacturing sector. This finding contributes to the existing literature on the effects of FDI on ecological inequality. 2) Path-specific studies reveal that FDI primarily reduces ecological inequality in the manufacturing sector through technological effects. However, the scale and structural effects of FDI exacerbate ecological inequality, confirming the findings of some scholars. This nuanced understanding of the effects of FDI on ecological inequality adds to the existing body of research. 3) From the perspective of FDI sources, FDI from Asian countries and regions is more beneficial for improving China’s ecological unequal exchange. This finding provides guidance for China’s FDI attraction policies. 4) Assessing pollution emissions inventories based on the principle of production responsibility is unfair to China from both the production and consumption perspectives. 5) From a regional perspective, FDI effectively reduces the impact of ecological unequal exchange in the manufacturing sector between China and developed economies. These findings confirm that China bears an unequal exchange in the trade process and enrich the understanding of the impact of FDI on ecological unequal exchange.",Mengqi Gong; Longle Wang; Xiaofan Li,A5061660679; A5071018060; A5100637080,Wuhan Institute of Technology (CN); Wuhan Institute of Technology (CN); Wuhan Institute of Technology (CN),Foreign direct investment; China; Production (economics); Inequality; Manufacturing; Consumption (sociology); Economics; Economic geography; Ecology; Manufacturing sector; Business; International economics; Geography; Macroeconomics; Biology,foreign-direct-investment; china; production; inequality; manufacturing; consumption; economics; economic-geography; ecology; manufacturing-sector; business; international-economics; geography; macroeconomics; biology,https://openalex.org/W1977411201; https://openalex.org/W2012251817; https://openalex.org/W2024725622; https://openalex.org/W2057810683; https://openalex.org/W2164703638; https://openalex.org/W2263563523; https://openalex.org/W2523304678; https://openalex.org/W2557909387; https://openalex.org/W2618067250; https://openalex.org/W2743178718; https://openalex.org/W2788098830; https://openalex.org/W2886351347; https://openalex.org/W2898613847; https://openalex.org/W2974680376; https://openalex.org/W3010013823; https://openalex.org/W3083280272; https://openalex.org/W3096720883; https://openalex.org/W3122661090; https://openalex.org/W3152730200; https://openalex.org/W4211145470; https://openalex.org/W4306691580; https://openalex.org/W4384393255,Frontiers in Environmental Science,en,False -W4415915422,10.1080/10455752.2025.2579886,Two Sides of the Same Coin: A Synthesis of Economic and Ecological Unequal Exchange,2025,"Capitalism perpetuates injustices by appropriating vast amounts of human effort and natural wealth across regions and populations, all under the guise of economic cooperation and mutual benefit. Marxist and ecological approaches to unequal exchange (UE) both seek to expose these transfers. Yet without theoretical integration, they fail to support crucial alliances between social and environmental justice movements. This paper therefore approaches UE as the convergence of labour, material, monetary, and currency imbalances. While individual imbalances may indicate asymmetry, their combined effect reveals deeper, systemic injustices. In 2022, after excluding productivity gaps, UE (expressed in monetary terms) amounted to a gain of US$ 3.1 trillion for the economies of the centre (equivalent to 27% of their combined Domestic Value Added, DVA) and a loss of US$ 1.7 trillion for the periphery (108%). When productivity gaps are included, the centre's gain rises to US$ 8.8 trillion (76%), while the periphery loses US$ 6.9 trillion – equivalent to a staggering 440% of DVA. These imbalances reflect not a deviation from some “true” or “fair” monetary value of nature or labour, but rather expose a system sustained by extraction and exploitation. Balance cannot be restored within such a system; it must be transformed.",Crelis Rammelt,A5005445191,University of Amsterdam (NL),Capitalism; Production (economics); Sustainability,capitalism; production; sustainability,https://openalex.org/W1964911611; https://openalex.org/W1967540883; https://openalex.org/W1975529595; https://openalex.org/W1990164247; https://openalex.org/W1993258255; https://openalex.org/W1997312490; https://openalex.org/W2014634665; https://openalex.org/W2056926496; https://openalex.org/W2076881948; https://openalex.org/W2119211517; https://openalex.org/W2345419491; https://openalex.org/W2515104092; https://openalex.org/W2624693595; https://openalex.org/W2794556575; https://openalex.org/W2899120092; https://openalex.org/W3083280272; https://openalex.org/W3144452147; https://openalex.org/W4211221020; https://openalex.org/W4234010666; https://openalex.org/W4251638621; https://openalex.org/W4282567479; https://openalex.org/W4361289971; https://openalex.org/W4387429400; https://openalex.org/W4388661872; https://openalex.org/W4396494537; https://openalex.org/W4401091536; https://openalex.org/W4409155547; https://openalex.org/W4409540095; https://openalex.org/W4412018112; https://openalex.org/W6908880526,Capitalism Nature Socialism,en,False -W4242353811,10.4324/9780203076989-29,Environmental justice and ecological debt in Belgium: the UMICORE case,2013,"The notion of ecological debt focuses on unequal exploitation of the global commons, and includes pollution, disproportionate use of the environment and ‘theft’ of southern resources by northern countries. The calculations of such environmental damages represent a practical tool for pursuing environmental justice. This chapter takes a more local view of the notion of ecological debt, by applying the same principles around an industrial site in a Northern country. ‘Ecological debt’ is in this context equivalent to ‘environmental liability’. A company has assets and liabilities, i.e. debts. The environmental liabilities rarely appear in the balance sheets. Similarly, the ecological debts of rich countries do not appear in their macroeconomic accounts. We focus on historically created ecological damage, considering impacts on health and capabilities, the major collateral damages infl icted in the recent past by the emissions of a particular site in Belgium run by the company UMICORE. In the fi rst section, we present the notions of environmental justice, ecological debt and particularly the idea of ‘private ecological debt’ or environmental liability. The second section describes the methodology for evaluating the ecological debt in the case under study. Section three shows the calculations and results. In section four, we discuss the advantages of collaborative or co-operative research between scientists and civil society actors, which lie at the heart of the present book, and the resulting practical and theoretical contributions of this study.",,,,Environmental justice; Debt; Economic Justice; Ecology; Geography; Political science; Business; Biology; Finance; Law,environmental-justice; debt; economic-justice; ecology; geography; political-science; business; biology; finance; law,,,en,False -W2424450747,10.1016/j.ecolecon.2016.06.006,Where have all the funds gone? Multiregional input-output analysis of the European Agricultural Fund for Rural Development,2016,,Fabio Monsalve; Jorge Zafrilla; María‐Ángeles Cadarso,A5081118602; A5047259057; A5036506113,University of Castilla-La Mancha (ES); University of Castilla-La Mancha (ES); University of Castilla-La Mancha (ES),Sustainability; Agriculture; Distribution (mathematics); Business; Sustainable development; Economics; Rural development; Natural resource economics; Geography; Ecology,sustainability; agriculture; distribution; business; sustainable-development; economics; rural-development; natural-resource-economics; geography; ecology,https://openalex.org/W749416070; https://openalex.org/W1492289444; https://openalex.org/W1493472778; https://openalex.org/W1542047764; https://openalex.org/W1650067763; https://openalex.org/W1895628710; https://openalex.org/W1956760944; https://openalex.org/W1964085940; https://openalex.org/W1970139579; https://openalex.org/W1971309533; https://openalex.org/W1982813761; https://openalex.org/W1987219067; https://openalex.org/W1988324589; https://openalex.org/W1992683955; https://openalex.org/W1995968610; https://openalex.org/W1998830031; https://openalex.org/W2009852955; https://openalex.org/W2010351240; https://openalex.org/W2020393050; https://openalex.org/W2026535485; https://openalex.org/W2029670485; https://openalex.org/W2033554029; https://openalex.org/W2035943368; https://openalex.org/W2037089594; https://openalex.org/W2041490855; https://openalex.org/W2045987553; https://openalex.org/W2049663377; https://openalex.org/W2050650868; https://openalex.org/W2052603662; https://openalex.org/W2058450398; https://openalex.org/W2062825804; https://openalex.org/W2065289804; https://openalex.org/W2083280785; https://openalex.org/W2087939361; https://openalex.org/W2093445010; https://openalex.org/W2096081303; https://openalex.org/W2100016968; https://openalex.org/W2102966366; https://openalex.org/W2113219607; https://openalex.org/W2126205604; https://openalex.org/W2144975314; https://openalex.org/W2145917034; https://openalex.org/W2158804744; https://openalex.org/W2162141368; https://openalex.org/W2162550487; https://openalex.org/W2166001406; https://openalex.org/W2171050209; https://openalex.org/W2318764153; https://openalex.org/W2319851860; https://openalex.org/W2322974595; https://openalex.org/W2323325301; https://openalex.org/W2332875009; https://openalex.org/W2335259225; https://openalex.org/W2399179509; https://openalex.org/W3121873832; https://openalex.org/W3124228636; https://openalex.org/W3125711463; https://openalex.org/W6622074492; https://openalex.org/W6641122997; https://openalex.org/W6662088076; https://openalex.org/W6981294069,Ecological Economics,en,False -W4312219881,10.1080/14747731.2022.2157992,"Climate, violence, resource extraction and ecological debt: global implications of an assassination on South Africa's coal mining belt",2022,"Extractivism has attracted inspiring resistance in South Africa, but far-reaching lessons from one site of struggle in KwaZulu-Natal Province are sobering. The October 2020 assassination of Fikile Ntshangase, an anti-coal activist, reflects difficult political-economic and political-ecological terrain. The critical role of gendered activism in former apartheid-era Bantustans underlay concrete problems Ntshangase faced when confronted by male coal-mine labourers. There was no ‘Just Transition’ programme to decarbonize the mine at the time. The corporation that benefited from the assassination, Petmin, was expanding into Ntshangase's village. In the process, not only did the need to cease coal mining become of enormous global concern, but Petmin’s role in international circuits of capital also gave rise to a new round of global-local and socio-ecological linkages. Some involve the World Bank while others entail solidarity with victims of the same firm near the United States city of Cleveland.",Patrick Bond,A5061884523,University of Johannesburg (ZA),Solidarity; Political ecology; Politics; Political science; Corporation; Resource (disambiguation); Debt; Economy; Political economy; Development economics; Business; Sociology; Economics; Law,solidarity; political-ecology; politics; political-science; corporation; resource; debt; economy; political-economy; development-economics; business; sociology; economics; law,https://openalex.org/W106908474; https://openalex.org/W1862751979; https://openalex.org/W2534779911; https://openalex.org/W2971750072; https://openalex.org/W4285190786,Globalizations,en,False -W4250250916,10.2307/j.ctt183p4mr,Ecological Debt,2009,,Andrew Simms,A5112290444,,Environmental science; Economics; Ecology; Biology,environmental-science; economics; ecology; biology,,Pluto Press eBooks,en,False -W2023267627,10.1016/j.ecoleng.2006.05.021,Natural capital: The limiting factor,2006,,Joshua Farley; Herman E. Daly,A5090686681; A5027651591,"University of Vermont (US); University of Maryland, College Park (US)",Footprint; Ecological footprint; Environmental science; Occupancy; Natural resource; Land use; Geography; Environmental resource management; Ecology; Sustainability,footprint; ecological-footprint; environmental-science; occupancy; natural-resource; land-use; geography; environmental-resource-management; ecology; sustainability,https://openalex.org/W121151744; https://openalex.org/W571165093; https://openalex.org/W617737805; https://openalex.org/W1530567397; https://openalex.org/W1564107706; https://openalex.org/W1574252464; https://openalex.org/W1574645189; https://openalex.org/W1608237007; https://openalex.org/W1927063796; https://openalex.org/W1936774573; https://openalex.org/W1970317388; https://openalex.org/W1970376522; https://openalex.org/W1994485043; https://openalex.org/W1999061137; https://openalex.org/W2008143266; https://openalex.org/W2012341183; https://openalex.org/W2027271929; https://openalex.org/W2048973844; https://openalex.org/W2057931959; https://openalex.org/W2073080915; https://openalex.org/W2099799233; https://openalex.org/W2112484287; https://openalex.org/W2149161296; https://openalex.org/W2151301860; https://openalex.org/W2164556042; https://openalex.org/W2481880397; https://openalex.org/W2555957898; https://openalex.org/W3137224376; https://openalex.org/W4301267015; https://openalex.org/W6672806637; https://openalex.org/W6684132962; https://openalex.org/W6757687813,Ecological Engineering,en,False -W2796372547,10.4337/9781849805520.00019,Ecological Debt: An Integrating Concept for Socio-Environmental Change,2010,"This thoroughly revised Handbook provides an assessment of the scope and content of environmental sociology, and sets out the intellectual and practical challenges posed by the urgent need for policy and action to address accelerating environmental change.",Iñaki Bárcena Hinojal; Rosa Lago Aurrekoetxea,A5040506861; A5037022026,,Scope (computer science); Action (physics); Environmental change; Debt; Environmental resource management; Sociology; Political science; Environmental planning; Ecology; Business; Geography; Environmental science; Computer science; Climate change; Biology,scope; action; environmental-change; debt; environmental-resource-management; sociology; political-science; environmental-planning; ecology; business; geography; environmental-science; computer-science; climate-change; biology,,Edward Elgar Publishing eBooks,en,False -W3210510104,10.1080/13549839.2021.1983795,"Circularity, entropy, ecological conflicts and LFFU",2021,"The economy is not circular, it is increasingly entropic. Energy from the photosynthesis of the distant past, fossil fuels, is burned and dissipated. Even without further economic growth the industrial economy would need new supplies of energy and materials extracted from the “commodity frontiers”, producing also more waste (including excessive amounts of greenhouse gases). Therefore, new ecological distribution conflicts (EDC) arise all the time. Such EDCs are often “valuation contests” displaying incommensurable plural values. Examples from the Atlas of Environmental Justice are given of coal, oil and gas-related conflicts in several countries combining local and global complaints. Claims for climate justice and recognition of an ecological debt have been put forward by environmentalists from the South since 1991, together with a strategy of leaving fossil fuels underground (LFFU) through bottom-up movements. This could make a substantial contribution to the decrease in carbon dioxide emissions.",Joan Martínez Alier,A5004042357,Universitat Autònoma de Barcelona (ES),Greenhouse gas; Fossil fuel; Natural resource economics; Plural; Valuation (finance); Coal; Economics; Ecological economics; Commodity; Environmental justice; Energy security; Ecology; Sustainability; Environmental science; Economy; Geography; Renewable energy; Market economy,greenhouse-gas; fossil-fuel; natural-resource-economics; plural; valuation; coal; economics; ecological-economics; commodity; environmental-justice; energy-security; ecology; sustainability; environmental-science; economy; geography; renewable-energy; market-economy,https://openalex.org/W39838849; https://openalex.org/W91194789; https://openalex.org/W106908474; https://openalex.org/W647036171; https://openalex.org/W1505091764; https://openalex.org/W1541584794; https://openalex.org/W1595652305; https://openalex.org/W1803673662; https://openalex.org/W1862702728; https://openalex.org/W1963684733; https://openalex.org/W1963985712; https://openalex.org/W1973318389; https://openalex.org/W1979816480; https://openalex.org/W1992262753; https://openalex.org/W2030626342; https://openalex.org/W2041321854; https://openalex.org/W2048051304; https://openalex.org/W2053216029; https://openalex.org/W2056619110; https://openalex.org/W2076926005; https://openalex.org/W2079856242; https://openalex.org/W2082793946; https://openalex.org/W2101108903; https://openalex.org/W2118628106; https://openalex.org/W2131236975; https://openalex.org/W2132214484; https://openalex.org/W2155200498; https://openalex.org/W2271137388; https://openalex.org/W2313084143; https://openalex.org/W2324550751; https://openalex.org/W2342655129; https://openalex.org/W2567287119; https://openalex.org/W2592356138; https://openalex.org/W2598540519; https://openalex.org/W2772693920; https://openalex.org/W2772802389; https://openalex.org/W2790216946; https://openalex.org/W2791564097; https://openalex.org/W2797346201; https://openalex.org/W2797434453; https://openalex.org/W2801608957; https://openalex.org/W2883168693; https://openalex.org/W2889685062; https://openalex.org/W2891857460; https://openalex.org/W2892221156; https://openalex.org/W2901758408; https://openalex.org/W2921021117; https://openalex.org/W2981711509; https://openalex.org/W2991613651; https://openalex.org/W3011803474; https://openalex.org/W3023793666; https://openalex.org/W3033432264; https://openalex.org/W3047060341; https://openalex.org/W3090697615; https://openalex.org/W3091617824; https://openalex.org/W3091902962; https://openalex.org/W3092621118; https://openalex.org/W3094134127; https://openalex.org/W3098302150; https://openalex.org/W3100044586; https://openalex.org/W3107877676; https://openalex.org/W3120723020; https://openalex.org/W3129731695; https://openalex.org/W3139265487; https://openalex.org/W3146360081; https://openalex.org/W3154286314; https://openalex.org/W3197396347; https://openalex.org/W3205393210; https://openalex.org/W4233654598; https://openalex.org/W4233919019; https://openalex.org/W4241340504; https://openalex.org/W4241852105; https://openalex.org/W4252072419; https://openalex.org/W4252277488; https://openalex.org/W4254369197; https://openalex.org/W4301267015; https://openalex.org/W4311608047; https://openalex.org/W4387882599,Local Environment,en,False -W4394877371,10.3390/su16083371,Exploring the Impact of FDI and Technological Progress Path on Ecological Unequal Exchange within Manufacturing Industry in China,2024,"Under the premise of jointly promoting global ecological and environmental governance, as an important promoter of economic globalization and the main communicator of low-carbon technology, how does FDI contribute to EUE? In addition, technology can affect ecological inequality exchange by affecting production methods and other aspects, so what role does the path of technological progress play in it? These questions are the focus of this paper. Ecological unequal exchange is calculated using the MRIO model, and this study further examines the influence of FDI on this exchange in the manufacturing sector via technological progress using the systematic GMM model. The study discovered the following: (1) The full sample study reveals that FDI inflows can significantly reduce the EUE of the manufacturing industry, but FDI exacerbates the EUE in the manufacturing industry by further worsening it through the pathway of technological progress (2) Further research finds that the effect of FDI on the EUE in the manufacturing sector through technological progress path will be different due to the source of FDI vary, the causes of ecological unequal exchange, the time period, and the development of a technological progress path.",Mengqi Gong; Weike Zhang,A5061660679; A5101610023,Wuhan Institute of Technology (CN); Wuhan Institute of Technology (CN),Foreign direct investment; Technological change; Manufacturing; Economic geography; Globalization; Premise; China; Industrial organization; Business; Path dependence; Manufacturing sector; Sample (material); Corporate governance; Economics; Ecology; International economics; Marketing; Geography; Market economy; Macroeconomics; Management,foreign-direct-investment; technological-change; manufacturing; economic-geography; globalization; premise; china; industrial-organization; business; path-dependence; manufacturing-sector; sample; corporate-governance; economics; ecology; international-economics; marketing; geography; market-economy; macroeconomics; management,https://openalex.org/W1495220204; https://openalex.org/W1970139579; https://openalex.org/W2012011920; https://openalex.org/W2057810683; https://openalex.org/W2091748877; https://openalex.org/W2367636902; https://openalex.org/W2371455775; https://openalex.org/W2381991480; https://openalex.org/W2618067250; https://openalex.org/W2743178718; https://openalex.org/W3010013823; https://openalex.org/W3122619127; https://openalex.org/W3124744803; https://openalex.org/W3125697804; https://openalex.org/W3212855748; https://openalex.org/W6738354462; https://openalex.org/W7005270004,Sustainability,en,False -W2087385946,10.1080/14747730701345218,"Fueling Injustice: Globalization, Ecologically Unequal Exchange and Climate Change",2007,"The globalization of economic production fundamentally reshapes how a ‘fair’ solution to the climate change problem must be forged. Emissions are increasing sharply in developing countries as wealthy nations ‘offshore’ the energy- and natural resource-intensive stages of production. We review a new and relatively under-utilized theory of ‘ecologically unequal exchange’ and apply it to the case of climate change. We describe four distinct principles that have been proposed to assign responsibility for carbon emissions, discuss their inadequacies, and briefly lay out some ‘hybrid’ proposals currently under consideration. We suggest combining hybrid proposals with environmental aid packages that help poorer nations transition from carbon-intensive pathways of development to more climate-friendly development trajectories, using remuneration from the so-called ‘ecological debt’. In the context of deadlock over a completely inadequate Kyoto Protocol, we argue that fairness principles, climate science, and an understanding of globalization and development must be integrated. La globalización de la producción económica cambia completamente la forma de cómo una “simple”solución al problema del cambio climatológico debe de ser alterado. Las emisiones han aumentado bruscamente en los países en desarrollo mientras que los países ricos operan en el extranjero las fases intensas de producción de energía y utilización de recursos naturales. Hemos revisado una teoría nueva y relativamente poco utilizada de ‘intercambio ecológico desigual’ y la hemos aplicado al caso del cambio del clima. Describimos cuatro principios distintos que se propusieron para asignar la responsabilidad a las emisiones de carbón, discutimos sus faltas de adecuación y planeamos brevemente unas propuestas ‘híbridas'que se encuentran actualmente bajo consideración. Sugerimos combinar las propuestas híbridas con los paquetes de ayuda para el medio ambiente que ayuden a las naciones más pobres a hacer la transición de las vías intensivas de desarrollo de carbón a trayectorias de desarrollo más adaptable al clima, usando renumeración de la llamada ‘deuda ecológica’. En el contexto sobre un Protocolo de Kyoto estancado y completamente inadecuado, discutimos que la justicia, ciencia climatológica y el entendimiento de globalización y desarrollo deben integrarse.",J. Timmons Roberts; Bradley C. Parks,A5082988195; A5047978847,Williams (United States) (US); William & Mary (US); Millennium Challenge Corporation (US),Globalization; Welfare economics; Kyoto Protocol; Climate change; Context (archaeology); Political science; Economy; Natural resource; Geography; Natural resource economics; Economic system; Economics; Ecology,globalization; welfare-economics; kyoto-protocol; climate-change; context; political-science; economy; natural-resource; geography; natural-resource-economics; economic-system; economics; ecology,https://openalex.org/W18714912; https://openalex.org/W53023682; https://openalex.org/W228880448; https://openalex.org/W414522172; https://openalex.org/W564021603; https://openalex.org/W571951978; https://openalex.org/W608430605; https://openalex.org/W613588134; https://openalex.org/W651598703; https://openalex.org/W1503706120; https://openalex.org/W1527117602; https://openalex.org/W1552736777; https://openalex.org/W1563281257; https://openalex.org/W1565850046; https://openalex.org/W1580621702; https://openalex.org/W1583029312; https://openalex.org/W1593994209; https://openalex.org/W1594846353; https://openalex.org/W1607694897; https://openalex.org/W1823886455; https://openalex.org/W1970732996; https://openalex.org/W1979153761; https://openalex.org/W1980981591; https://openalex.org/W1993184008; https://openalex.org/W1996879967; https://openalex.org/W1998804088; https://openalex.org/W2005340918; https://openalex.org/W2008178580; https://openalex.org/W2013402297; https://openalex.org/W2017032566; https://openalex.org/W2021458480; https://openalex.org/W2027255868; https://openalex.org/W2030978014; https://openalex.org/W2036713768; https://openalex.org/W2038981142; https://openalex.org/W2056926496; https://openalex.org/W2069512745; https://openalex.org/W2069551332; https://openalex.org/W2076095769; https://openalex.org/W2077858203; https://openalex.org/W2083170299; https://openalex.org/W2084528250; https://openalex.org/W2095688137; https://openalex.org/W2101062956; https://openalex.org/W2101108903; https://openalex.org/W2109558192; https://openalex.org/W2125388400; https://openalex.org/W2126212614; https://openalex.org/W2173400697; https://openalex.org/W2174103482; https://openalex.org/W2182089091; https://openalex.org/W2259217146; https://openalex.org/W2341034567; https://openalex.org/W2392627374; https://openalex.org/W2487688836; https://openalex.org/W2501585505; https://openalex.org/W2528256758; https://openalex.org/W2799152616; https://openalex.org/W3102500135; https://openalex.org/W3121653486; https://openalex.org/W3123081990; https://openalex.org/W3123592998; https://openalex.org/W3124119720; https://openalex.org/W3159280209; https://openalex.org/W4230109911; https://openalex.org/W4232708887; https://openalex.org/W4234534685; https://openalex.org/W4237018467; https://openalex.org/W4247796865; https://openalex.org/W4285719527; https://openalex.org/W4299448508,Globalizations,en,False -W3135111755,10.1016/j.ecolind.2021.107480,Improvement and application of the three-dimensional ecological footprint model,2021,"The ecological footprint (EF) is an important tool for assessing ecological resource occupancy. The three-dimensional (3D) EF changes the EF from a plane to a column, and the bottom (EFsize) represents the human appropriation of the annual natural resource flow provided by the earth, while the height (EFdepth) represents the number of years required to regenerate the resources consumed within 1 year. According to the difference in the human demands for the productive functions of land, this paper improves the 3D EF model based on three sub-items, namely, the basic land footprint (including the footprint of cropland, grazing land and fishing grounds), which captures the demands of the physical part of food and clothing; forest land footprint, which captures wood and carbon absorption demands; and the built-up land footprint, which captures production and living space demands. The improved model is a 3D structure with three different heights. The bottom shows human appropriation of annual natural flows of the sub-items, and there is competition between the sub-items. The sub-heights are related to the overshoot of the sub-items. The forest land footprint depth is earlier and deeper than the 3D EF, and the footprint depth of the built-up land and basic land kept the natural depth. Therefore, humans perceive climate change, but their daily survival is not significantly affected. The flow occupancy ratio (orflow) and the accumulated ecological debt depth (EFdepthaccum) are introduced to analyse the closeness to the overshooting state and the years of using existing resources to eliminate historical ecological debt, respectively.",Mingli Bi; Cuiyou Yao; Gaodi Xie; Jingya Liu; Keyu Qin,A5008414446; A5045501264; A5102898759; A5101510723; A5016482157,Capital University of Economics and Business (CN); Capital University of Economics and Business (CN); Institute of Geographic Sciences and Natural Resources Research (CN); Chinese Academy of Sciences (CN); Chinese Academy of Sciences (CN); Institute of Geographic Sciences and Natural Resources Research (CN); Chinese Academy of Sciences (CN); Institute of Oceanology (CN),Ecological footprint; Environmental science; Footprint; Occupancy; Land use; Natural resource; Environmental resource management; Ecology; Geography; Sustainability,ecological-footprint; environmental-science; footprint; occupancy; land-use; natural-resource; environmental-resource-management; ecology; geography; sustainability,https://openalex.org/W1583147110; https://openalex.org/W1670321511; https://openalex.org/W1966364945; https://openalex.org/W1978430273; https://openalex.org/W1985203887; https://openalex.org/W1993351177; https://openalex.org/W2000984567; https://openalex.org/W2023267627; https://openalex.org/W2030498171; https://openalex.org/W2038398724; https://openalex.org/W2041447960; https://openalex.org/W2043244602; https://openalex.org/W2049235562; https://openalex.org/W2061195351; https://openalex.org/W2082737326; https://openalex.org/W2085596282; https://openalex.org/W2096885696; https://openalex.org/W2102387788; https://openalex.org/W2124350766; https://openalex.org/W2158809385; https://openalex.org/W2162648754; https://openalex.org/W2173448856; https://openalex.org/W2318167787; https://openalex.org/W2343073829; https://openalex.org/W2367839488; https://openalex.org/W2555754221; https://openalex.org/W2583237449; https://openalex.org/W2591241614; https://openalex.org/W2610836651; https://openalex.org/W2622029016; https://openalex.org/W2738104081; https://openalex.org/W2782393706; https://openalex.org/W2806335189; https://openalex.org/W2809858641; https://openalex.org/W2887510779; https://openalex.org/W2891411478; https://openalex.org/W2897191418; https://openalex.org/W2898686451; https://openalex.org/W2905314297; https://openalex.org/W2915580847; https://openalex.org/W2915905786; https://openalex.org/W2942854102; https://openalex.org/W2945757657; https://openalex.org/W2966517724; https://openalex.org/W3016419643; https://openalex.org/W3125042908; https://openalex.org/W3159645282; https://openalex.org/W6775626879; https://openalex.org/W7071651851,Ecological Indicators,en,False -W2051634160,10.1080/01436597.2013.786288,"Carbon Markets, Debt and Uneven Development",2013,"Abstract The United Nations Clean Development Mechanism (cdm) has been envisaged as a powerful tool for reconciling the global South’s environment and development problematic. By allowing Southern states to produce and sell carbon credits into the Kyoto Protocol’s compliance market, many predicted a growing North–South transfer of carbon finance, technology and profit. Confronted by deep crisis in global carbon markets, however, the cdm, rather than spurring development, is furnishing the conditions for rising debt and insecurity since project costs must be financed upfront, with the expectation that future project revenue will subsequently fulfil these obligations. This paper analyses the dialectic entanglements between the cdm’s ex post and market-dependent financing structure, the carbon market crisis and uneven development, based on the contention that cdm-related debt reveals the deeply unequal power relations that underpin contemporary approaches to climate change mitigation, whereby the North’s ecological debt is displaced, both materially and financially, onto Southern actors.",Kate Ervine,A5000155071,Schlumberger (Ireland) (IE),Clean Development Mechanism; Kyoto Protocol; Carbon finance; Debt; Carbon credit; Revenue; Economics; Profit (economics); Carbon market; Debt crisis; Climate Finance; Carbon offset; Business; Greenhouse gas; Finance; Economic growth; Developing country; Ecology,clean-development-mechanism; kyoto-protocol; carbon-finance; debt; carbon-credit; revenue; economics; profit; carbon-market; debt-crisis; climate-finance; carbon-offset; business; greenhouse-gas; finance; economic-growth; developing-country; ecology,,Third World Quarterly,en,False -W2021230127,10.1016/s0262-4079(07)62758-4,Cut ecological debt or humanity is at risk,2007,,Catherine Brahic,A5005093501,,Humanity; Planetary boundaries; Debt; Astrobiology; Environmental ethics; Ecology; Environmental science; Biology; Business; Political science; Sustainable development; Philosophy; Law; Finance,humanity; planetary-boundaries; debt; astrobiology; environmental-ethics; ecology; environmental-science; biology; business; political-science; sustainable-development; philosophy; law; finance,,The New Scientist,en,False -W2026461148,10.1007/s10460-014-9567-6,Structural impediments to sustainable groundwater management in the High Plains Aquifer of western Kansas,2014,,Matthew R. Sanderson; R. Scott Frey,A5001783283; A5084438873,Waters (United States) (US); Kansas State University (US); University of Tennessee at Knoxville (US),Aquifer; Groundwater; Agriculture; Resource (disambiguation); Sustainability; Natural resource economics; Rift valley; Water resource management; Geography; Ecology; Environmental science; Economics; Geology; Biology,aquifer; groundwater; agriculture; resource; sustainability; natural-resource-economics; rift-valley; water-resource-management; geography; ecology; environmental-science; economics; geology; biology,https://openalex.org/W60146509; https://openalex.org/W82035503; https://openalex.org/W141261431; https://openalex.org/W228880448; https://openalex.org/W565701012; https://openalex.org/W616635769; https://openalex.org/W628027292; https://openalex.org/W1480446199; https://openalex.org/W1487290281; https://openalex.org/W1494624469; https://openalex.org/W1512183817; https://openalex.org/W1526407077; https://openalex.org/W1550246025; https://openalex.org/W1554641608; https://openalex.org/W1603268398; https://openalex.org/W1803117247; https://openalex.org/W1898499425; https://openalex.org/W1907583418; https://openalex.org/W1966605003; https://openalex.org/W1981704037; https://openalex.org/W1982690502; https://openalex.org/W1986286171; https://openalex.org/W1990164247; https://openalex.org/W2006759735; https://openalex.org/W2015619480; https://openalex.org/W2016536997; https://openalex.org/W2017929814; https://openalex.org/W2020935901; https://openalex.org/W2021515498; https://openalex.org/W2023528362; https://openalex.org/W2031839214; https://openalex.org/W2036713768; https://openalex.org/W2047856663; https://openalex.org/W2049888754; https://openalex.org/W2056926496; https://openalex.org/W2064766425; https://openalex.org/W2075293243; https://openalex.org/W2079188934; https://openalex.org/W2092254604; https://openalex.org/W2093027911; https://openalex.org/W2099743616; https://openalex.org/W2104246777; https://openalex.org/W2104336388; https://openalex.org/W2108057681; https://openalex.org/W2119211517; https://openalex.org/W2122854726; https://openalex.org/W2126772797; https://openalex.org/W2133022495; https://openalex.org/W2142043891; https://openalex.org/W2159642665; https://openalex.org/W2165702945; https://openalex.org/W2166417404; https://openalex.org/W2169986832; https://openalex.org/W2175723801; https://openalex.org/W2226396244; https://openalex.org/W2291738616; https://openalex.org/W2418036091; https://openalex.org/W2516204427; https://openalex.org/W3044225635; https://openalex.org/W3147387277; https://openalex.org/W3147701359; https://openalex.org/W3148727043; https://openalex.org/W4211124652; https://openalex.org/W4211244051; https://openalex.org/W4233654598; https://openalex.org/W4234302912; https://openalex.org/W4241892371; https://openalex.org/W4244588123; https://openalex.org/W4248466517; https://openalex.org/W4251548203; https://openalex.org/W4297775561; https://openalex.org/W4300360800; https://openalex.org/W4319588009; https://openalex.org/W6604253536; https://openalex.org/W6619976831; https://openalex.org/W6655690080; https://openalex.org/W7024744069; https://openalex.org/W7065650524,Agriculture and Human Values,en,False -bib:ricardo1817principles,,On the Principles of Political Economy and Taxation,1817,,"Ricardo, David",ricardo_david,Paper affiliation: UK,political economy; comparative advantage; classical,political_economy; comparative_advantage; classical,,,,True -bib:wallis1969,,The Ecology of Unequal Exchange,1969,,"Wallis, Victor",wallis_victor,Paper affiliation: US,ecology; unequal exchange; marxism,ecology; unequal_exchange; marxism,,Environments and Societies,,True -bib:reyes2020deuda,,"Deuda ecológica del Perú con el mundo, 1990--2018",2020,"Estimación de la deuda ecológica del Perú mediante -análisis de flujos de materiales y huella ecológica.","Reyes, G.; Carrasco, H.",reyes_g; carrasco_h,Paper affiliation: PE,deuda ecológica; Perú; comercio; América Latina,deuda_ecológica; perú; comercio; américa_latina,,Ecología Política,,True -bib:castro2021comercio,,Comercio internacional y deuda ecológica en Bolivia,2021,,"Castro, V.; Bermúdez, A.",castro_v; bermúdez_a,Paper affiliation: BO,deuda ecológica; Bolivia; comercio; extractivismo,deuda_ecológica; bolivia; comercio; extractivismo,,Revista Boliviana de Investigación,,True -bib:bringezu2015assessing,,"Assessing Global Land Use: Balancing Consumption with -Sustainable Supply",2015,,"Bringezu, S.; Schuetz, H.; Pengue, W.; O'Brien, M.; Garcia, F.; Sims, R.; Wirtz, D.",bringezu_s; schuetz_h; pengue_w; obrien_m; garcia_f; sims_r; wirtz_d,Paper affiliation: DE,land use; global; methodology; supply chain,land_use; global; methodology; supply_chain,,UNEP Report,,True -bib:hoekstra2011water,,The Water Footprint Assessment Manual,2011,,"Hoekstra, A. Y.; Chapagain, A. K.; Aldaya, M. M.; Mekonnen, M. M.",hoekstra_a_y; chapagain_a_k; aldaya_m_m; mekonnen_m_m,Paper affiliation: NL,water footprint; manual; methodology,water_footprint; manual; methodology,,Earthscan,,True -bib:openalex2024,,OpenAlex: Open Infrastructure for Bibliographic Data,2024,,{OurResearch},ourresearch_,Paper affiliation: US,openalex; open data; bibliometrics,openalex; open_data; bibliometrics,,,,True -bib:lopez2017extractivism,,Extractivismo y deuda ecológica: revisitando el debate,2017,"Repaso crítico de la literatura latinoamericana sobre -extractivismo y deuda ecológica.","López, A.; Vázquez, R.",lópez_a; vázquez_r,Paper affiliation: AR,extractivismo; deuda ecológica; América Latina; crítica,extractivismo; deuda_ecológica; américa_latina; crítica,,Ecología Política,,True -bib:anomimo2010,,Notas sobre comercio y medio ambiente,2010,,"Anonymous, A.",anonymous_a,Paper affiliation: MX,,,,,,True -bib:garcia2015,,Huella ecológica y comercio Sur-Norte,2015,,"García, M.",garcía_m,Paper affiliation: CO,,,,Cuadernos Latinoamericanos,,True -bib:ecofootprint2020,,Global Ecological Footprint Report,2020,,,,Paper affiliation: US,,,,,,True -bib:anomimo2022,,Tensiones Norte-Sur en políticas climáticas,2022,,"Smith, J.; Patel, R.",smith_j; patel_r,Paper affiliation: IN,,,,,,True -W644940498,,Ecological Debt: The Health of the Planet and the Wealth of Nations,2005,"1. A short walk to Venus 2. The chemist's warning - A short history of global warming 3. The Heaven bursters - Tuvalu and the fate of nations 4. The great reversal of human progress 5. Ecological debt 6. The carbon debt 7. Rationalising self-destruction (or why people are more stupid than frogs) 8. The car park at the end of the world 9. Pay back time - the law, climate change and ecological debt 10. Data for the doubtful - the lessons of war economies 11. The new adjustment 12. Minerva's Owl Notes Index",Andrew Simms,A5112290444,,Debt; Global warming; Venus; Geography; Planet; Natural resource economics; Climate change; Ecology; Economy; Development economics; Political science; Economics; Astrobiology; Finance; Biology,debt; global-warming; venus; geography; planet; natural-resource-economics; climate-change; ecology; economy; development-economics; political-science; economics; astrobiology; finance; biology,,Medical Entomology and Zoology,en,False -W1538980473,,Ecological Unequal Exchange,2001,"In these years many developing countries are engaged in establishing environmental regulation, but unfortunately, their environmental problems are rooted in fundamental issues that cannot easily be corrected by the instruments normally included in environmental regulation. This paper argues that it is necessary to change the power relations, so that developing countries get a chance to rectify their environmental problems. These issues are elucidated by applying the approach of ecological economics. First, the basic theoretical problem regarding economic value is outlined, and second, it is argued that unequal exchange in ecological terms might be at the root of environmental problems in developing countries. The concept of ecological footprints is used as an illustration. Finally, it is argued that the different movements in the South offer some hope for changes.",Inge Røpke,A5016814382,Sustainability Institute (ZA),Developing country; Ecological economics; Value (mathematics); Ecology; Ecological footprint; Root (linguistics); Economics; Sustainable development; Sustainability; Economic growth; Computer science; Biology,developing-country; ecological-economics; value; ecology; ecological-footprint; root; economics; sustainable-development; sustainability; economic-growth; computer-science; biology,,,en,False -W2319568853,,The Concept of Ecological Debt: Its Meaning and Applicability in International Policy,2009,,Erik Paredis; Gert Goeminne; Wouter Vanhove; Frank Maes; Jesse Lambrecht,A5041144613; A5007488495; A5024639661; A5080130364; A5048787297,,Meaning (existential); Ecology; Debt; Epistemology; Economics; Environmental ethics; Positive economics; Political science; Philosophy; Macroeconomics; Biology,meaning; ecology; debt; epistemology; economics; environmental-ethics; positive-economics; political-science; philosophy; macroeconomics; biology,https://openalex.org/W1551322995; https://openalex.org/W1994971437; https://openalex.org/W3007471481,Ghent University Academic Bibliography (Ghent University),en,False -W591561411,,Ecological Debt: Global Warming and the Wealth of Nations,2009,"1. A short walk to Venus 2. The chemist's warning - A short history of global warming 3. The Heaven bursters - Tuvalu and the fate of nations 4. The great reversal of human progress 5. Ecological debt 6. The carbon debt 7. Rationalising self-destruction (or why people are more stupid than frogs) 8. The car park at the end of the world 9. Pay back time - the law, climate change and ecological debt 10. Data for the doubtful - the lessons of war economies 11. The new adjustment 12. Minerva's Owl.",Andrew Simms,A5112290444,,Debt; Global warming; Natural resource economics; Ecology; Geography; Climate change; Economics; Economy; Development economics; Finance; Biology,debt; global-warming; natural-resource-economics; ecology; geography; climate-change; economics; economy; development-economics; finance; biology,,,en,False -W3128101214,,Elaboration of the Concept of Ecological Debt,2004,,Erik Paredis; Jesse Lambrecht; Gert Goeminne; Wouter Vanhove,A5041144613; A5048787297; A5007488495; A5024639661,Ghent University (BE); Ghent University (BE); Laboratoire d’Économie d’Orléans (FR); Ghent University (BE),Elaboration; Ecology; Business; Biology; Philosophy,elaboration; ecology; business; biology; philosophy,,VUBIR (Vrije Universiteit Brussel),en,False -W2379365567,,Human's Consumption of Ecosystem Services and Ecological Debt in China,2010,"Human's reckless consumption is depleting the world's natural capital to a point where we are endangering our future prosperity.Accounting ecological footprint,bio-productive capacity and ecological debt of China during 1980-2005 shows that China has encountered an increased ecological debt with its value of 1.02 ghm2 in 2005 due to increased demand for ecological service of socio-economic metabolism especially on fossil fuels though its bio-productive capacity per capita doubled to 1.15 ghm2.Demand for ecological service,or ecological footprint,in 2005 exceeded China's earth's regenerative capacity by 89%.At the provincial level,85% of China's provinces have been in ecological debt in the long term and now only three provinces of Hainan,Fujian and Xizang are in ecological surplus.China and most of its provinces are in soft ecological deficit due to the contradictions between ecological service supply and demand in spatial,temporal and components structural dimensions.Such a type ecological debt might be mitigated or eliminated by appropriating the current or future global commons or buying hidden ecological service through international or interregional trade channel.China is heading for an ecological credit crunch as the integrated consequence of its natural constraint of land use base to bio-capacity and rapid economic growth.Against the backdrop that natural capital has been among the limiting factors to world's economic development,China earnestly established the scientific development concept and implemented multiple effective activities to reverse ecological'credit crunch' and curb ecological recession.",Yushu Zhang,A5101985252,Beijing Institute of Petrochemical Technology (CN),Ecological footprint; Natural capital; Ecosystem services; Ecological economics; Prosperity; Ecology; Economics; Sustainable development; Natural resource economics; Business; Sustainability; Geography; Economic growth; Ecosystem,ecological-footprint; natural-capital; ecosystem-services; ecological-economics; prosperity; ecology; economics; sustainable-development; natural-resource-economics; business; sustainability; geography; economic-growth; ecosystem,,,en,False -W647204147,,An environmental war economy : the lessons of ecological debt and global warming,2001,,Andrew Simms,A5112290444,,Global warming; Debt; Ecology; Geography; Environmental science; Economics; Natural resource economics; Climate change; Macroeconomics; Biology,global-warming; debt; ecology; geography; environmental-science; economics; natural-resource-economics; climate-change; macroeconomics; biology,,OpenGrey (Institut de l'Information Scientifique et Technique),en,False -W1760358764,,"Social Ecography: International Trade, Network Analysis and an Emmanuelian Conceptualization of Ecological Unequal Exchange",2010,"This thesis demonstrates how network analysis, ecological economics and the world-system perspective can be combined into an ecographic framework that can yield new insights into the underlying structure of the world-economy as well as its surrounding world-ecology. In particular, the thesis focuses on the structural theory of ecological unequal exchange, a theory suggesting a relationship between positionality within the world-system and unequal exchange of biophysical resources. Using formal tools from social network analysis, the theory is tested on empirical trade data for two commodity types – primary agricultural goods and fuel commodities – for the period 1995-1999. As the selected commodities can be seen as adequate representations of the third Ricardian production factor, i.e. natural resources, ecological unequal exchange as conceptualized in this thesis is more in line with the original Emmanuelian factor-cost theory than previous approaches. Here, similar to Emmanuel’s formulation, it is a theory about factor cost differentials. Whereas the theory mostly holds true in the case of fuel commodities, the analysis of primary agricultural commodities actually points to an inverse relationship between structural positionality and ecological unequal exchange. This could point to a fundamental difference between these two types of commodities, for instance as reflected in an observed ecological Leontief paradox, which underlines the need for more detailed, and less typological, treatments of ecological unequal exchange.",Carl Nordlund,A5033663242,,Conceptualization; Economics; Commodity; Ecological economics; Ecology; Sustainability; Computer science,conceptualization; economics; commodity; ecological-economics; ecology; sustainability; computer-science,,Lund University Publications (Lund University),en,False -W91194789,,Ecological Debt and Historical Responsibility Revisited: The case of climate change,2012,"In spite of its strong appeal to NGOs, to certain governments and to some scholars, the concept of an ecological debt accumulated by developed countries due to their historical responsibility deserve a serious critical assessment. The paper provides this assessment in the context of climate change. It first shows how the rhetoric of ecological debt exploits confusion between a pre-modern concept of social debt and the modern one based on the contract figure. Two components of the climate debt are examined: a presumed duty of compensation of the damage imposed by climate change and rules of sharing out of atmospheric services when developed countries are presumed to have emitted GHGs in the past in excess of their fair share. The discussion considers successively the legal and the moral viewpoint. A review of arguments shows that both concepts of ecological debt and historical responsibility disintegrate under scrutiny in the case of climate change, as ill-founded backward-looking reparative concepts as well as additional obstacles to a forward-looking agreement in which responsibilities could legitimately be differentiated according to various variables referring to current states (emissions levels, needs, capacities, etc.). The GHGs emissions that cause problems are those that have taken place since 1990.",Olivier Godard,A5070222969,,Debt; Scrutiny; Greenhouse gas; Climate change; Context (archaeology); Duty; Moral responsibility; Appeal; Damages; Political science; Environmental ethics; Economics; Ecology; Geography; Law; Finance,debt; scrutiny; greenhouse-gas; climate-change; context; duty; moral-responsibility; appeal; damages; political-science; environmental-ethics; economics; ecology; geography; law; finance,https://openalex.org/W203693828; https://openalex.org/W260890562; https://openalex.org/W1169467774; https://openalex.org/W1488923419; https://openalex.org/W1512230970; https://openalex.org/W1519919466; https://openalex.org/W1555168770; https://openalex.org/W1566890474; https://openalex.org/W1593021046; https://openalex.org/W1756467313; https://openalex.org/W1772647737; https://openalex.org/W1781292848; https://openalex.org/W1955391275; https://openalex.org/W1971654441; https://openalex.org/W1974609519; https://openalex.org/W1998111534; https://openalex.org/W2002863535; https://openalex.org/W2012254774; https://openalex.org/W2013531215; https://openalex.org/W2030602370; https://openalex.org/W2058103174; https://openalex.org/W2073139884; https://openalex.org/W2092548441; https://openalex.org/W2103865635; https://openalex.org/W2118777456; https://openalex.org/W2126416729; https://openalex.org/W2126588792; https://openalex.org/W2128207432; https://openalex.org/W2131740028; https://openalex.org/W2157555752; https://openalex.org/W2159167826; https://openalex.org/W2290283773; https://openalex.org/W2336434939; https://openalex.org/W2510803780; https://openalex.org/W2527769517; https://openalex.org/W3121653486; https://openalex.org/W3123930679; https://openalex.org/W3124082720; https://openalex.org/W3124417004; https://openalex.org/W3159280209,Cadmus - EUI Research Repository (European University Institute),en,False -W2980187407,,Preceding and governing measurements : an Emmanuelian conceptualization of ecological unequal exchange,2014,Preceding and governing measurements : an Emmanuelian conceptualization of ecological unequal exchange,Carl Nordlund,A5033663242,,Conceptualization; Ecology; Computer science; Biology; Artificial intelligence,conceptualization; ecology; computer-science; biology; artificial-intelligence,https://openalex.org/W94815793; https://openalex.org/W205206750; https://openalex.org/W592075714; https://openalex.org/W607313397; https://openalex.org/W619768729; https://openalex.org/W647037346; https://openalex.org/W651598703; https://openalex.org/W657044929; https://openalex.org/W1484903358; https://openalex.org/W1507577644; https://openalex.org/W1509006868; https://openalex.org/W1538980473; https://openalex.org/W1597769549; https://openalex.org/W1687549561; https://openalex.org/W1720817898; https://openalex.org/W1780160121; https://openalex.org/W1873550992; https://openalex.org/W1964725364; https://openalex.org/W1966605003; https://openalex.org/W1968441806; https://openalex.org/W1973660359; https://openalex.org/W1974075073; https://openalex.org/W1976412347; https://openalex.org/W1983474380; https://openalex.org/W1983716515; https://openalex.org/W1985596098; https://openalex.org/W1986552857; https://openalex.org/W1990164247; https://openalex.org/W2004388900; https://openalex.org/W2006081504; https://openalex.org/W2008134822; https://openalex.org/W2013402297; https://openalex.org/W2020935901; https://openalex.org/W2026865785; https://openalex.org/W2029425243; https://openalex.org/W2030674088; https://openalex.org/W2031736557; https://openalex.org/W2033186995; https://openalex.org/W2040057718; https://openalex.org/W2048034272; https://openalex.org/W2056926496; https://openalex.org/W2057810683; https://openalex.org/W2057931959; https://openalex.org/W2061901927; https://openalex.org/W2061916247; https://openalex.org/W2072688741; https://openalex.org/W2075693476; https://openalex.org/W2080577950; https://openalex.org/W2087385946; https://openalex.org/W2091709473; https://openalex.org/W2091732022; https://openalex.org/W2100618934; https://openalex.org/W2108429164; https://openalex.org/W2115328246; https://openalex.org/W2119211517; https://openalex.org/W2121841211; https://openalex.org/W2122831705; https://openalex.org/W2123393732; https://openalex.org/W2130289872; https://openalex.org/W2131524001; https://openalex.org/W2133011836; https://openalex.org/W2142043891; https://openalex.org/W2163308020; https://openalex.org/W2166561932; https://openalex.org/W2169085616; https://openalex.org/W2169776575; https://openalex.org/W2184625852; https://openalex.org/W2186681442; https://openalex.org/W2226489716; https://openalex.org/W2230443023; https://openalex.org/W2237618063; https://openalex.org/W2318867465; https://openalex.org/W2328416860; https://openalex.org/W2789951941; https://openalex.org/W3121753494,,en,False -W2140675380,,VLIR-BVO project 2003 'Elaboration of the concept of ecological debt',2004,,Erik Paredis; Jesse Lambrecht; Gert Goeminne; Wouter Vanhove,A5041144613; A5048787297; A5007488495; A5024639661,,Elaboration; Geography; Environmental science; Philosophy,elaboration; geography; environmental-science; philosophy,https://openalex.org/W44884755; https://openalex.org/W68797825; https://openalex.org/W101332654; https://openalex.org/W222966551; https://openalex.org/W647204147; https://openalex.org/W810233521; https://openalex.org/W1907583418; https://openalex.org/W1976776799; https://openalex.org/W2012254774; https://openalex.org/W2018661949; https://openalex.org/W2036713768; https://openalex.org/W2047856663; https://openalex.org/W2085683054; https://openalex.org/W2126212614; https://openalex.org/W2167369155; https://openalex.org/W2226489716; https://openalex.org/W2274729279; https://openalex.org/W2301672513; https://openalex.org/W2339579267; https://openalex.org/W2746485780; https://openalex.org/W3048682234; https://openalex.org/W3123592998; https://openalex.org/W3159280209,Ghent University Academic Bibliography (Ghent University),en,False -W3124841667,,"Leading Towards a Level Playing Field, Repaying Ecological Debt, or Making Environmental Space: Three Stories About International Environmental Cooperation",2005,"This article considers a number of different ways of conceptualizing the relationship between South and North in the environmental context, focusing on international responses to climate change and, particular, the Kyoto Protocol to the United Nations Framework Convention on Climate Change. It explores three stories about international cooperation. One derives from the concept of ""ecological debt,"" the second comes from the concept of ""environmental space,"" and the third, which might be said to underlie the U.S. approach to the Kyoto Protocol at the present time, is labelled ""leading towards a level playing field."" This article provides an overview of all three stories, and attempts to offer some insight into the very different visions of the international community that they encapsulate.",Karin Mickelson,A5075761661,,United Nations Framework Convention on Climate Change; Political science; Convention; Humanities; Kyoto Protocol; Ethnology; Vision; Context (archaeology); Sociology; Climate change; Geography; Ecology; Law; Archaeology; Art; Anthropology,united-nations-framework-convention-on-climate-change; political-science; convention; humanities; kyoto-protocol; ethnology; vision; context; sociology; climate-change; geography; ecology; law; archaeology; art; anthropology,,eYLS (Yale Law School),en,False -W2594382053,,Asymmetries : Conceptualizing Environmental Inequalities as Ecological Debt and Ecologically Unequal Exchange,2017,"In this compilation thesis, consisting of six papers and an introductory chapter, the concepts of ecological debt, climate debt, ecologically unequal exchange, and unequal carbon sink appropriation are at the centre. Their intellectual and political histories are traced to environmental justice movements, ecological economics and neo-Marxist economics. They are developed conceptually and linked together analytically using a stock-flow perspective. Special concern is devoted to climate debt as understood by the climate justice movement. Its claims on climate debt are identified, their normative assumptions tested and climate debt is quantified as consisting of both an emission debt and an adaptation debt. The last paper focus on a historical case study, where a method for measuring ecologically unequal exchange – time-space appropriation – is applied to discuss core and peripheries in the early modern world system, indicating a Sinocentric world economy. In the introductory chapter, sections on critical realism and mixed methods research position the thesis theoretically and methodologically. The concepts at the centre of the thesis are synthesized into what is called an ecological-economic asymmetries approach. Further, the possibilities to base the approach on ecological Marxism and historical-geographical materialism are explored and a potential future research strategy sketched.",Rikard Warlenius,A5020507738,,Debt; Appropriation; Ecological economics; Economics; Positive economics; Political science; Sociology; Social science; Neoclassical economics; Ecology; Sustainability; Epistemology; Macroeconomics,debt; appropriation; ecological-economics; economics; positive-economics; political-science; sociology; social-science; neoclassical-economics; ecology; sustainability; epistemology; macroeconomics,,Lund University Publications (Lund University),en,False -W409900855,,Eco-Sufficiency and Global Justice : Women Write Political Ecology,2009,Ecological Debt: Embodied Debt Ariel Salleh PART I - HISTORIES The Devaluation of Women's Labour Silvia Federici Who is the 'He' of He Who Decides in Economic Discourse? Ewa Charkiewicz The Diversity Matrix: Relationship and Complexity Susan Hawthorne PART II - MATTER Development for Some is Violence for Others Nalini Nayak Nuclearised Bodies and Militarised Space Zohl de Ishtar Women and Deliberative Water Management Andrea Moraes and Ellie Perkins PART III - GOVERNANCE Mainstreaming Trade and Millennium Development Goals? Gig Francisco and Peggy Antrobus Policy and the Measure of Woman Marilyn Waring Feminist Ecological Economics in Theory and Practice Sabine U. O'Hara PART IV - ENERGY Who Pays for Kyoto Protocol? Selling Oxygen and Selling Sex Ana Isla How Global Warming is Gendered Meike Spitzner Women and the Abuja Declaration for Energy Sovereignty Leigh Brownhill and Terisa E. Turner PART V - MOVEMENT Ecofeminist Political Economy and the Politics of Money Mary Mellor Saving Women: Saving the Commons Leo Podlashuc From Eco-Sufficiency to Global Justice Ariel Salleh Index,Ariel Salleh,A5050075228,,Ecological economics; Politics; Political science; Economy; Sociology; Gender studies; Ecology; Economics; Law; Sustainability,ecological-economics; politics; political-science; economy; sociology; gender-studies; ecology; economics; law; sustainability,,,en,False -W3164354311,,Environmental justice and ecological debt in Belgium: The UMICORE case,2013,,Nick Meynen; Léa Sébastien,A5032018808; A5110959155,,Environmental justice; Debt; Environmental resource management; Political science; Natural resource economics; Economics; Ecology; Business; Geography; Finance; Biology,environmental-justice; debt; environmental-resource-management; political-science; natural-resource-economics; economics; ecology; business; geography; finance; biology,,,en,False diff --git a/exploracion/datos/corpus_ied.parquet b/exploracion/datos/corpus_ied.parquet deleted file mode 100644 index 92145ae..0000000 Binary files a/exploracion/datos/corpus_ied.parquet and /dev/null differ diff --git a/exploracion/datos/openalex_ied.csv b/exploracion/datos/openalex_ied.csv deleted file mode 100644 index 28ad77c..0000000 --- a/exploracion/datos/openalex_ied.csv +++ /dev/null @@ -1,81 +0,0 @@ -id,doi,title,year,abstract,authors_raw,authors_id,authors_affiliations,keywords_raw,keywords_id,references_doi,source,language,is_seed -W2119211517,10.1353/sof.2007.0054,Ecological Unequal Exchange: International Trade and Uneven Utilization of Environmental Space in the World System,2007,"We evaluate the argument that international trade influences disproportionate cross-national utilization of global renewable natural resources. Such uneven dynamics are relevant to the consideration of inequitable appropriation of environmental space in particular and processes of ecological unequal exchange more generally. Using OLS regression with slope dummy interaction terms, we analyze the effects of trade upon environmental consumption, as measured by per capita ecological footprint demand for 2002, delineated by country income level. Based on data for 137 countries, analyses reveal low- and lower middle-income countries characterized by a greater proportion of exports to the core industrialized countries exhibit lower environmental consumption. The results contradict neoclassical economic thought. We find trade shapes uneven utilization of global environmental space by constraining consumption in low and lower middle-income countries.",James Rice,A5048848430,New Mexico State University (US),Ecological footprint; Economics; Consumption (sociology); Per capita; Per capita income; Natural resource; Space (punctuation); Natural resource economics; Sustainability; Ecology; Population,ecological-footprint; economics; consumption; per-capita; per-capita-income; natural-resource; space; natural-resource-economics; sustainability; ecology; population,https://openalex.org/W29128684; https://openalex.org/W98053437; https://openalex.org/W100254650; https://openalex.org/W121690023; https://openalex.org/W204270373; https://openalex.org/W564808682; https://openalex.org/W571185114; https://openalex.org/W579563895; https://openalex.org/W623848121; https://openalex.org/W651598703; https://openalex.org/W1526407077; https://openalex.org/W1530782558; https://openalex.org/W1539308977; https://openalex.org/W1541584794; https://openalex.org/W1551322995; https://openalex.org/W1981094349; https://openalex.org/W1982053377; https://openalex.org/W1990164247; https://openalex.org/W1996199418; https://openalex.org/W2013402297; https://openalex.org/W2020935901; https://openalex.org/W2030978014; https://openalex.org/W2033186995; https://openalex.org/W2036713768; https://openalex.org/W2041137602; https://openalex.org/W2047856663; https://openalex.org/W2051025186; https://openalex.org/W2056286657; https://openalex.org/W2056926496; https://openalex.org/W2085515592; https://openalex.org/W2100618934; https://openalex.org/W2101325537; https://openalex.org/W2105586900; https://openalex.org/W2116018954; https://openalex.org/W2122831705; https://openalex.org/W2126212614; https://openalex.org/W2133022495; https://openalex.org/W2141833713; https://openalex.org/W2143917121; https://openalex.org/W2163307695; https://openalex.org/W2170219305; https://openalex.org/W2174103482; https://openalex.org/W2181493251; https://openalex.org/W2187729256; https://openalex.org/W2274106087; https://openalex.org/W2279795386; https://openalex.org/W2280747592; https://openalex.org/W2297931742; https://openalex.org/W2528256758; https://openalex.org/W2797816625; https://openalex.org/W2806988935; https://openalex.org/W2918033867; https://openalex.org/W3010621220; https://openalex.org/W3146010958; https://openalex.org/W3159280209; https://openalex.org/W3211630684,Social Forces,en,False -W2142043891,10.1177/0020715207072159,"Ecological Unequal Exchange: Consumption, Equity, and Unsustainable Structural Relationships within the Global Economy",2007,"We discuss and elaborate upon the theory of cross-national ecological unequal exchange. Drawing upon world-systems theoretical propositions, ecological unequal exchange refers to the increasingly disproportionate utilization of ecological systems and externalization of negative environmental costs by core industrialized countries and, consequentially, declining utilization opportunities and imposition of exogenous environmental burdens within the periphery. We provide a descriptive overview of theoretical and empirical efforts to date examining this issue. Ecological unequal exchange provides a framework for conceptualizing how the socioeconomic metabolism or material throughput of core countries may negatively impact more marginalized countries in the global economy. It focuses attention upon the global uneven fl ow of energy, natural resources, and waste products of industrial activity. Further, the recognition of the distributional processes of ecological unequal exchange is relevant to considerations of both the socioeconomic and environmental imperatives underlying the pursuit of sustainable development, as it contributes to underdevelopment within the periphery of the world-system. We conclude by highlighting the interconnections between uneven natural resource fl ows, global environmental change, and the challenge of broad-based sustainable development.",James Rice,A5048848430,New Mexico State University (US),Ecological economics; Equity (law); Underdevelopment; Sustainable development; Natural resource; Sustainability; Economics; Environmental degradation; Consumption (sociology); Economic system; Ecology; Development economics; Natural resource economics; Economic growth; Political science; Sociology; Biology; Social science,ecological-economics; equity; underdevelopment; sustainable-development; natural-resource; sustainability; economics; environmental-degradation; consumption; economic-system; ecology; development-economics; natural-resource-economics; economic-growth; political-science; sociology; biology; social-science,https://openalex.org/W29128684; https://openalex.org/W174463555; https://openalex.org/W246163104; https://openalex.org/W595015540; https://openalex.org/W651598703; https://openalex.org/W1518714090; https://openalex.org/W1530782558; https://openalex.org/W1536788759; https://openalex.org/W1539308977; https://openalex.org/W1541584794; https://openalex.org/W1551322995; https://openalex.org/W1558000859; https://openalex.org/W1596919638; https://openalex.org/W1687549561; https://openalex.org/W1984695483; https://openalex.org/W1990164247; https://openalex.org/W1992984263; https://openalex.org/W1995485900; https://openalex.org/W1996199418; https://openalex.org/W2013402297; https://openalex.org/W2014480644; https://openalex.org/W2020935901; https://openalex.org/W2023864710; https://openalex.org/W2026865785; https://openalex.org/W2030978014; https://openalex.org/W2036713768; https://openalex.org/W2040057718; https://openalex.org/W2041137602; https://openalex.org/W2042226937; https://openalex.org/W2051025186; https://openalex.org/W2051998369; https://openalex.org/W2056926496; https://openalex.org/W2066932297; https://openalex.org/W2074809583; https://openalex.org/W2075693476; https://openalex.org/W2100618934; https://openalex.org/W2101108903; https://openalex.org/W2113337769; https://openalex.org/W2116018954; https://openalex.org/W2122512506; https://openalex.org/W2122831705; https://openalex.org/W2126212614; https://openalex.org/W2127329485; https://openalex.org/W2141833713; https://openalex.org/W2143917121; https://openalex.org/W2160934709; https://openalex.org/W2163307695; https://openalex.org/W2166671387; https://openalex.org/W2169776575; https://openalex.org/W2174103482; https://openalex.org/W2174143613; https://openalex.org/W2181493251; https://openalex.org/W2182089091; https://openalex.org/W2187729256; https://openalex.org/W2274106087; https://openalex.org/W2279795386; https://openalex.org/W2288595092; https://openalex.org/W2337659769; https://openalex.org/W2528256758; https://openalex.org/W2617515511; https://openalex.org/W2918033867; https://openalex.org/W3159280209; https://openalex.org/W4213234829; https://openalex.org/W4220804448; https://openalex.org/W4241852105; https://openalex.org/W4255286740; https://openalex.org/W4285719527,International Journal of Comparative Sociology,en,False -W1973954730,10.1177/0020715209105147,"Ecologically Unequal Exchange, Ecological Debt, and Climate Justice",2009,"Building on structuralist perspectives of the world economy, a small but growing group of researchers have forged a new literature on `ecologically unequal exchange' and documented that energy and materials disproportionately flow from the Global South to the Global North. These findings have begun to influence efforts to negotiate a `post-Kyoto' global climate regime. Since the extraction of resources and energy is one of the most damaging stages of the chain of commodity production, a logical next step is the mounting cry from developing countries that they are owed an `ecological debt' by the North. The G-77 and China have seized on these ideas and a movement for `climate justice' is now gaining strength in and exerting influence in international negotiations, including the UNFCCC meetings in Delhi, Bali, and Poznań. This article reviews the history of these related three ideas and examines their potential to reshape the discussion of `burden sharing' in the post-Kyoto world where development is constrained by climate change.",J. Timmons Roberts; Bradley C. Parks,A5082988195; A5047978847,William & Mary (US); Williams (United States) (US); Millennium Challenge Corporation (US),Negotiation; Kyoto Protocol; China; Economic Justice; Commodity; Climate change; Debt; Political science; Global warming; Economy; Development economics; International trade; Economics; Natural resource economics; Geography; Ecology; Market economy; Law,negotiation; kyoto-protocol; china; economic-justice; commodity; climate-change; debt; political-science; global-warming; economy; development-economics; international-trade; economics; natural-resource-economics; geography; ecology; market-economy; law,https://openalex.org/W18714912; https://openalex.org/W53023682; https://openalex.org/W181224196; https://openalex.org/W228880448; https://openalex.org/W363696262; https://openalex.org/W573167388; https://openalex.org/W613588134; https://openalex.org/W614211536; https://openalex.org/W651598703; https://openalex.org/W826469042; https://openalex.org/W1529106462; https://openalex.org/W1552736777; https://openalex.org/W1563281257; https://openalex.org/W1564726429; https://openalex.org/W1593994209; https://openalex.org/W1823886455; https://openalex.org/W1870280941; https://openalex.org/W1970732996; https://openalex.org/W1983474380; https://openalex.org/W1998804088; https://openalex.org/W2005340918; https://openalex.org/W2008178580; https://openalex.org/W2013402297; https://openalex.org/W2014105429; https://openalex.org/W2017032566; https://openalex.org/W2020935901; https://openalex.org/W2026255285; https://openalex.org/W2027255868; https://openalex.org/W2030978014; https://openalex.org/W2036713768; https://openalex.org/W2037466272; https://openalex.org/W2038981142; https://openalex.org/W2041202945; https://openalex.org/W2056926496; https://openalex.org/W2068157259; https://openalex.org/W2077858203; https://openalex.org/W2083170299; https://openalex.org/W2084528250; https://openalex.org/W2089327955; https://openalex.org/W2095092650; https://openalex.org/W2101108903; https://openalex.org/W2110438916; https://openalex.org/W2119211517; https://openalex.org/W2126212614; https://openalex.org/W2142043891; https://openalex.org/W2164304100; https://openalex.org/W2169776575; https://openalex.org/W2174103482; https://openalex.org/W2182089091; https://openalex.org/W2215129138; https://openalex.org/W2285306684; https://openalex.org/W2321434398; https://openalex.org/W2341034567; https://openalex.org/W2499185134; https://openalex.org/W2501585505; https://openalex.org/W2528256758; https://openalex.org/W2586432828; https://openalex.org/W3121380395; https://openalex.org/W3123592998; https://openalex.org/W3125260465; https://openalex.org/W3159280209; https://openalex.org/W3173126365; https://openalex.org/W3213090436; https://openalex.org/W4236004568; https://openalex.org/W4237128792; https://openalex.org/W4247796865; https://openalex.org/W4250217784; https://openalex.org/W4299448508; https://openalex.org/W4401185539; https://openalex.org/W6600476237,International Journal of Comparative Sociology,en,False -W1862702728,10.2458/v23i1.20220,Ecologically unequal exchange and ecological debt,2016,"This article introduces a Special Section on Ecologically Unequal Exchange (EUE), an underlying source of most of the environmental distribution conflicts in our time. The nine articles discuss theories, methodologies, and empirical case studies pertaining to ecologically unequal exchange, and address its relationship to ecological debt. This is the introductory article in Alf Hornborg and Joan Martinez-Alier (eds.) 2016. ""Ecologically unequal exchange and ecological debt"", Special Section of the Journal of Political Ecology 23: 328-491.",Alf Hornborg; Joan Martínez Alier,A5082311142; A5004042357,Lund University (SE); Universitat Autònoma de Barcelona (ES),Ecology; Debt; Section (typography); Political ecology; Politics; Distribution (mathematics); Geography; Economics; Political science; Business; Biology; Law; Macroeconomics; Mathematics,ecology; debt; section; political-ecology; politics; distribution; geography; economics; political-science; business; biology; law; macroeconomics; mathematics,https://openalex.org/W779134457; https://openalex.org/W1505091764; https://openalex.org/W1509006868; https://openalex.org/W1584129281; https://openalex.org/W1591166682; https://openalex.org/W1738944162; https://openalex.org/W1956760944; https://openalex.org/W1967879531; https://openalex.org/W2048051304; https://openalex.org/W2056926496; https://openalex.org/W2076881948; https://openalex.org/W2146638929; https://openalex.org/W2562324168; https://openalex.org/W2592356138; https://openalex.org/W2594589186; https://openalex.org/W2601697486; https://openalex.org/W2617245318; https://openalex.org/W2618067250; https://openalex.org/W2618110297; https://openalex.org/W2620413123; https://openalex.org/W2620457709; https://openalex.org/W2760758743; https://openalex.org/W2772802389; https://openalex.org/W3122052499; https://openalex.org/W3159280209; https://openalex.org/W6630499190; https://openalex.org/W6735424081; https://openalex.org/W6850696550,Journal of Political Ecology,en,False -W1967360446,10.1016/j.ecolecon.2012.08.019,Classifying and valuing ecosystem services for urban planning,2012,,Erik Gómez‐Baggethun; David N. Barton,A5047258935; A5076044834,Universidad Autónoma de Madrid (ES); Universitat Autònoma de Barcelona (ES); Norwegian Institute for Nature Research (NO),Ecosystem services; Urban ecosystem; Ecosystem valuation; Valuation (finance); Environmental resource management; Ecosystem health; Natural capital; Environmental planning; Business; Urban planning; Urbanization; Ecosystem; Geography; Ecology; Economic growth; Economics,ecosystem-services; urban-ecosystem; ecosystem-valuation; valuation; environmental-resource-management; ecosystem-health; natural-capital; environmental-planning; business; urban-planning; urbanization; ecosystem; geography; ecology; economic-growth; economics,https://openalex.org/W23687525; https://openalex.org/W32759665; https://openalex.org/W49771169; https://openalex.org/W93598551; https://openalex.org/W115394847; https://openalex.org/W118586622; https://openalex.org/W121311783; https://openalex.org/W170055257; https://openalex.org/W223539122; https://openalex.org/W353006067; https://openalex.org/W625547448; https://openalex.org/W884602397; https://openalex.org/W1480313761; https://openalex.org/W1481664197; https://openalex.org/W1482252354; https://openalex.org/W1483294716; https://openalex.org/W1496684753; https://openalex.org/W1506420918; https://openalex.org/W1515352398; https://openalex.org/W1540810178; https://openalex.org/W1543060629; https://openalex.org/W1550973209; https://openalex.org/W1557892264; https://openalex.org/W1568997834; https://openalex.org/W1578130959; https://openalex.org/W1594976441; https://openalex.org/W1597336755; https://openalex.org/W1744548356; https://openalex.org/W1763861884; https://openalex.org/W1810922710; https://openalex.org/W1829464153; https://openalex.org/W1912501444; https://openalex.org/W1952596777; https://openalex.org/W1965948158; https://openalex.org/W1966742813; https://openalex.org/W1967904512; https://openalex.org/W1971306837; https://openalex.org/W1978430273; https://openalex.org/W1979586283; https://openalex.org/W1981426302; https://openalex.org/W1983070409; https://openalex.org/W1989733534; https://openalex.org/W1990661456; https://openalex.org/W1992564957; https://openalex.org/W1995622160; https://openalex.org/W1995810372; https://openalex.org/W1997976641; https://openalex.org/W1999392262; https://openalex.org/W2000114865; https://openalex.org/W2003605835; https://openalex.org/W2013272331; https://openalex.org/W2013942505; https://openalex.org/W2014151831; https://openalex.org/W2017832456; https://openalex.org/W2020156654; https://openalex.org/W2020199061; https://openalex.org/W2025361974; https://openalex.org/W2026865252; https://openalex.org/W2026866485; https://openalex.org/W2029393861; https://openalex.org/W2031382955; https://openalex.org/W2037025736; https://openalex.org/W2038540510; https://openalex.org/W2039362164; https://openalex.org/W2039767034; https://openalex.org/W2042359144; https://openalex.org/W2042505652; https://openalex.org/W2045791326; https://openalex.org/W2045952749; https://openalex.org/W2049377387; https://openalex.org/W2053571334; https://openalex.org/W2055036922; https://openalex.org/W2055891847; https://openalex.org/W2055971368; https://openalex.org/W2056196195; https://openalex.org/W2056636584; https://openalex.org/W2060788579; https://openalex.org/W2062505214; https://openalex.org/W2062896939; https://openalex.org/W2064215173; https://openalex.org/W2073209479; https://openalex.org/W2076086867; https://openalex.org/W2079194441; https://openalex.org/W2082317060; https://openalex.org/W2083521896; https://openalex.org/W2083549445; https://openalex.org/W2083551253; https://openalex.org/W2085741390; https://openalex.org/W2087087771; https://openalex.org/W2093054800; https://openalex.org/W2095822147; https://openalex.org/W2097908993; https://openalex.org/W2097935015; https://openalex.org/W2100306352; https://openalex.org/W2103948957; https://openalex.org/W2105273997; https://openalex.org/W2105785737; https://openalex.org/W2109192612; https://openalex.org/W2111915155; https://openalex.org/W2112061527; https://openalex.org/W2113659878; https://openalex.org/W2113908401; https://openalex.org/W2116298059; https://openalex.org/W2116335571; https://openalex.org/W2119119035; https://openalex.org/W2121055000; https://openalex.org/W2121623889; https://openalex.org/W2125084023; https://openalex.org/W2125263324; https://openalex.org/W2127476821; https://openalex.org/W2129974232; https://openalex.org/W2131236975; https://openalex.org/W2131487209; https://openalex.org/W2134172371; https://openalex.org/W2135766384; https://openalex.org/W2139355960; https://openalex.org/W2140967696; https://openalex.org/W2145357497; https://openalex.org/W2146205007; https://openalex.org/W2147106775; https://openalex.org/W2151215040; https://openalex.org/W2151303390; https://openalex.org/W2152470386; https://openalex.org/W2153779825; https://openalex.org/W2155048660; https://openalex.org/W2157015782; https://openalex.org/W2162927621; https://openalex.org/W2165049059; https://openalex.org/W2176202906; https://openalex.org/W2180198116; https://openalex.org/W2265414043; https://openalex.org/W2318160089; https://openalex.org/W2336638668; https://openalex.org/W2372261786; https://openalex.org/W2401731262; https://openalex.org/W2506396755; https://openalex.org/W2589919727; https://openalex.org/W2781684356; https://openalex.org/W2911125293; https://openalex.org/W2918256237; https://openalex.org/W2955563833; https://openalex.org/W2979050244; https://openalex.org/W2999405483; https://openalex.org/W3087415472; https://openalex.org/W3121703175; https://openalex.org/W3204017152; https://openalex.org/W4285719527; https://openalex.org/W6600930186; https://openalex.org/W6601964155; https://openalex.org/W6603685060; https://openalex.org/W6604809202; https://openalex.org/W6630770533; https://openalex.org/W6635343553; https://openalex.org/W6676985424; https://openalex.org/W6677958204; https://openalex.org/W6681996459; https://openalex.org/W6747770711; https://openalex.org/W6764925827; https://openalex.org/W6772569954,Ecological Economics,en,False -W2048051304,10.1016/j.gloenvcha.2014.10.014,Reversing the arrow of arrears: The concept of “ecological debt” and its value for environmental justice,2014,,Rikard Warlenius; Gregory Pierce; Vasna Ramasar,A5020507738; A5053292068; A5024246120,Lund University (SE); Lund University (SE); Lund University (SE),Debt; Ecological economics; Environmental justice; Value (mathematics); Environmental law; Ecology; Sociology; Political science; Economics; Law; Sustainability; Finance; Biology,debt; ecological-economics; environmental-justice; value; environmental-law; ecology; sociology; political-science; economics; law; sustainability; finance; biology,https://openalex.org/W147937154; https://openalex.org/W222966551; https://openalex.org/W401135514; https://openalex.org/W568129555; https://openalex.org/W591561411; https://openalex.org/W1503706120; https://openalex.org/W1557989049; https://openalex.org/W1566890474; https://openalex.org/W1591166682; https://openalex.org/W1595403411; https://openalex.org/W1907583418; https://openalex.org/W1963798495; https://openalex.org/W1973176252; https://openalex.org/W1996628034; https://openalex.org/W2002033694; https://openalex.org/W2012254774; https://openalex.org/W2013402297; https://openalex.org/W2021001691; https://openalex.org/W2030602370; https://openalex.org/W2056630963; https://openalex.org/W2056926496; https://openalex.org/W2085683054; https://openalex.org/W2089327955; https://openalex.org/W2091709473; https://openalex.org/W2128207432; https://openalex.org/W2137540105; https://openalex.org/W2138587975; https://openalex.org/W2148732650; https://openalex.org/W2159167826; https://openalex.org/W2164334321; https://openalex.org/W2319568853; https://openalex.org/W2578584143; https://openalex.org/W2592356138; https://openalex.org/W2611750131; https://openalex.org/W2758381682; https://openalex.org/W2772747987; https://openalex.org/W3048682234; https://openalex.org/W3121653486; https://openalex.org/W3159280209; https://openalex.org/W3164354311; https://openalex.org/W3196992440; https://openalex.org/W4391865359; https://openalex.org/W6734053437; https://openalex.org/W6795926756,Global Environmental Change,en,False -W644940498,,Ecological Debt: The Health of the Planet and the Wealth of Nations,2005,"1. A short walk to Venus 2. The chemist's warning - A short history of global warming 3. The Heaven bursters - Tuvalu and the fate of nations 4. The great reversal of human progress 5. Ecological debt 6. The carbon debt 7. Rationalising self-destruction (or why people are more stupid than frogs) 8. The car park at the end of the world 9. Pay back time - the law, climate change and ecological debt 10. Data for the doubtful - the lessons of war economies 11. The new adjustment 12. Minerva's Owl Notes Index",Andrew Simms,A5112290444,,Debt; Global warming; Venus; Geography; Planet; Natural resource economics; Climate change; Ecology; Economy; Development economics; Political science; Economics; Astrobiology; Finance; Biology,debt; global-warming; venus; geography; planet; natural-resource-economics; climate-change; ecology; economy; development-economics; political-science; economics; astrobiology; finance; biology,,Medical Entomology and Zoology,en,False -W1986875667,10.1007/s10668-009-9219-y,The concept of ecological debt: some steps towards an enriched sustainability paradigm,2009,,Gert Goeminne; Erik Paredis,A5007488495; A5041144613,Vrije Universiteit Brussel (BE); Ghent University Hospital (BE); Ghent University Hospital (BE),Sustainability; Debt; Environmental resource management; Conceptual framework; Ecology; Management science; Sociology; Computer science; Business; Economics; Social science; Biology; Finance,sustainability; debt; environmental-resource-management; conceptual-framework; ecology; management-science; sociology; computer-science; business; economics; social-science; biology; finance,https://openalex.org/W49479346; https://openalex.org/W401135514; https://openalex.org/W610363635; https://openalex.org/W644940498; https://openalex.org/W810233521; https://openalex.org/W1588713494; https://openalex.org/W1967820238; https://openalex.org/W1973176252; https://openalex.org/W1983188187; https://openalex.org/W2012254774; https://openalex.org/W2015442086; https://openalex.org/W2019674121; https://openalex.org/W2036713768; https://openalex.org/W2061355442; https://openalex.org/W2071810998; https://openalex.org/W2085683054; https://openalex.org/W2089327955; https://openalex.org/W2108291685; https://openalex.org/W2133644181; https://openalex.org/W2319568853; https://openalex.org/W2489573637; https://openalex.org/W2554800123; https://openalex.org/W2758381682; https://openalex.org/W2810203815; https://openalex.org/W2913390697; https://openalex.org/W2916743836; https://openalex.org/W2951306510; https://openalex.org/W3027532949; https://openalex.org/W3037339115; https://openalex.org/W3048682234; https://openalex.org/W3159280209; https://openalex.org/W4241852105; https://openalex.org/W4243660887; https://openalex.org/W4252474431; https://openalex.org/W4300304138; https://openalex.org/W6676229473; https://openalex.org/W6730305667; https://openalex.org/W6744584497; https://openalex.org/W6752696883; https://openalex.org/W6832168704,Environment Development and Sustainability,en,False -W1538980473,,Ecological Unequal Exchange,2001,"In these years many developing countries are engaged in establishing environmental regulation, but unfortunately, their environmental problems are rooted in fundamental issues that cannot easily be corrected by the instruments normally included in environmental regulation. This paper argues that it is necessary to change the power relations, so that developing countries get a chance to rectify their environmental problems. These issues are elucidated by applying the approach of ecological economics. First, the basic theoretical problem regarding economic value is outlined, and second, it is argued that unequal exchange in ecological terms might be at the root of environmental problems in developing countries. The concept of ecological footprints is used as an illustration. Finally, it is argued that the different movements in the South offer some hope for changes.",Inge Røpke,A5016814382,Sustainability Institute (ZA),Developing country; Ecological economics; Value (mathematics); Ecology; Ecological footprint; Root (linguistics); Economics; Sustainable development; Sustainability; Economic growth; Computer science; Biology,developing-country; ecological-economics; value; ecology; ecological-footprint; root; economics; sustainable-development; sustainability; economic-growth; computer-science; biology,,,en,False -W2951306510,10.4324/9781849771771-10,"Environmental Space, Equity and the Ecological Debt",2012,,Duncan McLaren,A5063262748,,Equity (law); Debt; Space (punctuation); Economics; Ecology; Geography; Business; Political science; Finance; Computer science; Biology,equity; debt; space; economics; ecology; geography; business; political-science; finance; computer-science; biology,,,en,False -W2137540105,10.1177/0896920508099193,North—South Relations and the Ecological Debt: Asserting a Counter-Hegemonic Discourse,2009,"We examine position papers by non-governmental organizations (NGOs) arguing for recognition of the ecological debt. We utilize Toulmin's (2003[1958]) model of argument analysis to outline the major claims advanced. The results illustrate the argument is comprised of four interrelated claims: 1) Northern historical development and present disproportionate production and consumption are founded on a socio-ecological subsidy or the underpayment and, at times, explicit looting of the natural resource assets of Southern countries; 2) the Southern external financial debt should be cancelled because it promotes the socio-ecological subsidy; 3) levels of Northern production and consumption are unsustainable over the long term because they are predicated on the North—South socio-ecological subsidy; 4) equity for present and rational obligations to future generations demands Northern countries begin paying back the accrued socio-ecological subsidy, an obligation defined as the ecological debt.",James Rice,A5048848430,New Mexico State University (US),Subsidy; Debt; Consumption (sociology); Economics; Argument (complex analysis); Equity (law); Hegemony; Ecological economics; Ecology; Economy; Sociology; Political science; Market economy; Sustainability; Law; Finance; Social science; Politics,subsidy; debt; consumption; economics; argument; equity; hegemony; ecological-economics; ecology; economy; sociology; political-science; market-economy; sustainability; law; finance; social-science; politics,https://openalex.org/W156951739; https://openalex.org/W191687221; https://openalex.org/W254725204; https://openalex.org/W651598703; https://openalex.org/W1966138599; https://openalex.org/W1973176252; https://openalex.org/W1980186344; https://openalex.org/W1997210479; https://openalex.org/W2012254774; https://openalex.org/W2027221797; https://openalex.org/W2030978014; https://openalex.org/W2036713768; https://openalex.org/W2045488269; https://openalex.org/W2056926496; https://openalex.org/W2059612188; https://openalex.org/W2082879918; https://openalex.org/W2085683054; https://openalex.org/W2091709473; https://openalex.org/W2093703872; https://openalex.org/W2101108903; https://openalex.org/W2104859737; https://openalex.org/W2119211517; https://openalex.org/W2123098762; https://openalex.org/W2126212614; https://openalex.org/W2142043891; https://openalex.org/W2166241449; https://openalex.org/W2169776575; https://openalex.org/W2188254548; https://openalex.org/W2279795386; https://openalex.org/W3048682234; https://openalex.org/W3159280209; https://openalex.org/W4232387830; https://openalex.org/W4233203094; https://openalex.org/W4241852105; https://openalex.org/W4254245014,Critical Sociology,en,False -W2319568853,,The Concept of Ecological Debt: Its Meaning and Applicability in International Policy,2009,,Erik Paredis; Gert Goeminne; Wouter Vanhove; Frank Maes; Jesse Lambrecht,A5041144613; A5007488495; A5024639661; A5080130364; A5048787297,,Meaning (existential); Ecology; Debt; Epistemology; Economics; Environmental ethics; Positive economics; Political science; Philosophy; Macroeconomics; Biology,meaning; ecology; debt; epistemology; economics; environmental-ethics; positive-economics; political-science; philosophy; macroeconomics; biology,https://openalex.org/W1551322995; https://openalex.org/W1994971437; https://openalex.org/W3007471481,Ghent University Academic Bibliography (Ghent University),en,False -W2342655129,10.1080/03066150.2016.1141198,Is there a global environmental justice movement?,2016,"One of the causes of the increasing number of ecological distribution conflicts around the world is the changing metabolism of the economy in terms of growing flows of energy and materials. There are conflicts on resource extraction, transport and waste disposal. Therefore, there are many local complaints, as shown in the Atlas of Environmental Justice (EJatlas) and other inventories. And not only complaints; there are also many successful examples of stopping projects and developing alternatives, testifying to the existence of a rural and urban global movement for environmental justice. Moreover, since the 1980s and 1990s, this movement has developed a set of concepts and campaign slogans to describe and intervene in such conflicts. They include environmental racism, popular epidemiology, the environmentalism of the poor and the indigenous, biopiracy, tree plantations are not forests, the ecological debt, climate justice, food sovereignty, land grabbing and water justice, among other concepts. These terms were born from socio-environmental activism, but sometimes they have also been taken up by academic political ecologists and ecological economists who, for their part, have contributed other concepts to the global environmental justice movement, such as 'ecologically unequal exchange' or the 'ecological footprint'.",Joan Martínez Alier; Leah Temper; Daniela Del Bene; Arnim Scheidel,A5004042357; A5007427123; A5050277246; A5035350172,,Environmental justice; Movement (music); Economic Justice; Political science; Global justice; Environmental ethics; Sociology; Political economy; Law; Aesthetics; Philosophy,environmental-justice; movement; economic-justice; political-science; global-justice; environmental-ethics; sociology; political-economy; law; aesthetics; philosophy,https://openalex.org/W24676063; https://openalex.org/W39838849; https://openalex.org/W106908474; https://openalex.org/W126445477; https://openalex.org/W160500913; https://openalex.org/W198530926; https://openalex.org/W562193577; https://openalex.org/W571924660; https://openalex.org/W573704088; https://openalex.org/W573931508; https://openalex.org/W608530620; https://openalex.org/W614736872; https://openalex.org/W616805653; https://openalex.org/W622111395; https://openalex.org/W640395149; https://openalex.org/W644940498; https://openalex.org/W651096281; https://openalex.org/W657620444; https://openalex.org/W836905562; https://openalex.org/W1408991106; https://openalex.org/W1479808467; https://openalex.org/W1482149660; https://openalex.org/W1495628681; https://openalex.org/W1506954881; https://openalex.org/W1531921269; https://openalex.org/W1536916917; https://openalex.org/W1539308977; https://openalex.org/W1597172957; https://openalex.org/W1597421676; https://openalex.org/W1601641141; https://openalex.org/W1602775671; https://openalex.org/W1607813434; https://openalex.org/W1659143523; https://openalex.org/W1746968135; https://openalex.org/W1750986932; https://openalex.org/W1803673662; https://openalex.org/W1875518958; https://openalex.org/W1902314391; https://openalex.org/W1942258133; https://openalex.org/W1961753951; https://openalex.org/W1963684733; https://openalex.org/W1970983746; https://openalex.org/W1973954730; https://openalex.org/W1974564128; https://openalex.org/W1975716168; https://openalex.org/W1977065782; https://openalex.org/W1980314759; https://openalex.org/W1981954908; https://openalex.org/W1987157513; https://openalex.org/W1998173620; https://openalex.org/W2006467409; https://openalex.org/W2012830928; https://openalex.org/W2013402297; https://openalex.org/W2014182960; https://openalex.org/W2016611404; https://openalex.org/W2026734915; https://openalex.org/W2028502628; https://openalex.org/W2030626342; https://openalex.org/W2034283967; https://openalex.org/W2035353157; https://openalex.org/W2040538614; https://openalex.org/W2041321854; https://openalex.org/W2041724919; https://openalex.org/W2045609492; https://openalex.org/W2048051304; https://openalex.org/W2056619110; https://openalex.org/W2056654591; https://openalex.org/W2056926496; https://openalex.org/W2057931959; https://openalex.org/W2060306247; https://openalex.org/W2061668231; https://openalex.org/W2062199894; https://openalex.org/W2062212647; https://openalex.org/W2063877192; https://openalex.org/W2071735537; https://openalex.org/W2073478361; https://openalex.org/W2074580217; https://openalex.org/W2076352747; https://openalex.org/W2076362506; https://openalex.org/W2076926005; https://openalex.org/W2077618140; https://openalex.org/W2079643502; https://openalex.org/W2082793946; https://openalex.org/W2085253317; https://openalex.org/W2086192290; https://openalex.org/W2086988135; https://openalex.org/W2087385946; https://openalex.org/W2088890647; https://openalex.org/W2089327955; https://openalex.org/W2091709473; https://openalex.org/W2113908401; https://openalex.org/W2122325078; https://openalex.org/W2128697261; https://openalex.org/W2131236975; https://openalex.org/W2133412156; https://openalex.org/W2137540105; https://openalex.org/W2143132840; https://openalex.org/W2148732650; https://openalex.org/W2150141679; https://openalex.org/W2155200498; https://openalex.org/W2159167826; https://openalex.org/W2164334321; https://openalex.org/W2167555648; https://openalex.org/W2169091890; https://openalex.org/W2175723801; https://openalex.org/W2180116906; https://openalex.org/W2300912211; https://openalex.org/W2319568853; https://openalex.org/W2482534035; https://openalex.org/W2488167377; https://openalex.org/W2499185134; https://openalex.org/W2509117576; https://openalex.org/W2565699167; https://openalex.org/W2578584143; https://openalex.org/W2588205325; https://openalex.org/W2592356138; https://openalex.org/W2592836093; https://openalex.org/W2598540519; https://openalex.org/W2603115376; https://openalex.org/W2606168528; https://openalex.org/W2621477277; https://openalex.org/W2741785244; https://openalex.org/W2760758743; https://openalex.org/W2772026272; https://openalex.org/W2772802389; https://openalex.org/W3058573125; https://openalex.org/W3123315369; https://openalex.org/W3152418774; https://openalex.org/W3159280209; https://openalex.org/W3175182508; https://openalex.org/W4205266477; https://openalex.org/W4206319759; https://openalex.org/W4206610535; https://openalex.org/W4211077846; https://openalex.org/W4229821295; https://openalex.org/W4230338987; https://openalex.org/W4230519330; https://openalex.org/W4230585566; https://openalex.org/W4233272295; https://openalex.org/W4233654598; https://openalex.org/W4233824991; https://openalex.org/W4236697295; https://openalex.org/W4239086245; https://openalex.org/W4239421629; https://openalex.org/W4239528198; https://openalex.org/W4239894112; https://openalex.org/W4240002859; https://openalex.org/W4240807311; https://openalex.org/W4241852105; https://openalex.org/W4242519425; https://openalex.org/W4243589412; https://openalex.org/W4299341209; https://openalex.org/W4300513965; https://openalex.org/W4301267015; https://openalex.org/W4301408177; https://openalex.org/W4380764505,The Journal of Peasant Studies,en,False -W4400018219,10.2307/jj.16275969.4,ECOLOGICAL DEBT:,2009,,Ariel Salleh,A5050075228,,Ecology; Geography; Economics; Environmental science; Biology,ecology; geography; economics; environmental-science; biology,,Pluto Press eBooks,en,False -W2108953279,10.1177/1086026610385903,"Natural Resource Extraction, Armed Violence, and Environmental Degradation",2010,"The goal of this article is to demonstrate that environmental sociologists cannot fully explain the relationship between humans and the natural world without theorizing a link between natural resource extraction, armed violence, and environmental degradation. The authors begin by arguing that armed violence is one of several overlapping mechanisms that provide powerful actors with the means to (a) prevail over others in conflicts over natural resources and (b) ensure that natural resources critical to industrial production and state power continue to be extracted and sold in sufficient quantities to promote capital accumulation, state power, and ecological unequal exchange. The authors then identify 10 minerals that are critical to the functioning of the U.S. economy and/or military and demonstrate that the extraction of these minerals often involves the use of armed violence. They further demonstrate that armed violence is associated with the activities of the world's three largest mining companies, with African mines that receive World Bank funding, and with petroleum and rainforest timber extraction. The authors conclude that the natural resource base on which industrial societies stand is constructed in large part through the use and threatened use of armed violence. As a result, armed violence plays a critical role in fostering environmental degradation and ecological unequal exchange.",Liam Downey; Eric Bonds; Katherine Clark,A5054738225; A5039102853; A5042577538,University of Colorado Boulder (US); University of Colorado Boulder (US); University of Colorado Boulder (US),Natural resource; Environmental degradation; Natural (archaeology); Resource (disambiguation); Environmental planning; Environmental resource management; Environmental science; Computer science; Political science; Geography; Ecology,natural-resource; environmental-degradation; natural; resource; environmental-planning; environmental-resource-management; environmental-science; computer-science; political-science; geography; ecology,https://openalex.org/W117956444; https://openalex.org/W389691207; https://openalex.org/W397816860; https://openalex.org/W416238589; https://openalex.org/W417693152; https://openalex.org/W590315936; https://openalex.org/W619831140; https://openalex.org/W624601757; https://openalex.org/W638714931; https://openalex.org/W1482286954; https://openalex.org/W1508764670; https://openalex.org/W1509006868; https://openalex.org/W1526407077; https://openalex.org/W1558825610; https://openalex.org/W1590831936; https://openalex.org/W1978972867; https://openalex.org/W1982690502; https://openalex.org/W1990164247; https://openalex.org/W1990960672; https://openalex.org/W2013694221; https://openalex.org/W2033082879; https://openalex.org/W2040836015; https://openalex.org/W2048293151; https://openalex.org/W2070152105; https://openalex.org/W2070344959; https://openalex.org/W2075340793; https://openalex.org/W2081265676; https://openalex.org/W2089188580; https://openalex.org/W2093230995; https://openalex.org/W2094745203; https://openalex.org/W2096565435; https://openalex.org/W2108057681; https://openalex.org/W2115328246; https://openalex.org/W2149022830; https://openalex.org/W2149047800; https://openalex.org/W2327298447; https://openalex.org/W2332541332; https://openalex.org/W2333578156; https://openalex.org/W2801582997; https://openalex.org/W3049491599; https://openalex.org/W4213156901; https://openalex.org/W4232492387; https://openalex.org/W4235844245; https://openalex.org/W4237476521; https://openalex.org/W4247020758; https://openalex.org/W4300360800; https://openalex.org/W4301175738; https://openalex.org/W4319588009; https://openalex.org/W4386178082; https://openalex.org/W4394717023,Organization & Environment,en,False -W2104859737,10.1080/104557502101245404,Ecological Debt and Property Rights on Carbon Sinks and Reservoirs,2002,"(2002). Ecological Debt and Property Rights on Carbon Sinks and Reservoirs. Capitalism Nature Socialism: Vol. 13, No. 1, pp. 115-119.",Joan Martínez Alier,A5004042357,,Socialism; Capitalism; Property rights; Debt; Property (philosophy); Carbon fibers; Economic system; Natural resource economics; Ecology; Economics; Political science; Business; Environmental science; Finance; Law; Biology; Microeconomics; Philosophy; Materials science; Politics,socialism; capitalism; property-rights; debt; property; carbon-fibers; economic-system; natural-resource-economics; ecology; economics; political-science; business; environmental-science; finance; law; biology; microeconomics; philosophy; materials-science; politics,,Capitalism Nature Socialism,en,False -W2048293151,10.1177/0020715209105140,The Transnational Organization of Production and Uneven Environmental Degradation and Change in the World Economy,2009,"The intent of the present article is to expand upon the discussion concerning the transnational organization of production, the treadmill logic which drives this organization, and highlight theoretical and empirical research regarding ecological unequal exchange, which we envision as a central dynamic enhancing capital accumulation within the world economy. Ecological unequal exchange refers to the environmentally damaging withdrawal of energy and other natural resources and the addition or externalization of environmentally damaging production and disposal activities within the periphery of the world-system as a consequence of exchange relations with more industrialized countries. It is based upon both the obtainment of natural capital and the usurpation of sink-capacity or waste assimilation properties of ecological systems in a manner that enlarges the domestic carrying capacity of the industrialized countries to the detriment of peripheral societies. Future research oriented towards further articulating the political-economic processes underlying ecological unequal exchange dynamics holds the potential to contribute to a more refined dialogue and debate regarding the prospects for the sustainable development of human societies.",James Rice,A5048848430,New Mexico State University (US),Environmental degradation; Economic system; World economy; Sustainable development; Production (economics); Economics; Natural resource; Human capital; Economy; Business; Ecology; Economic growth,environmental-degradation; economic-system; world-economy; sustainable-development; production; economics; natural-resource; human-capital; economy; business; ecology; economic-growth,https://openalex.org/W204270373; https://openalex.org/W619831140; https://openalex.org/W651598703; https://openalex.org/W1497773661; https://openalex.org/W1509006868; https://openalex.org/W1509209592; https://openalex.org/W1518806022; https://openalex.org/W1526407077; https://openalex.org/W1551322995; https://openalex.org/W1569664822; https://openalex.org/W1572762085; https://openalex.org/W1583902308; https://openalex.org/W1687549561; https://openalex.org/W1968305520; https://openalex.org/W1982690502; https://openalex.org/W1983474380; https://openalex.org/W1990164247; https://openalex.org/W1996199418; https://openalex.org/W2013402297; https://openalex.org/W2019093495; https://openalex.org/W2030978014; https://openalex.org/W2036713768; https://openalex.org/W2039073802; https://openalex.org/W2040057718; https://openalex.org/W2041137602; https://openalex.org/W2048664497; https://openalex.org/W2049466825; https://openalex.org/W2052400186; https://openalex.org/W2062232620; https://openalex.org/W2069332984; https://openalex.org/W2083319128; https://openalex.org/W2087385946; https://openalex.org/W2091709473; https://openalex.org/W2099961141; https://openalex.org/W2100231337; https://openalex.org/W2100884759; https://openalex.org/W2101108903; https://openalex.org/W2101119900; https://openalex.org/W2101325537; https://openalex.org/W2108057681; https://openalex.org/W2117981547; https://openalex.org/W2119211517; https://openalex.org/W2123826585; https://openalex.org/W2126212614; https://openalex.org/W2143917121; https://openalex.org/W2148732650; https://openalex.org/W2166671387; https://openalex.org/W2169776575; https://openalex.org/W2170219305; https://openalex.org/W2174143613; https://openalex.org/W2182089091; https://openalex.org/W2184765626; https://openalex.org/W2274106087; https://openalex.org/W2274245168; https://openalex.org/W2279795386; https://openalex.org/W2288595092; https://openalex.org/W2321434398; https://openalex.org/W2331134723; https://openalex.org/W2345240133; https://openalex.org/W2526098611; https://openalex.org/W2578584143; https://openalex.org/W2617515511; https://openalex.org/W2796317886; https://openalex.org/W2803072236; https://openalex.org/W2939094508; https://openalex.org/W3123592998; https://openalex.org/W3159280209; https://openalex.org/W4206802175; https://openalex.org/W4214548923; https://openalex.org/W4241852105; https://openalex.org/W4247796865; https://openalex.org/W4249632517; https://openalex.org/W4255576894; https://openalex.org/W4285719527; https://openalex.org/W4300360800; https://openalex.org/W4319588009,International Journal of Comparative Sociology,en,False -W4401069570,10.1016/j.tree.2024.07.002,Ecological debts induced by heat extremes,2024,"Heat extremes have become the new norm in the Anthropocene. Their potential to trigger major ecological responses is widely acknowledged, but their unprecedented severity hinders our ability to predict the magnitude of such responses, both during and after extreme heat events. To address this challenge we propose a conceptual framework inspired by the core concepts of ecological stability and thermal biology to depict how responses of populations and communities accumulate at three response stages (exposure, resistance, and recovery). Biological mechanisms mitigating responses at a given stage incur associated costs that only become apparent at other response stages; these are known as 'ecological debts'. We outline several scenarios for how ecological responses associate with debts to better understand biodiversity changes caused by heat extremes.",Gerard Martínez‐De León; Madhav P. Thakur,A5033341488; A5007221758,University of Bern (CH); University of Bern (CH),Ecology; Anthropocene; Biodiversity; Debt; Climate change; Environmental resource management; Biology; Environmental science; Economics,ecology; anthropocene; biodiversity; debt; climate-change; environmental-resource-management; biology; environmental-science; economics,https://openalex.org/W1512370820; https://openalex.org/W1574421132; https://openalex.org/W1604509704; https://openalex.org/W1978503775; https://openalex.org/W1980404368; https://openalex.org/W1992244678; https://openalex.org/W2007120691; https://openalex.org/W2008059407; https://openalex.org/W2041982026; https://openalex.org/W2050858470; https://openalex.org/W2055116474; https://openalex.org/W2075946103; https://openalex.org/W2091074640; https://openalex.org/W2104973579; https://openalex.org/W2117400326; https://openalex.org/W2117706404; https://openalex.org/W2118337700; https://openalex.org/W2123386026; https://openalex.org/W2130385086; https://openalex.org/W2131045871; https://openalex.org/W2140847080; https://openalex.org/W2145820498; https://openalex.org/W2158321278; https://openalex.org/W2220700318; https://openalex.org/W2261671681; https://openalex.org/W2284669351; https://openalex.org/W2327696339; https://openalex.org/W2330949818; https://openalex.org/W2342479537; https://openalex.org/W2411690146; https://openalex.org/W2485490013; https://openalex.org/W2508512371; https://openalex.org/W2525809904; https://openalex.org/W2613361848; https://openalex.org/W2613636640; https://openalex.org/W2731464211; https://openalex.org/W2765899323; https://openalex.org/W2766531104; https://openalex.org/W2788933461; https://openalex.org/W2809648736; https://openalex.org/W2902891963; https://openalex.org/W2909190731; https://openalex.org/W2926335840; https://openalex.org/W2926961192; https://openalex.org/W2949382350; https://openalex.org/W2952286408; https://openalex.org/W2956694137; https://openalex.org/W2965549179; https://openalex.org/W2966652567; https://openalex.org/W2999260711; https://openalex.org/W3004989685; https://openalex.org/W3008040120; https://openalex.org/W3023186923; https://openalex.org/W3036732835; https://openalex.org/W3081568437; https://openalex.org/W3083358975; https://openalex.org/W3087646956; https://openalex.org/W3089859006; https://openalex.org/W3090725528; https://openalex.org/W3092211264; https://openalex.org/W3094688652; https://openalex.org/W3126829818; https://openalex.org/W3135870899; https://openalex.org/W3138125591; https://openalex.org/W3153504491; https://openalex.org/W3177052045; https://openalex.org/W3183552297; https://openalex.org/W3185009012; https://openalex.org/W3188840573; https://openalex.org/W3196596956; https://openalex.org/W3202497626; https://openalex.org/W3215426448; https://openalex.org/W4200200708; https://openalex.org/W4220740641; https://openalex.org/W4221102046; https://openalex.org/W4225524936; https://openalex.org/W4281261659; https://openalex.org/W4281617394; https://openalex.org/W4292148468; https://openalex.org/W4292315840; https://openalex.org/W4296698538; https://openalex.org/W4298088823; https://openalex.org/W4300689515; https://openalex.org/W4308307224; https://openalex.org/W4311503626; https://openalex.org/W4311532616; https://openalex.org/W4312157409; https://openalex.org/W4317242233; https://openalex.org/W4317874579; https://openalex.org/W4318071662; https://openalex.org/W4319656044; https://openalex.org/W4323661018; https://openalex.org/W4353015204; https://openalex.org/W4383228121; https://openalex.org/W4384923447; https://openalex.org/W4385568992; https://openalex.org/W4386919492; https://openalex.org/W4386954376; https://openalex.org/W4388425161; https://openalex.org/W4394614104; https://openalex.org/W6636226513; https://openalex.org/W6782074871; https://openalex.org/W6784677898; https://openalex.org/W6809913591,Trends in Ecology & Evolution,en,False -W4292338315,10.1088/1748-9326/ac5f95,"Ecological unequal exchange: quantifying emissions of toxic chemicals embodied in the global trade of chemicals, products, and waste",2022,"Abstract Ecologically unequal exchange arises if more developed economies (‘core’) shift the environmental burden of their consumption and capital accumulation to less developed economies (‘periphery’/‘semi-core’). Here we demonstrate that human populations in core regions can benefit from the use of products containing toxic chemicals while transferring to the periphery the risk of human and ecological exposure to emissions associated with manufacturing and waste disposal. We use a global scale substance flow analysis approach to quantify the emissions of polybrominated diphenyl ethers (PBDEs), a group of flame retardants added to consumer products, that are embodied in the trade of chemicals, products and wastes between seven world regions over the 2000–2020 time period. We find that core regions have off-loaded PBDE emissions, mostly associated with the disposal of electrical and electronic waste (e-waste), to semi-core and peripheral regions in mainland China and the Global South. In core regions this results in small emissions that mostly occur during the product use phase, whereas in peripheral regions emissions are much higher and dominated by end of life disposal. The transfer of toxic chemical emissions between core and periphery can be quantified and should be accounted for when appraising the costs and benefits of global trade relationships.",Kate Tong; Li Li; Knut Breivik; Frank Wania,A5043194607; A5100361186; A5033816340; A5091794038,"University of Toronto (CA); The Scarborough Hospital (CA); University of Nevada, Reno (US); NILU (NO); University of Toronto (CA); The Scarborough Hospital (CA)",Environmental science; Polybrominated diphenyl ethers; Core (optical fiber); Mainland China; Consumption (sociology); Product (mathematics); Natural resource economics; China; Business; Ecology; Pollutant; Economics; Engineering; Geography; Biology,environmental-science; polybrominated-diphenyl-ethers; core; mainland-china; consumption; product; natural-resource-economics; china; business; ecology; pollutant; economics; engineering; geography; biology,https://openalex.org/W602304841; https://openalex.org/W1602862435; https://openalex.org/W1974875802; https://openalex.org/W1991748615; https://openalex.org/W1992683955; https://openalex.org/W1995997697; https://openalex.org/W1997508526; https://openalex.org/W2013613091; https://openalex.org/W2014714853; https://openalex.org/W2016026479; https://openalex.org/W2016466957; https://openalex.org/W2029686895; https://openalex.org/W2038770449; https://openalex.org/W2056926496; https://openalex.org/W2057796385; https://openalex.org/W2058971325; https://openalex.org/W2059473546; https://openalex.org/W2095568477; https://openalex.org/W2097169217; https://openalex.org/W2105456127; https://openalex.org/W2117216350; https://openalex.org/W2195484168; https://openalex.org/W2308866298; https://openalex.org/W2505135441; https://openalex.org/W2507896846; https://openalex.org/W2599875507; https://openalex.org/W2803186374; https://openalex.org/W2804725826; https://openalex.org/W2945875354; https://openalex.org/W2991062290; https://openalex.org/W3091914576; https://openalex.org/W3125862735; https://openalex.org/W4200272527; https://openalex.org/W4206351340; https://openalex.org/W4300113213,Environmental Research Letters,en,False -W591561411,,Ecological Debt: Global Warming and the Wealth of Nations,2009,"1. A short walk to Venus 2. The chemist's warning - A short history of global warming 3. The Heaven bursters - Tuvalu and the fate of nations 4. The great reversal of human progress 5. Ecological debt 6. The carbon debt 7. Rationalising self-destruction (or why people are more stupid than frogs) 8. The car park at the end of the world 9. Pay back time - the law, climate change and ecological debt 10. Data for the doubtful - the lessons of war economies 11. The new adjustment 12. Minerva's Owl.",Andrew Simms,A5112290444,,Debt; Global warming; Natural resource economics; Ecology; Geography; Climate change; Economics; Economy; Development economics; Finance; Biology,debt; global-warming; natural-resource-economics; ecology; geography; climate-change; economics; economy; development-economics; finance; biology,,,en,False -W3128101214,,Elaboration of the Concept of Ecological Debt,2004,,Erik Paredis; Jesse Lambrecht; Gert Goeminne; Wouter Vanhove,A5041144613; A5048787297; A5007488495; A5024639661,Ghent University (BE); Ghent University (BE); Laboratoire d’Économie d’Orléans (FR); Ghent University (BE),Elaboration; Ecology; Business; Biology; Philosophy,elaboration; ecology; business; biology; philosophy,,VUBIR (Vrije Universiteit Brussel),en,False -W2930040016,10.1111/soc4.12693,Ecologically unequal exchange: A theory of global environmental in justice,2019,"Abstract In this article, we review the theory of ecologically unequal exchange and its relevance for global environmental injustice. According to this theory, global political–economic factors, especially the structure of international trade, shape the unequal distribution of environmental harms and human development; wealthier and more powerful Global North nations have disproportionate access to both natural resources and sink capacity for waste in Global South nations. We discuss how the theory has roots in multiple perspectives on development, world‐systems analysis, environmental sociology, and ecological economics. We detail research that tests hypotheses derived from ecological unequal exchange theory on several environmental harms, including deforestation, greenhouse gas emissions, biodiversity loss, and water pollution as well as related human well‐being outcomes. We also discuss research on social forces that counter the harmful impacts of ecologically unequal exchange, including institutions, organizations, and environmental justice movements. We suggest that ecologically unequal exchange theory provides an important global political–economic approach for research in environmental sociology and other environmental social sciences as well as for sustainability studies more broadly.",Jennifer E. Givens; Xiaorui Huang; Andrew K. Jorgenson,A5008980382; A5003829664; A5017287640,Utah State University (US); Boston College (US); Boston College (US),Environmental sociology; Sustainability; Environmental justice; Injustice; Natural resource; Sociology; Politics; Environmental studies; Ecological modernization; Economics; Environmental ethics; Ecology; Social science; Political science; Biology; Law,environmental-sociology; sustainability; environmental-justice; injustice; natural-resource; sociology; politics; environmental-studies; ecological-modernization; economics; environmental-ethics; ecology; social-science; political-science; biology; law,https://openalex.org/W21053915; https://openalex.org/W392175924; https://openalex.org/W564021603; https://openalex.org/W619831140; https://openalex.org/W651598703; https://openalex.org/W1504658872; https://openalex.org/W1509006868; https://openalex.org/W1527254452; https://openalex.org/W1542915826; https://openalex.org/W1551322995; https://openalex.org/W1572762085; https://openalex.org/W1576743615; https://openalex.org/W1591166682; https://openalex.org/W1750986932; https://openalex.org/W1845845515; https://openalex.org/W1862702728; https://openalex.org/W1966605003; https://openalex.org/W1968441806; https://openalex.org/W1973954730; https://openalex.org/W1978300657; https://openalex.org/W1983474380; https://openalex.org/W1983716515; https://openalex.org/W1983784355; https://openalex.org/W1986552857; https://openalex.org/W1990164247; https://openalex.org/W1991239653; https://openalex.org/W1994726768; https://openalex.org/W1997466867; https://openalex.org/W2003242061; https://openalex.org/W2006759735; https://openalex.org/W2013091981; https://openalex.org/W2013402297; https://openalex.org/W2020935901; https://openalex.org/W2020950665; https://openalex.org/W2030680762; https://openalex.org/W2038398724; https://openalex.org/W2041490855; https://openalex.org/W2043201903; https://openalex.org/W2048051304; https://openalex.org/W2056926496; https://openalex.org/W2057810683; https://openalex.org/W2069332984; https://openalex.org/W2075340793; https://openalex.org/W2087385946; https://openalex.org/W2091709473; https://openalex.org/W2091748877; https://openalex.org/W2093580857; https://openalex.org/W2096565435; https://openalex.org/W2101108903; https://openalex.org/W2104679059; https://openalex.org/W2115328246; https://openalex.org/W2119211517; https://openalex.org/W2126212614; https://openalex.org/W2128555255; https://openalex.org/W2134016622; https://openalex.org/W2141833713; https://openalex.org/W2142043891; https://openalex.org/W2143917121; https://openalex.org/W2154286831; https://openalex.org/W2167545656; https://openalex.org/W2169566190; https://openalex.org/W2169776575; https://openalex.org/W2174103482; https://openalex.org/W2174143613; https://openalex.org/W2182089091; https://openalex.org/W2184625852; https://openalex.org/W2186681442; https://openalex.org/W2195484168; https://openalex.org/W2274762189; https://openalex.org/W2279795386; https://openalex.org/W2291058877; https://openalex.org/W2318673027; https://openalex.org/W2321434398; https://openalex.org/W2325659324; https://openalex.org/W2342655129; https://openalex.org/W2347141676; https://openalex.org/W2559805026; https://openalex.org/W2562324168; https://openalex.org/W2579888126; https://openalex.org/W2594589186; https://openalex.org/W2601697486; https://openalex.org/W2617245318; https://openalex.org/W2618067250; https://openalex.org/W2743178718; https://openalex.org/W2743381055; https://openalex.org/W2743592665; https://openalex.org/W2743816187; https://openalex.org/W2745006276; https://openalex.org/W2745249395; https://openalex.org/W2772693920; https://openalex.org/W2789494266; https://openalex.org/W2789854516; https://openalex.org/W2790147032; https://openalex.org/W2790286726; https://openalex.org/W2791909668; https://openalex.org/W2792425554; https://openalex.org/W2793864940; https://openalex.org/W2796817348; https://openalex.org/W2801608957; https://openalex.org/W2809710149; https://openalex.org/W2810012926; https://openalex.org/W2810843218; https://openalex.org/W2811136084; https://openalex.org/W2890144647; https://openalex.org/W2890848907; https://openalex.org/W2899009236; https://openalex.org/W2905655852; https://openalex.org/W2911646076; https://openalex.org/W3011395350; https://openalex.org/W3122477235; https://openalex.org/W3123592998; https://openalex.org/W3159280209; https://openalex.org/W3192802838; https://openalex.org/W3204258186; https://openalex.org/W4206802175; https://openalex.org/W4229773784; https://openalex.org/W4232543764; https://openalex.org/W4235510638; https://openalex.org/W4241755629; https://openalex.org/W4248342069,Sociology Compass,en,False -W1539308977,10.4324/9781849771771,Just Sustainabilities,2012,"Introduction: Joined-Up Thinking: Bringing Together Sustainability, Environmental Justice and Equity * Part 1 - Some Theories and Concepts: Environmental Space, Equity and the Ecological Debt * Neo-Liberalism, Globalization and the Struggle for Ecological Democracy: Linking Sustainability and Environmental Justice * Inequality and Community and the Challenge to Modernization: Evidence from the Nuclear Oases * Part 2 - Challenges: Social Justice and Environmental Sustainability: Ne'er the Twain Shall Meet * Part 3 - Cities, Communities and Social and Environmental Justice: When Consumption Does Violence: Can there be Sustainability and Environmental Justice in a Resource-Limited World? * Race, Politics and Pollution: Environmental Justice in the Mississippi River Chemical Corridor * Identity, Place and Communities of Resistance * Environmental Justice in State Policy Decisions * Part 4 - Selected Regional Perspectives on Sustainability and Environmental Justice: Sustainability and Equity: Reflection of a Local Government Practitioner in Southern Africa * Mining Conflicts, Environmental Justice and Valuation * Women and Environmental Justice in South Asia * Maori Kaupapa and the Inseparability of Social and Environmental Justice: An Analysis of Bioprospecting and a People's Resistance to Biocultural Assimilation * Political Economy of Petroleum Resources Development, Environmental Injustice and Selective Victimization: A Case Study of the Niger Delta Region of Nigeria * Environmental Protection, Economic Growth and Environmental Justice: Are They Compatible in Central and Eastern Europe? * the Campaign for Environmental Justice in Scotland as a Response to Poverty in a Northern Nation * Conclusion: Towards Just Sustainabilities: Perspectives and Possibilities * Index",,,,Psychology,psychology,,,en,False -W4403094069,10.1016/j.landusepol.2024.107378,Ecological unequal exchange: Evidence from imbalanced cropland soil erosion and agricultural value-added embodied in global agricultural trade,2024,,Guangyi Zhai; Keke Li; Huwei Cui; Zhen Wang; Ling Wang; Shuxia Yu; Zhihua Shi,A5114239456; A5100764802; A5005960026; A5100703397; A5100398679; A5015878848; A5066117382,Huazhong Agricultural University (CN); Huazhong Agricultural University (CN); Shanxi Academy of Building Research (CN); Huazhong Agricultural University (CN); Huazhong Agricultural University (CN); Huazhong Agricultural University (CN); Huazhong Agricultural University (CN),Agriculture; Value (mathematics); Ecology; Natural resource economics; Erosion; Agroforestry; Economics; Geography; Environmental science; Biology,agriculture; value; ecology; natural-resource-economics; erosion; agroforestry; economics; geography; environmental-science; biology,https://openalex.org/W1756771308; https://openalex.org/W1994291694; https://openalex.org/W1999687518; https://openalex.org/W1999800292; https://openalex.org/W2010497130; https://openalex.org/W2011487104; https://openalex.org/W2015576035; https://openalex.org/W2050901796; https://openalex.org/W2085959640; https://openalex.org/W2094119292; https://openalex.org/W2137538574; https://openalex.org/W2761050322; https://openalex.org/W2770259518; https://openalex.org/W2772366318; https://openalex.org/W2782111327; https://openalex.org/W2784325229; https://openalex.org/W2803186374; https://openalex.org/W2889413447; https://openalex.org/W2901680960; https://openalex.org/W2954095111; https://openalex.org/W2964767065; https://openalex.org/W3027625958; https://openalex.org/W3042715654; https://openalex.org/W3081374149; https://openalex.org/W3082861471; https://openalex.org/W3092296592; https://openalex.org/W3107063072; https://openalex.org/W3128603360; https://openalex.org/W3136167071; https://openalex.org/W3139350080; https://openalex.org/W3143824118; https://openalex.org/W3158842017; https://openalex.org/W3169474548; https://openalex.org/W3210969200; https://openalex.org/W3213426324; https://openalex.org/W4210795368; https://openalex.org/W4213325773; https://openalex.org/W4220684364; https://openalex.org/W4283662442; https://openalex.org/W4283768434; https://openalex.org/W4289884374; https://openalex.org/W4293202085; https://openalex.org/W4296743457; https://openalex.org/W4297996724; https://openalex.org/W4378782638; https://openalex.org/W4389839144; https://openalex.org/W6782577047; https://openalex.org/W6786154653,Land Use Policy,en,False -W4409540095,10.5195/jwsr.2025.1298,Ecological Unequal Exchange,2025,"The Marxist theory of unequal exchange challenges the idea that trade never results in outright losses. As a biophysical process, ecological unequal exchange reveals global disparities in resource flows. Using material flow analysis, alternative indicators, and new country clusters, this study updates earlier research and identifies a new phase of intensified disparities since 2015, with rising net outflows of resources from low-income countries (LICs) to high-income countries (HICs). From 1970 to 2024, HICs accumulated 290 gigatons (Gt) of raw material equivalents (RMEs) as net imports, while upper-middle-income, lower-middle-income, and low-income countries net-exported 164 Gt, 53.1 Gt, and 9.6 Gt, respectively. In a relative sense, LICs consume 13.3 percent less RMEs than they extract domestically, while HICs consume 25.4 percent more. This study challenges assumptions about global divisions of labor: not all HICs are net-importers of RMEs, nor are all LICs net-exporters. However, net-exporter HICs earn more than net-exporter LICs, and net-importer HICs spend less than net-importer LICs. On average, LICs export 6 tons of RMEs to earn what HICs earns from 1 ton; for net-exporter LICs, this ratio rises to 12.7 tons. The more a country exploits the environment, domestically or abroad, the more it earns.",Crelis Rammelt; Raimon C. Ylla-Catala,A5005445191; A5117191733,University of Amsterdam (NL); University of Amsterdam (NL),Ecology; Geography; Environmental science; Biology,ecology; geography; environmental-science; biology,https://openalex.org/W1738944162; https://openalex.org/W1983716515; https://openalex.org/W1990164247; https://openalex.org/W1997312490; https://openalex.org/W2056926496; https://openalex.org/W2059456161; https://openalex.org/W2074078642; https://openalex.org/W2088030007; https://openalex.org/W2111068618; https://openalex.org/W2115328246; https://openalex.org/W2119211517; https://openalex.org/W2162141368; https://openalex.org/W2169776575; https://openalex.org/W2291058877; https://openalex.org/W2321483768; https://openalex.org/W2345419491; https://openalex.org/W2557909387; https://openalex.org/W2562324168; https://openalex.org/W2618852203; https://openalex.org/W2729743235; https://openalex.org/W2737793390; https://openalex.org/W2743381055; https://openalex.org/W2788955535; https://openalex.org/W2811505433; https://openalex.org/W2980187407; https://openalex.org/W3083280272; https://openalex.org/W3097124494; https://openalex.org/W3109596871; https://openalex.org/W3144452147; https://openalex.org/W3175677670; https://openalex.org/W4206320582; https://openalex.org/W4212948295; https://openalex.org/W4281481120; https://openalex.org/W4292338315; https://openalex.org/W4388794117; https://openalex.org/W4396494537; https://openalex.org/W4396634190; https://openalex.org/W6642755805; https://openalex.org/W6657204294; https://openalex.org/W6751473861; https://openalex.org/W6831152815; https://openalex.org/W6850946828; https://openalex.org/W7057735341,Journal of World-Systems Research,en,False -W3209184812,10.1016/j.ecolecon.2021.107269,Ecological unequal exchange between Turkey and the European Union: An assessment from value added perspective,2021,,Gül İpek Tunç; Elif Akbostancı; Serap Türüt-Aşık,A5007464332; A5030808514; A5041222077,Middle East Technical University (TR); Middle East Technical University (TR); Middle East Technical University (TR),European union; Greenhouse gas; Context (archaeology); Economics; Value (mathematics); Consumption (sociology); International trade; International economics; Globalization; Added value; Goods and services; Agricultural economics; Natural resource economics; Business; Economy; Geography; Ecology; Macroeconomics; Market economy,european-union; greenhouse-gas; context; economics; value; consumption; international-trade; international-economics; globalization; added-value; goods-and-services; agricultural-economics; natural-resource-economics; business; economy; geography; ecology; macroeconomics; market-economy,https://openalex.org/W1588495026; https://openalex.org/W1616101857; https://openalex.org/W1970139579; https://openalex.org/W1992683955; https://openalex.org/W2013402297; https://openalex.org/W2030319020; https://openalex.org/W2041490855; https://openalex.org/W2056926496; https://openalex.org/W2069921900; https://openalex.org/W2102966366; https://openalex.org/W2111102226; https://openalex.org/W2119211517; https://openalex.org/W2156203513; https://openalex.org/W2159596579; https://openalex.org/W2162141368; https://openalex.org/W2181218826; https://openalex.org/W2321511225; https://openalex.org/W2321835891; https://openalex.org/W2347141676; https://openalex.org/W2557126631; https://openalex.org/W2788955535; https://openalex.org/W2930040016; https://openalex.org/W2979882099; https://openalex.org/W2991195287; https://openalex.org/W2995072805; https://openalex.org/W3010507923; https://openalex.org/W3016082502; https://openalex.org/W3083280272; https://openalex.org/W3097124494; https://openalex.org/W3125711463; https://openalex.org/W6636465677; https://openalex.org/W6776617174,Ecological Economics,en,False -W2562324168,10.2458/v23i1.20223,"Linking ecological debt and ecologically unequal exchange: stocks, flows, and unequal sink appropriation",2016,"Ecological debt is usually conceptualized as the accumulated result of different kinds of uneven flows of natural resources and waste, but these flows are seldom referred to as ecologically unequal exchange. Ecologically unequal exchange, on the other hand, is usually defined as different flows of resources and waste, but the accumulated results of these flows are seldom referred to as ecological debt. In this article, influential definitions and conceptualizations of ecological debt and ecologically unequal exchange are compared and the notions linked together analytically with a stock-flow perspective. A particular challenge is presented by emissions of substances that have global consequences, most importantly carbon dioxide and other greenhouse gases. They form part of ecologically unequal exchange, but what is unequal is not the exchange of resources or energy, but the appropriation of the sinks that absorb these substances. New concepts, unequal sink appropriation and the more specific carbon sink appropriation are proposed as a way of highlighting this distinction.",Rikard Warlenius,A5020507738,Lund University (SE),Appropriation; Natural resource economics; Greenhouse gas; Debt; Sink (geography); Carbon sink; Economics; Ecology; Business; Environmental science; Climate change; Geography; Finance; Biology,appropriation; natural-resource-economics; greenhouse-gas; debt; sink; carbon-sink; economics; ecology; business; environmental-science; climate-change; geography; finance; biology,https://openalex.org/W148464764; https://openalex.org/W222966551; https://openalex.org/W401135514; https://openalex.org/W591561411; https://openalex.org/W636349284; https://openalex.org/W651598703; https://openalex.org/W1247171326; https://openalex.org/W1509006868; https://openalex.org/W1557989049; https://openalex.org/W1569701617; https://openalex.org/W1572762085; https://openalex.org/W1591166682; https://openalex.org/W1687549561; https://openalex.org/W1738944162; https://openalex.org/W1760358764; https://openalex.org/W1873550992; https://openalex.org/W1966605003; https://openalex.org/W1970139579; https://openalex.org/W1973176252; https://openalex.org/W1974797333; https://openalex.org/W1986552857; https://openalex.org/W1988958743; https://openalex.org/W1990164247; https://openalex.org/W1996628034; https://openalex.org/W1997312490; https://openalex.org/W1999061137; https://openalex.org/W2003132638; https://openalex.org/W2006759735; https://openalex.org/W2012254774; https://openalex.org/W2013402297; https://openalex.org/W2030680762; https://openalex.org/W2030978014; https://openalex.org/W2031736557; https://openalex.org/W2032498967; https://openalex.org/W2040057718; https://openalex.org/W2041490855; https://openalex.org/W2048034272; https://openalex.org/W2048051304; https://openalex.org/W2048293151; https://openalex.org/W2051049084; https://openalex.org/W2056926496; https://openalex.org/W2057002878; https://openalex.org/W2057810683; https://openalex.org/W2059456161; https://openalex.org/W2085683054; https://openalex.org/W2089327955; https://openalex.org/W2091709473; https://openalex.org/W2091748877; https://openalex.org/W2100231337; https://openalex.org/W2108057681; https://openalex.org/W2119211517; https://openalex.org/W2137540105; https://openalex.org/W2142043891; https://openalex.org/W2167545656; https://openalex.org/W2169776575; https://openalex.org/W2184625852; https://openalex.org/W2319568853; https://openalex.org/W2329021176; https://openalex.org/W2581233708; https://openalex.org/W2618067250; https://openalex.org/W2949513949; https://openalex.org/W3159280209; https://openalex.org/W3216928223; https://openalex.org/W4236975506; https://openalex.org/W4298026979; https://openalex.org/W4298162800; https://openalex.org/W4300992326; https://openalex.org/W4312100536; https://openalex.org/W6628336124; https://openalex.org/W6630499190; https://openalex.org/W6634205608; https://openalex.org/W6639486880; https://openalex.org/W6658666898; https://openalex.org/W6660395347; https://openalex.org/W6671780278; https://openalex.org/W6675024767; https://openalex.org/W6850696550; https://openalex.org/W6986386144; https://openalex.org/W7002005117; https://openalex.org/W7014770401; https://openalex.org/W7056187441,Journal of Political Ecology,en,False -W2620457709,10.2458/v23i1.20222,Cumulative material flows provide indicators to quantify the ecological debt,2016,"There is ample evidence that an unabated growth in material consumption is likely to pass the earth system's source and sink capacities. In the face of limited resources, distributional questions increasingly gain importance. Material flow accounting is a methodological tool to trace biophysical patterns of disproportionate resource consumption across countries and the debt towards the environment, other parts of the world, and towards future generations through the excessive consumption of natural resources. At the core of this article, we address different developments of material use for individual countries and world regions from 1950 to 2010. During this phase, fossil fuel-based industrialization triggered an unprecedented growth in material consumption, mainly in the wealthy world regions of Europe, Australia, North America, and partly in the countries of the former Soviet Union, while low resource consumption persists in other regions. We thus calculated cumulative resource use from 1950 to 2010 to show the extent of this wealth built up upon countries' own resources, or through imports from other countries or world regions. We use the degree of net-import dependency of individual countries as a proxy for the ecological debt, and relate it to the domestic resource extraction in a country. Our observations show that there was a highly uneven distribution of resource extraction and use in the 60 years analyzed, which has important implications for future global resource policies.",Andreas Mayer; Willi Haas,A5101736941; A5090760544,,Natural resource; Natural resource economics; Proxy (statistics); Resource (disambiguation); Consumption (sociology); Debt; Industrialisation; Economics; Geography; Economic geography; Business; Ecology; Macroeconomics; Market economy,natural-resource; natural-resource-economics; proxy; resource; consumption; debt; industrialisation; economics; geography; economic-geography; business; ecology; macroeconomics; market-economy,https://openalex.org/W266724779; https://openalex.org/W651096281; https://openalex.org/W1540309666; https://openalex.org/W1567277510; https://openalex.org/W1571298011; https://openalex.org/W1577300141; https://openalex.org/W1865643671; https://openalex.org/W1965592156; https://openalex.org/W1967546379; https://openalex.org/W1980314759; https://openalex.org/W1986875667; https://openalex.org/W1992391390; https://openalex.org/W2010425532; https://openalex.org/W2017541733; https://openalex.org/W2023211834; https://openalex.org/W2024024581; https://openalex.org/W2026087447; https://openalex.org/W2028502628; https://openalex.org/W2028648240; https://openalex.org/W2030608117; https://openalex.org/W2043402897; https://openalex.org/W2045987553; https://openalex.org/W2048051304; https://openalex.org/W2061216116; https://openalex.org/W2075381148; https://openalex.org/W2083455829; https://openalex.org/W2085683054; https://openalex.org/W2086036483; https://openalex.org/W2088965446; https://openalex.org/W2089327955; https://openalex.org/W2090967692; https://openalex.org/W2093154430; https://openalex.org/W2096885696; https://openalex.org/W2101025401; https://openalex.org/W2105537763; https://openalex.org/W2113908401; https://openalex.org/W2124622654; https://openalex.org/W2126212614; https://openalex.org/W2128956132; https://openalex.org/W2133920545; https://openalex.org/W2143874113; https://openalex.org/W2144902479; https://openalex.org/W2151691147; https://openalex.org/W2153505582; https://openalex.org/W2153820558; https://openalex.org/W2156659366; https://openalex.org/W2160750143; https://openalex.org/W2164706901; https://openalex.org/W2167555648; https://openalex.org/W2179946186; https://openalex.org/W2275435861; https://openalex.org/W2319568853; https://openalex.org/W2898123036; https://openalex.org/W2951306510; https://openalex.org/W3106083306; https://openalex.org/W3159280209; https://openalex.org/W6609921129; https://openalex.org/W6657958280; https://openalex.org/W6669647426; https://openalex.org/W6675404599; https://openalex.org/W6675798746; https://openalex.org/W6850696550; https://openalex.org/W7056187441,Journal of Political Ecology,en,False -W4316371191,10.1016/j.apr.2023.101661,Ecological unequal exchange between China and European Union: An investigation from global value chains and carbon emissions viewpoint,2023,,Yulong Zhang; Cuiping Liao; Binbin Pan,A5100635551; A5048207347; A5068630072,Chinese Academy of Sciences (CN); Guangzhou Institute of Energy Conversion (CN); Guangzhou Institute of Energy Conversion (CN); Chinese Academy of Sciences (CN); Sun Yat-sen University (CN),China; European union; Value (mathematics); International trade; International economics; Business; Bilateral trade; Economics; Geography,china; european-union; value; international-trade; international-economics; business; bilateral-trade; economics; geography,https://openalex.org/W1997312490; https://openalex.org/W2051959187; https://openalex.org/W2346836002; https://openalex.org/W2760889115; https://openalex.org/W2800846169; https://openalex.org/W2809856553; https://openalex.org/W2887557516; https://openalex.org/W2902471502; https://openalex.org/W2913051656; https://openalex.org/W2917881351; https://openalex.org/W2943374163; https://openalex.org/W2945557658; https://openalex.org/W2954575718; https://openalex.org/W2972156512; https://openalex.org/W2995485375; https://openalex.org/W3010013823; https://openalex.org/W3094148576; https://openalex.org/W3097124494; https://openalex.org/W3100428128; https://openalex.org/W3119953297; https://openalex.org/W3125711463; https://openalex.org/W3127559052; https://openalex.org/W3158748634; https://openalex.org/W3188598489; https://openalex.org/W3201145281; https://openalex.org/W3212768009; https://openalex.org/W4200295247; https://openalex.org/W4226025179; https://openalex.org/W6762409507; https://openalex.org/W6771720264,Atmospheric Pollution Research,en,False -W1978028715,10.1080/15239081003719193,Ecological Debt: Exploring the Factors that Affect National Footprints,2010,"Environmental or ‘ecological’ footprints have been widely used as aggregate indicators of the human appropriation of natural capital with prevailing technology. They represent a partial measure of a community's pathway towards sustainable development. Footprints vary between countries at different stages of economic development and varying geographic characteristics. Dimensional analysis techniques from engineering and the thermal sciences have been employed to determine the influence of a wide range of parameters on per capita national footprints, including per capita national income, population density, pollutant emission intensity, local climate, soil productivity, and technology. One hundred and nine countries made up the final database (based on 2003 international statistical data sets). Per capita national environmental footprints are found to be strongly dependent on per capita national income, and only weakly on population density. The implications of the findings are illustrated by reference to the situation in the G8 + 5 nations. Variations about the resulting power–law correlation suggest the extent to which individual nations are frugal or profligate in terms of their resource use and environmental impacts. The ecological debt owed by the industrialized countries of the North to the developing nations of the populous South is highlighted.",Gemma Cranston; Geoffrey P. Hammond; R. C. Johnson,A5065872877; A5069523442; A5113609421,University of Bath (GB); University of Bath (GB); Centre for Sustainable Energy (GB); University of Bath (GB),Ecological footprint; Per capita; Population; Geography; Sustainability; Natural capital; Natural resource; Per capita income; Sustainable development; Natural resource economics; Gross national income; Gross domestic product; Economics; Ecology; Environmental resource management; Economic growth; Ecosystem services,ecological-footprint; per-capita; population; geography; sustainability; natural-capital; natural-resource; per-capita-income; sustainable-development; natural-resource-economics; gross-national-income; gross-domestic-product; economics; ecology; environmental-resource-management; economic-growth; ecosystem-services,https://openalex.org/W33517402; https://openalex.org/W49479346; https://openalex.org/W101135972; https://openalex.org/W280163183; https://openalex.org/W623224144; https://openalex.org/W644940498; https://openalex.org/W1483677947; https://openalex.org/W1524961168; https://openalex.org/W1539804594; https://openalex.org/W1581862528; https://openalex.org/W1970852348; https://openalex.org/W1989838436; https://openalex.org/W2031307450; https://openalex.org/W2033216070; https://openalex.org/W2047856663; https://openalex.org/W2057305715; https://openalex.org/W2061195351; https://openalex.org/W2072572975; https://openalex.org/W2103363550; https://openalex.org/W2116018954; https://openalex.org/W2127867569; https://openalex.org/W2554800123; https://openalex.org/W3037339115; https://openalex.org/W3135109524,Journal of Environmental Policy & Planning,en,False -W2592356138,10.2458/v21i1.21124,Between activism and science: grassroots concepts for sustainability coined by Environmental Justice Organizations,2014,"In their own battles and strategy meetings since the early 1980s, EJOs (environmental justice organizations) and their networks have introduced several concepts to political ecology that have also been taken up by academics and policy makers. In this paper, we explain the contexts in which such notions have arisen, providing definitions of a wide array of concepts and slogans related to environmental inequities and sustainability, and explore the connections and relations between them. These concepts include: environmental justice, ecological debt, popular epidemiology, environmental racism, climate justice, environmentalism of the poor, water justice, biopiracy, food sovereignty, ""green deserts"", ""peasant agriculture cools downs the Earth"", land grabbing, Ogonization and Yasunization, resource caps, corporate accountability, ecocide, and indigenous territorial rights, among others. We examine how activists have coined these notions and built demands around them, and how academic research has in turn further applied them and supplied other related concepts, working in a mutually reinforcing way with EJOs. We argue that these processes and dynamics build an activist-led and co-produced social sustainability science, furthering both academic scholarship and activism on environmental justice.",Joan Martínez Alier; Stanislav Shmelev,A5004042357; A5049502952,Universitat Autònoma de Barcelona (ES),Environmental justice; Environmentalism; Grassroots; Environmental ethics; Sustainability; Scholarship; Sociology; Indigenous; Political science; Political ecology; Climate justice; Environmental studies; Economic Justice; Politics; Law; Ecology; Climate change,environmental-justice; environmentalism; grassroots; environmental-ethics; sustainability; scholarship; sociology; indigenous; political-science; political-ecology; climate-justice; environmental-studies; economic-justice; politics; law; ecology; climate-change,https://openalex.org/W39838849; https://openalex.org/W82976660; https://openalex.org/W91194789; https://openalex.org/W147937154; https://openalex.org/W160500913; https://openalex.org/W193929132; https://openalex.org/W316671780; https://openalex.org/W435401431; https://openalex.org/W564851044; https://openalex.org/W568129555; https://openalex.org/W570650193; https://openalex.org/W571924660; https://openalex.org/W573704088; https://openalex.org/W573931508; https://openalex.org/W576583604; https://openalex.org/W578778883; https://openalex.org/W589250096; https://openalex.org/W591561411; https://openalex.org/W614736872; https://openalex.org/W616805653; https://openalex.org/W621862612; https://openalex.org/W622111395; https://openalex.org/W644940498; https://openalex.org/W654686773; https://openalex.org/W655364166; https://openalex.org/W656720890; https://openalex.org/W657620444; https://openalex.org/W1239215947; https://openalex.org/W1247171326; https://openalex.org/W1421354461; https://openalex.org/W1479808467; https://openalex.org/W1482149660; https://openalex.org/W1487319106; https://openalex.org/W1495278944; https://openalex.org/W1500660161; https://openalex.org/W1506954881; https://openalex.org/W1512117345; https://openalex.org/W1516080007; https://openalex.org/W1518215334; https://openalex.org/W1523248977; https://openalex.org/W1538244819; https://openalex.org/W1539308977; https://openalex.org/W1539621049; https://openalex.org/W1547879894; https://openalex.org/W1553033536; https://openalex.org/W1557989049; https://openalex.org/W1562479083; https://openalex.org/W1566890474; https://openalex.org/W1567962490; https://openalex.org/W1572893935; https://openalex.org/W1573302411; https://openalex.org/W1575914683; https://openalex.org/W1591166682; https://openalex.org/W1595403411; https://openalex.org/W1595652305; https://openalex.org/W1597172957; https://openalex.org/W1601590165; https://openalex.org/W1602775671; https://openalex.org/W1607813434; https://openalex.org/W1659143523; https://openalex.org/W1750986932; https://openalex.org/W1884434851; https://openalex.org/W1902314391; https://openalex.org/W1942258133; https://openalex.org/W1963684733; https://openalex.org/W1966605003; https://openalex.org/W1973176252; https://openalex.org/W1973318389; https://openalex.org/W1973954730; https://openalex.org/W1974075073; https://openalex.org/W1974564128; https://openalex.org/W1980314759; https://openalex.org/W1982053377; https://openalex.org/W1996316216; https://openalex.org/W1996349744; https://openalex.org/W1996628034; https://openalex.org/W1998173620; https://openalex.org/W1998742855; https://openalex.org/W2004961518; https://openalex.org/W2006467409; https://openalex.org/W2008114235; https://openalex.org/W2008996531; https://openalex.org/W2010516257; https://openalex.org/W2012254774; https://openalex.org/W2013402297; https://openalex.org/W2014182960; https://openalex.org/W2021001691; https://openalex.org/W2022814637; https://openalex.org/W2023723950; https://openalex.org/W2025982662; https://openalex.org/W2030655414; https://openalex.org/W2030787275; https://openalex.org/W2033583754; https://openalex.org/W2034283967; https://openalex.org/W2035353157; https://openalex.org/W2040538614; https://openalex.org/W2040777013; https://openalex.org/W2041819150; https://openalex.org/W2043070898; https://openalex.org/W2043699734; https://openalex.org/W2051321812; https://openalex.org/W2054308231; https://openalex.org/W2056926496; https://openalex.org/W2057357715; https://openalex.org/W2057931959; https://openalex.org/W2060306247; https://openalex.org/W2061668231; https://openalex.org/W2063059716; https://openalex.org/W2063877192; https://openalex.org/W2067361057; https://openalex.org/W2067580676; https://openalex.org/W2068549644; https://openalex.org/W2069878420; https://openalex.org/W2071735537; https://openalex.org/W2073478361; https://openalex.org/W2074580217; https://openalex.org/W2076362506; https://openalex.org/W2076566559; https://openalex.org/W2082793946; https://openalex.org/W2089327955; https://openalex.org/W2091709473; https://openalex.org/W2091795684; https://openalex.org/W2098871663; https://openalex.org/W2112560808; https://openalex.org/W2115012914; https://openalex.org/W2116417465; https://openalex.org/W2116575632; https://openalex.org/W2118434792; https://openalex.org/W2122325078; https://openalex.org/W2125058066; https://openalex.org/W2126585096; https://openalex.org/W2126838209; https://openalex.org/W2128207432; https://openalex.org/W2128697261; https://openalex.org/W2137540105; https://openalex.org/W2138587975; https://openalex.org/W2140675380; https://openalex.org/W2143132840; https://openalex.org/W2143767744; https://openalex.org/W2148732650; https://openalex.org/W2149970882; https://openalex.org/W2150141679; https://openalex.org/W2153194442; https://openalex.org/W2159167826; https://openalex.org/W2164334321; https://openalex.org/W2165082200; https://openalex.org/W2169091890; https://openalex.org/W2171848356; https://openalex.org/W2175723801; https://openalex.org/W2212707908; https://openalex.org/W2298327222; https://openalex.org/W2302608887; https://openalex.org/W2319568853; https://openalex.org/W2320646653; https://openalex.org/W2487318391; https://openalex.org/W2488167377; https://openalex.org/W2509117576; https://openalex.org/W2558607969; https://openalex.org/W2565699167; https://openalex.org/W2568822415; https://openalex.org/W2578584143; https://openalex.org/W2580230008; https://openalex.org/W2592836093; https://openalex.org/W2603115376; https://openalex.org/W2604442016; https://openalex.org/W2606168528; https://openalex.org/W2741785244; https://openalex.org/W2753514269; https://openalex.org/W2761366574; https://openalex.org/W2765155369; https://openalex.org/W2782164276; https://openalex.org/W2783900590; https://openalex.org/W2785127367; https://openalex.org/W2901206765; https://openalex.org/W2941444685; https://openalex.org/W3021686098; https://openalex.org/W3048682234; https://openalex.org/W3106760113; https://openalex.org/W3121653486; https://openalex.org/W3124676054; https://openalex.org/W3127572256; https://openalex.org/W3128101214; https://openalex.org/W3140490681; https://openalex.org/W3144039943; https://openalex.org/W3152418774; https://openalex.org/W3159280209; https://openalex.org/W3196959624; https://openalex.org/W3217220183; https://openalex.org/W4232305462; https://openalex.org/W4232526858; https://openalex.org/W4233189840; https://openalex.org/W4233915062; https://openalex.org/W4238073656; https://openalex.org/W4239054152; https://openalex.org/W4239421629; https://openalex.org/W4239528198; https://openalex.org/W4240035647; https://openalex.org/W4242732899; https://openalex.org/W4245805227; https://openalex.org/W4248432196; https://openalex.org/W4250449328; https://openalex.org/W4252487411; https://openalex.org/W4252748097; https://openalex.org/W4285719527; https://openalex.org/W4293402844; https://openalex.org/W4299341209; https://openalex.org/W4301011076; https://openalex.org/W4301267015; https://openalex.org/W4301378955; https://openalex.org/W4301408177; https://openalex.org/W4380764505; https://openalex.org/W4389266611; https://openalex.org/W4395699796; https://openalex.org/W4399989433; https://openalex.org/W6601673023; https://openalex.org/W6616702184; https://openalex.org/W6616805983; https://openalex.org/W6619722480; https://openalex.org/W6621187288; https://openalex.org/W6621883857; https://openalex.org/W6628336124; https://openalex.org/W6630123270; https://openalex.org/W6636116788; https://openalex.org/W6636467996; https://openalex.org/W6641865735; https://openalex.org/W6644093368; https://openalex.org/W6645660529; https://openalex.org/W6651703445; https://openalex.org/W6677729076; https://openalex.org/W6678504357; https://openalex.org/W6678592594; https://openalex.org/W6680228642; https://openalex.org/W6683203252; https://openalex.org/W6685120645; https://openalex.org/W6688961690; https://openalex.org/W6692378038; https://openalex.org/W6730548376; https://openalex.org/W6827908398; https://openalex.org/W6850696550; https://openalex.org/W7010406827; https://openalex.org/W7037984302; https://openalex.org/W7046701048; https://openalex.org/W7056187441; https://openalex.org/W7073934388,Journal of Political Ecology,en,False -W2801148776,10.4337/9781840649093.00014,The Ecological Debt,2002,,Joan Martínez Alier,A5004042357,,Ecology; Geography; Business; Biology,ecology; geography; business; biology,,Edward Elgar Publishing eBooks,en,False -W2041321854,10.1016/j.ecolecon.2014.04.005,The ‘Environmentalism of the Poor’ revisited: Territory and place in disconnected glocal struggles,2014,,Isabelle Anguelovski; Joan Martínez Alier,A5082142224; A5004042357,Universitat Autònoma de Barcelona (ES); Universitat Autònoma de Barcelona (ES),Environmentalism; Environmental justice; Environmental movement; Sociology; Environmental ethics; Appropriation; Political science; Law; Politics,environmentalism; environmental-justice; environmental-movement; sociology; environmental-ethics; appropriation; political-science; law; politics,https://openalex.org/W39838849; https://openalex.org/W59841739; https://openalex.org/W160500913; https://openalex.org/W356139667; https://openalex.org/W397816860; https://openalex.org/W435401431; https://openalex.org/W562156689; https://openalex.org/W562451465; https://openalex.org/W570834956; https://openalex.org/W571924660; https://openalex.org/W573704088; https://openalex.org/W573931508; https://openalex.org/W576583604; https://openalex.org/W579402700; https://openalex.org/W589062013; https://openalex.org/W589250096; https://openalex.org/W614736872; https://openalex.org/W619318923; https://openalex.org/W624155561; https://openalex.org/W642358081; https://openalex.org/W642451705; https://openalex.org/W645077254; https://openalex.org/W646521148; https://openalex.org/W654686773; https://openalex.org/W1482927345; https://openalex.org/W1499479468; https://openalex.org/W1506411789; https://openalex.org/W1512117345; https://openalex.org/W1535725372; https://openalex.org/W1536916917; https://openalex.org/W1550437797; https://openalex.org/W1584129281; https://openalex.org/W1597172957; https://openalex.org/W1602775671; https://openalex.org/W1606706423; https://openalex.org/W1846573417; https://openalex.org/W1966823031; https://openalex.org/W1975580813; https://openalex.org/W1980314759; https://openalex.org/W1987153398; https://openalex.org/W1987362680; https://openalex.org/W1991915295; https://openalex.org/W2000958319; https://openalex.org/W2005343642; https://openalex.org/W2008114235; https://openalex.org/W2009964700; https://openalex.org/W2010152327; https://openalex.org/W2013949792; https://openalex.org/W2024414180; https://openalex.org/W2027774628; https://openalex.org/W2030130399; https://openalex.org/W2030626342; https://openalex.org/W2030787275; https://openalex.org/W2032938810; https://openalex.org/W2034283967; https://openalex.org/W2034983915; https://openalex.org/W2035353157; https://openalex.org/W2036513938; https://openalex.org/W2036832562; https://openalex.org/W2040538614; https://openalex.org/W2041819150; https://openalex.org/W2042276094; https://openalex.org/W2045609492; https://openalex.org/W2046738530; https://openalex.org/W2049611326; https://openalex.org/W2051049084; https://openalex.org/W2057357715; https://openalex.org/W2060306247; https://openalex.org/W2061660593; https://openalex.org/W2062212647; https://openalex.org/W2064519090; https://openalex.org/W2064656059; https://openalex.org/W2069859898; https://openalex.org/W2072930541; https://openalex.org/W2074483086; https://openalex.org/W2074580217; https://openalex.org/W2074600421; https://openalex.org/W2076352747; https://openalex.org/W2076566559; https://openalex.org/W2076926005; https://openalex.org/W2077880498; https://openalex.org/W2078002056; https://openalex.org/W2080510919; https://openalex.org/W2081971958; https://openalex.org/W2083185167; https://openalex.org/W2083310114; https://openalex.org/W2086192290; https://openalex.org/W2086498757; https://openalex.org/W2087489269; https://openalex.org/W2092783574; https://openalex.org/W2095616782; https://openalex.org/W2102454002; https://openalex.org/W2102503308; https://openalex.org/W2104935650; https://openalex.org/W2105405962; https://openalex.org/W2105865885; https://openalex.org/W2108173127; https://openalex.org/W2113021103; https://openalex.org/W2113097858; https://openalex.org/W2116488332; https://openalex.org/W2118434792; https://openalex.org/W2118594453; https://openalex.org/W2119119035; https://openalex.org/W2124472031; https://openalex.org/W2130310224; https://openalex.org/W2132230285; https://openalex.org/W2133412156; https://openalex.org/W2140175400; https://openalex.org/W2144754868; https://openalex.org/W2147220924; https://openalex.org/W2147419241; https://openalex.org/W2149970882; https://openalex.org/W2150219368; https://openalex.org/W2153194442; https://openalex.org/W2157229390; https://openalex.org/W2166866622; https://openalex.org/W2167026714; https://openalex.org/W2167251327; https://openalex.org/W2167555648; https://openalex.org/W2169091890; https://openalex.org/W2236678118; https://openalex.org/W2243371407; https://openalex.org/W2260680087; https://openalex.org/W2278391005; https://openalex.org/W2315840321; https://openalex.org/W2331037351; https://openalex.org/W2331696864; https://openalex.org/W2333398935; https://openalex.org/W2334710259; https://openalex.org/W2338244508; https://openalex.org/W2339740280; https://openalex.org/W2344198449; https://openalex.org/W2487318391; https://openalex.org/W2499185134; https://openalex.org/W2514996577; https://openalex.org/W2540459781; https://openalex.org/W2568822415; https://openalex.org/W2592356138; https://openalex.org/W2593779134; https://openalex.org/W2595644036; https://openalex.org/W2603115376; https://openalex.org/W2739626300; https://openalex.org/W2741785244; https://openalex.org/W2782048220; https://openalex.org/W2790398204; https://openalex.org/W2888799796; https://openalex.org/W2901216850; https://openalex.org/W2977594498; https://openalex.org/W3121548831; https://openalex.org/W3124677426; https://openalex.org/W3125863435; https://openalex.org/W3152418774; https://openalex.org/W3159280209; https://openalex.org/W4233919019; https://openalex.org/W4238073656; https://openalex.org/W4239054152; https://openalex.org/W4242122157; https://openalex.org/W4242732899; https://openalex.org/W4243589412; https://openalex.org/W4246152242; https://openalex.org/W4250141681; https://openalex.org/W4251191652; https://openalex.org/W4285719527; https://openalex.org/W4299341209; https://openalex.org/W4299430935; https://openalex.org/W4299951319; https://openalex.org/W4301378955; https://openalex.org/W4301408177; https://openalex.org/W4389266611; https://openalex.org/W6630404162; https://openalex.org/W6652986982; https://openalex.org/W6662262605; https://openalex.org/W6677729132; https://openalex.org/W6677826818; https://openalex.org/W6692737411; https://openalex.org/W6698844043; https://openalex.org/W6704601003; https://openalex.org/W6726234040; https://openalex.org/W6734053437; https://openalex.org/W6736368873; https://openalex.org/W6742195171; https://openalex.org/W6747364542; https://openalex.org/W6777812432; https://openalex.org/W6805501799,Ecological Economics,en,False -W2379365567,,Human's Consumption of Ecosystem Services and Ecological Debt in China,2010,"Human's reckless consumption is depleting the world's natural capital to a point where we are endangering our future prosperity.Accounting ecological footprint,bio-productive capacity and ecological debt of China during 1980-2005 shows that China has encountered an increased ecological debt with its value of 1.02 ghm2 in 2005 due to increased demand for ecological service of socio-economic metabolism especially on fossil fuels though its bio-productive capacity per capita doubled to 1.15 ghm2.Demand for ecological service,or ecological footprint,in 2005 exceeded China's earth's regenerative capacity by 89%.At the provincial level,85% of China's provinces have been in ecological debt in the long term and now only three provinces of Hainan,Fujian and Xizang are in ecological surplus.China and most of its provinces are in soft ecological deficit due to the contradictions between ecological service supply and demand in spatial,temporal and components structural dimensions.Such a type ecological debt might be mitigated or eliminated by appropriating the current or future global commons or buying hidden ecological service through international or interregional trade channel.China is heading for an ecological credit crunch as the integrated consequence of its natural constraint of land use base to bio-capacity and rapid economic growth.Against the backdrop that natural capital has been among the limiting factors to world's economic development,China earnestly established the scientific development concept and implemented multiple effective activities to reverse ecological'credit crunch' and curb ecological recession.",Yushu Zhang,A5101985252,Beijing Institute of Petrochemical Technology (CN),Ecological footprint; Natural capital; Ecosystem services; Ecological economics; Prosperity; Ecology; Economics; Sustainable development; Natural resource economics; Business; Sustainability; Geography; Economic growth; Ecosystem,ecological-footprint; natural-capital; ecosystem-services; ecological-economics; prosperity; ecology; economics; sustainable-development; natural-resource-economics; business; sustainability; geography; economic-growth; ecosystem,,,en,False -W2896815490,10.4324/9780203094402-13,Great expectations: the psychodynamics of ecological debt,2012,Bob Ward and Margaret Rustin share with me a desire to bring people from a state of irrationality to one where they are able to think and act creatively in response to climate change. How to arrive there is the question.,Rosemary Randall,A5090366355,,Psychodynamics; Ecology; Debt; Economics; Psychology; Biology; Psychotherapist; Macroeconomics,psychodynamics; ecology; debt; economics; psychology; biology; psychotherapist; macroeconomics,,,en,False -W2767845126,10.1080/15487733.2008.11908010,A modest proposal: global rationalization of ecological footprint to eliminate ecological debt,2008,"In the context of ecological overshoot, extreme poverty, and profligate consumption, we propose using ecological footprint analysis (EFA) to regulate and rationalize material consumption worldwide. EFA quantifies humanconsumption flows relative to renewable natural capital stocks given specified levels of technology. Worldwide, 1.8 global hectares (gha) of bioproductive land exist per person, yet the human population is currently consuming 2.2 gha per person. Given global overshoot and the radically uneven distribution of consumption, we propose a global regime of cap-and-trade of ecological footprint. Under the terms of our modest proposal, all nations would be allocated population- based ecological footprints of an “earthshare” of 1.8 gha per person. Nations with large per capita footprints would be obligated to make reductions through some combination of reduced consumption, resource-productivity gains, population decreases, ecological restoration, and purchase of footprint credits. In contrast, countries with small per capita footprints could sell footprint credits to finance modernization along ecological lines. Mathematical simulation of our proposal indicates global convergence of nations’ ecological footprints in 136 years. In our view, the obscenity of contemporary ecological degradation and human suffering is perhaps rivaled by the audacity of our proposal to commodify biocapacity worldwide. We leave it to the reader to compare our response to institutional failure and the problem of distributive justice to the remedy Swift offered in 1729.",Brian Ohl; Steven A. Wolf; William Anderson,A5090121896; A5025856415; A5008298357,Cornell University (US); Cornell University (US); Cornell University (US),Ecological footprint; Per capita; Population; Economics; Consumption (sociology); Overshoot (microwave communication); Context (archaeology); Natural resource economics; Sustainability; Ecology; Geography; Demography,ecological-footprint; per-capita; population; economics; consumption; overshoot; context; natural-resource-economics; sustainability; ecology; geography; demography,https://openalex.org/W181162704; https://openalex.org/W370891183; https://openalex.org/W417693152; https://openalex.org/W592098796; https://openalex.org/W602719314; https://openalex.org/W624977706; https://openalex.org/W644178155; https://openalex.org/W644940498; https://openalex.org/W1482286954; https://openalex.org/W1539453952; https://openalex.org/W1544813361; https://openalex.org/W1551533759; https://openalex.org/W1565850046; https://openalex.org/W1584710685; https://openalex.org/W1663957662; https://openalex.org/W1746595101; https://openalex.org/W1971425631; https://openalex.org/W1976414428; https://openalex.org/W1996199418; https://openalex.org/W1998733902; https://openalex.org/W2002402372; https://openalex.org/W2003242061; https://openalex.org/W2017522204; https://openalex.org/W2027271929; https://openalex.org/W2044314202; https://openalex.org/W2068622922; https://openalex.org/W2071868072; https://openalex.org/W2076618941; https://openalex.org/W2085850565; https://openalex.org/W2092463295; https://openalex.org/W2096314897; https://openalex.org/W2098470815; https://openalex.org/W2103605303; https://openalex.org/W2108173127; https://openalex.org/W2116018954; https://openalex.org/W2127251305; https://openalex.org/W2127329485; https://openalex.org/W2183646201; https://openalex.org/W2315346373; https://openalex.org/W2497172328; https://openalex.org/W2613902989; https://openalex.org/W2746485780; https://openalex.org/W2796817348; https://openalex.org/W3123160752; https://openalex.org/W4235523545; https://openalex.org/W4246142122; https://openalex.org/W4285719527; https://openalex.org/W6621187288; https://openalex.org/W6633942408; https://openalex.org/W6634768567; https://openalex.org/W6675164879; https://openalex.org/W7014238125; https://openalex.org/W7027486164,Sustainability Science Practice and Policy,en,False -W2012254774,10.1016/j.worlddev.2003.09.001,An Ecological Footprint Approach to External Debt Relief,2003,,Mariano Torras,A5108671234,Adelphi University (US),Debt; Ecological footprint; External debt; Economics; Scale (ratio); Ecology; Natural resource economics; Macroeconomics; Geography; Sustainability; Biology,debt; ecological-footprint; external-debt; economics; scale; ecology; natural-resource-economics; macroeconomics; geography; sustainability; biology,https://openalex.org/W574631479; https://openalex.org/W1492572403; https://openalex.org/W1500610626; https://openalex.org/W1503706120; https://openalex.org/W1521449382; https://openalex.org/W1578611532; https://openalex.org/W1601422492; https://openalex.org/W1912073849; https://openalex.org/W1968401264; https://openalex.org/W1973176252; https://openalex.org/W1973318389; https://openalex.org/W1975396409; https://openalex.org/W1978430273; https://openalex.org/W1991198037; https://openalex.org/W2007702159; https://openalex.org/W2016989466; https://openalex.org/W2033738926; https://openalex.org/W2038398724; https://openalex.org/W2040211876; https://openalex.org/W2041366075; https://openalex.org/W2045726339; https://openalex.org/W2054046533; https://openalex.org/W2056619110; https://openalex.org/W2077293631; https://openalex.org/W2126212614; https://openalex.org/W2127808655; https://openalex.org/W2146015287; https://openalex.org/W2150406300; https://openalex.org/W2257218250; https://openalex.org/W2261224620; https://openalex.org/W2278324116; https://openalex.org/W2291453814; https://openalex.org/W2587150717; https://openalex.org/W2746485780; https://openalex.org/W2948251683; https://openalex.org/W3006319601; https://openalex.org/W3184353705; https://openalex.org/W4250099039; https://openalex.org/W4285719527; https://openalex.org/W6692146916; https://openalex.org/W6696847344; https://openalex.org/W6759830232; https://openalex.org/W6763176171; https://openalex.org/W6798644758; https://openalex.org/W7027910921,World Development,en,False -W647204147,,An environmental war economy : the lessons of ecological debt and global warming,2001,,Andrew Simms,A5112290444,,Global warming; Debt; Ecology; Geography; Environmental science; Economics; Natural resource economics; Climate change; Macroeconomics; Biology,global-warming; debt; ecology; geography; environmental-science; economics; natural-resource-economics; climate-change; macroeconomics; biology,,OpenGrey (Institut de l'Information Scientifique et Technique),en,False -W2945557658,10.3390/su11102752,"Environmental Homogenization or Heterogenization? The Effects of Globalization on Carbon Dioxide Emissions, 1970–2014",2019,"Globalization significantly influences climate change. Ecological modernization theory and world polity theory suggest that globalization reduces carbon dioxide emissions worldwide by facilitating economic, political, social, and cultural homogenization, whereas ecological unequal exchange theory indicates that cumulative economic and political disparities lead to an uneven distribution of emissions in developed and less developed countries. This study addresses this controversy and systematically investigates the extent to which different dimensions of globalization influence carbon emissions in developed and less developed countries by treating globalization as a dynamic historical process involving economic, political, and social/cultural dimensions in a long-term, cross-national context. Drawing on data for 137 countries from 1970 to 2014, we find that while globalization, social and cultural globalization in particular, has enabled developed countries to significantly decrease their carbon emissions, it has led to more emissions in less developed countries, lending support to the ecological unequal exchange theory. Consistent with world polity theory, international political integration has contributed to carbon reductions over time. We highlight the internal tension between environmental conservation and degradation in a globalizing world and discuss the opportunities for less developed countries to reduce emissions.",Yan Wang; Tao Zhou; Hao Chen; Zhihai Rong,A5100779879; A5090925242; A5112542518; A5082080991,Nankai University (CN); University of Electronic Science and Technology of China (CN); Nankai University (CN); University of Electronic Science and Technology of China (CN),Globalization; Polity; Ecological modernization; Economics; Politics; Economic globalization; Greenhouse gas; Economic system; Development economics; Political science; Market economy; Ecology,globalization; polity; ecological-modernization; economics; politics; economic-globalization; greenhouse-gas; economic-system; development-economics; political-science; market-economy; ecology,https://openalex.org/W265486299; https://openalex.org/W392175924; https://openalex.org/W584301089; https://openalex.org/W619753928; https://openalex.org/W651598703; https://openalex.org/W1490058783; https://openalex.org/W1495220204; https://openalex.org/W1504629721; https://openalex.org/W1504658872; https://openalex.org/W1509008845; https://openalex.org/W1520806764; https://openalex.org/W1527990863; https://openalex.org/W1532443266; https://openalex.org/W1535732848; https://openalex.org/W1541225134; https://openalex.org/W1562678381; https://openalex.org/W1895451490; https://openalex.org/W1905814523; https://openalex.org/W1919782393; https://openalex.org/W1964940275; https://openalex.org/W1966472464; https://openalex.org/W1966605003; https://openalex.org/W1968305520; https://openalex.org/W1973954730; https://openalex.org/W1977714269; https://openalex.org/W1980595917; https://openalex.org/W1983784355; https://openalex.org/W1984190418; https://openalex.org/W1984759356; https://openalex.org/W1984844509; https://openalex.org/W1993740158; https://openalex.org/W1996199418; https://openalex.org/W1997222271; https://openalex.org/W1998601161; https://openalex.org/W2000568622; https://openalex.org/W2001358707; https://openalex.org/W2003629458; https://openalex.org/W2012426895; https://openalex.org/W2014480644; https://openalex.org/W2018225362; https://openalex.org/W2021458480; https://openalex.org/W2021851134; https://openalex.org/W2022220920; https://openalex.org/W2025421307; https://openalex.org/W2027529454; https://openalex.org/W2032899120; https://openalex.org/W2034301206; https://openalex.org/W2036713768; https://openalex.org/W2037088854; https://openalex.org/W2041750432; https://openalex.org/W2048293151; https://openalex.org/W2051421096; https://openalex.org/W2057810683; https://openalex.org/W2066023656; https://openalex.org/W2073716048; https://openalex.org/W2076089921; https://openalex.org/W2078685020; https://openalex.org/W2078807003; https://openalex.org/W2080351687; https://openalex.org/W2087385946; https://openalex.org/W2089248864; https://openalex.org/W2089855706; https://openalex.org/W2091841200; https://openalex.org/W2098470815; https://openalex.org/W2100310745; https://openalex.org/W2101119900; https://openalex.org/W2101498657; https://openalex.org/W2107196054; https://openalex.org/W2108419099; https://openalex.org/W2110278387; https://openalex.org/W2114833267; https://openalex.org/W2114923443; https://openalex.org/W2115328246; https://openalex.org/W2117945141; https://openalex.org/W2118463881; https://openalex.org/W2118924669; https://openalex.org/W2119211517; https://openalex.org/W2126890312; https://openalex.org/W2127329485; https://openalex.org/W2130689244; https://openalex.org/W2130829561; https://openalex.org/W2131222167; https://openalex.org/W2133920545; https://openalex.org/W2136802851; https://openalex.org/W2142043891; https://openalex.org/W2144603483; https://openalex.org/W2145082971; https://openalex.org/W2145987797; https://openalex.org/W2147796004; https://openalex.org/W2151732839; https://openalex.org/W2152256466; https://openalex.org/W2156363664; https://openalex.org/W2156594237; https://openalex.org/W2157115909; https://openalex.org/W2157285565; https://openalex.org/W2158611883; https://openalex.org/W2160934709; https://openalex.org/W2169378432; https://openalex.org/W2170433190; https://openalex.org/W2171918020; https://openalex.org/W2171949063; https://openalex.org/W2182089091; https://openalex.org/W2195484168; https://openalex.org/W2217330188; https://openalex.org/W2274106087; https://openalex.org/W2274762189; https://openalex.org/W2280828964; https://openalex.org/W2288595092; https://openalex.org/W2291058877; https://openalex.org/W2321511225; https://openalex.org/W2322108528; https://openalex.org/W2331134723; https://openalex.org/W2347132681; https://openalex.org/W2473564103; https://openalex.org/W2511414028; https://openalex.org/W2515235557; https://openalex.org/W2588410872; https://openalex.org/W2796817348; https://openalex.org/W3122477235; https://openalex.org/W3122952990; https://openalex.org/W3125639714; https://openalex.org/W4234606244; https://openalex.org/W4236066262; https://openalex.org/W4237176860; https://openalex.org/W4241852105; https://openalex.org/W4242147106; https://openalex.org/W4244280225; https://openalex.org/W4247134726; https://openalex.org/W4248553182; https://openalex.org/W4249225451; https://openalex.org/W4253981452; https://openalex.org/W4300044763; https://openalex.org/W4300351783; https://openalex.org/W4385886409; https://openalex.org/W4385886475; https://openalex.org/W4385886502; https://openalex.org/W6630389085; https://openalex.org/W6725896018,Sustainability,en,False -W2771312157,10.1177/1070496517744593,Decolonizing the Atmosphere: The Climate Justice Movement on Climate Debt,2017,"A central concept raised by the climate justice movement is climate debt. Here, the claims and warrants of the movement support for climate debt is identified through an argumentation analysis of their central manifestos. It is found that the climate debt claim is understood as primarily restorative, in the sense that the environmental space of the developing countries must be returned, “decolonized.” The damage caused by climate change also gives rise to a compensatory adaptation debt. The result is compared with an earlier study on ecological debt. Both concepts are framed within an unjust power relation between North and South, but there are differences. Ecological debt is mainly analyzed in terms of an unjust economic exploitation, which is congenial with its use as an argument for cancellation of Southern external debts; climate debt is rather seen as a violation of communal rights and territories, an argument for climate justice.",Rikard Warlenius,A5020507738,Lund University (SE),Debt; Climate justice; Argument (complex analysis); Economics; Climate change; Economic Justice; Political science; Political economy; Law; Ecology; Macroeconomics,debt; climate-justice; argument; economics; climate-change; economic-justice; political-science; political-economy; law; ecology; macroeconomics,https://openalex.org/W632137373; https://openalex.org/W1514086398; https://openalex.org/W1555942496; https://openalex.org/W1933499598; https://openalex.org/W1973954730; https://openalex.org/W2015411663; https://openalex.org/W2037239387; https://openalex.org/W2039510076; https://openalex.org/W2048051304; https://openalex.org/W2048951262; https://openalex.org/W2103865635; https://openalex.org/W2113214343; https://openalex.org/W2132214484; https://openalex.org/W2137540105; https://openalex.org/W2214644351; https://openalex.org/W2273426814; https://openalex.org/W2319568853; https://openalex.org/W2337292833; https://openalex.org/W2462873503; https://openalex.org/W2472086250; https://openalex.org/W2498551401; https://openalex.org/W2567084427; https://openalex.org/W2578584143; https://openalex.org/W2594382053; https://openalex.org/W2621477277; https://openalex.org/W2994166306; https://openalex.org/W4232387830; https://openalex.org/W4241852105; https://openalex.org/W4285719527,The Journal of Environment & Development,en,False -W1760358764,,"Social Ecography: International Trade, Network Analysis and an Emmanuelian Conceptualization of Ecological Unequal Exchange",2010,"This thesis demonstrates how network analysis, ecological economics and the world-system perspective can be combined into an ecographic framework that can yield new insights into the underlying structure of the world-economy as well as its surrounding world-ecology. In particular, the thesis focuses on the structural theory of ecological unequal exchange, a theory suggesting a relationship between positionality within the world-system and unequal exchange of biophysical resources. Using formal tools from social network analysis, the theory is tested on empirical trade data for two commodity types – primary agricultural goods and fuel commodities – for the period 1995-1999. As the selected commodities can be seen as adequate representations of the third Ricardian production factor, i.e. natural resources, ecological unequal exchange as conceptualized in this thesis is more in line with the original Emmanuelian factor-cost theory than previous approaches. Here, similar to Emmanuel’s formulation, it is a theory about factor cost differentials. Whereas the theory mostly holds true in the case of fuel commodities, the analysis of primary agricultural commodities actually points to an inverse relationship between structural positionality and ecological unequal exchange. This could point to a fundamental difference between these two types of commodities, for instance as reflected in an observed ecological Leontief paradox, which underlines the need for more detailed, and less typological, treatments of ecological unequal exchange.",Carl Nordlund,A5033663242,,Conceptualization; Economics; Commodity; Ecological economics; Ecology; Sustainability; Computer science,conceptualization; economics; commodity; ecological-economics; ecology; sustainability; computer-science,,Lund University Publications (Lund University),en,False -W1598844417,10.4324/9780203094402,Engaging with Climate Change,2012,"Rapley. Foreword. Weintrobe, Preface. Weintrobe, Introduction. Hamilton, What History Can Teach Us About Climate Change Denial. Weintrobe, The Difficult Problem Of Anxiety In Thinking About Climate Change. Lehtonen, Valimaki, Discussion The Environmental Neurosis Of Modern Man: The Illusion Of Autonomy And The Real Dependence Denied. Mause-Hanke, Discussion. Hoggett, Climate Change Denial In A Perverse Culture. Steiner, Discussion. Cohen, Discussion. Hoggett, Reply. Randall, Great Expectations: Some Psychic Consequences Of The Discovery Of Personal Ecological Debt. Rustin, Discussion. Ward, Discussion. Randall, Reply. Lertzman, The Myth Of Apathy. Brenman-Pick, Discussion Not I. Bichard, Discussion How Sustainable Change Agents Can Adopt Psychoanalytic Perspectives On Climate Change. Keene,Unconscious Obstacles To Caring For The Planet. Brearley, Discussion. Hinshelwood, Discussion Goods And Bads. Rustin, How Is Psychoanalysis An Issue For Climate Change? Alexander, Discussion. Benton, Discussion. Rustin, Reply. Weintrobe, On The Love Of Nature And On Human Nature. Crompton, Discussion On Love Of Nature And The Nature Of Love. Hannis, Discussion Nature, Capitalism And Human Flourishing. Harrison, Climate Change, Uncertainty And Risk.",,,,Computer science; Environmental science,computer-science; environmental-science,,,en,False -W2195484168,10.1080/23251042.2015.1114208,Unequal carbon exchanges: understanding pollution embodied in global trade,2015,"We examine carbon emission transfers via trade among countries over a 20-year period. A net transfer of carbon emission means that the emission embodied in a country’s imports exceeds the emission embodied in exports. We consider a number of socio-economic drivers to explain variations in such net transfers across countries. Our findings show a U-shaped curvilinear relationship between countries’ GDP per capita and their net carbon transfer, suggesting that countries are typically heavy net importers of carbon in early phases of economic development, become balanced or even net exporters of carbon in middle stages of development, and then return to being heavy net importers of carbon in later stages of development. We reflect on these findings in the context of ecological modernization (EM) and ecological unequal exchange (EUE) theories, as well as the environmental Kuznets curve (EKC) hypothesis.",Christina Prell; Laixiang Sun,A5037616102; A5041464316,"University of Maryland, College Park (US); University of Maryland, College Park (US)",Kuznets curve; Context (archaeology); Per capita; Economics; Industrialisation; Natural resource economics; Economic growth; Geography; Population,kuznets-curve; context; per-capita; economics; industrialisation; natural-resource-economics; economic-growth; geography; population,https://openalex.org/W564808682; https://openalex.org/W605044516; https://openalex.org/W631285250; https://openalex.org/W638585138; https://openalex.org/W652486963; https://openalex.org/W652794575; https://openalex.org/W1504658872; https://openalex.org/W1511395520; https://openalex.org/W1534847451; https://openalex.org/W1566187841; https://openalex.org/W1590488950; https://openalex.org/W1591166682; https://openalex.org/W1840907900; https://openalex.org/W1965014002; https://openalex.org/W1967879531; https://openalex.org/W1968305520; https://openalex.org/W1970139579; https://openalex.org/W1983474380; https://openalex.org/W1983784355; https://openalex.org/W1984190418; https://openalex.org/W1986325149; https://openalex.org/W1987019268; https://openalex.org/W1992698519; https://openalex.org/W1994450298; https://openalex.org/W1996848963; https://openalex.org/W2006255049; https://openalex.org/W2007436220; https://openalex.org/W2013386523; https://openalex.org/W2018502693; https://openalex.org/W2019199332; https://openalex.org/W2022542406; https://openalex.org/W2024725622; https://openalex.org/W2027529454; https://openalex.org/W2034221877; https://openalex.org/W2036219106; https://openalex.org/W2037088854; https://openalex.org/W2038399826; https://openalex.org/W2039839403; https://openalex.org/W2040342446; https://openalex.org/W2041490855; https://openalex.org/W2041776077; https://openalex.org/W2043357381; https://openalex.org/W2044269414; https://openalex.org/W2047045802; https://openalex.org/W2050986266; https://openalex.org/W2052094794; https://openalex.org/W2056926496; https://openalex.org/W2056944867; https://openalex.org/W2057810683; https://openalex.org/W2061046454; https://openalex.org/W2062797837; https://openalex.org/W2071572611; https://openalex.org/W2072688741; https://openalex.org/W2075510806; https://openalex.org/W2076902169; https://openalex.org/W2080577950; https://openalex.org/W2087759377; https://openalex.org/W2089560544; https://openalex.org/W2093347332; https://openalex.org/W2096317677; https://openalex.org/W2096565435; https://openalex.org/W2112698403; https://openalex.org/W2113153173; https://openalex.org/W2119211517; https://openalex.org/W2122831705; https://openalex.org/W2125388400; https://openalex.org/W2125481562; https://openalex.org/W2126205604; https://openalex.org/W2131554966; https://openalex.org/W2131665065; https://openalex.org/W2136276883; https://openalex.org/W2137775183; https://openalex.org/W2143917121; https://openalex.org/W2148185586; https://openalex.org/W2148732650; https://openalex.org/W2161438705; https://openalex.org/W2162141368; https://openalex.org/W2164703638; https://openalex.org/W2182089091; https://openalex.org/W2201508122; https://openalex.org/W2243371407; https://openalex.org/W2279795386; https://openalex.org/W2288595092; https://openalex.org/W2337659769; https://openalex.org/W2339391629; https://openalex.org/W2578584143; https://openalex.org/W2614181444; https://openalex.org/W3122477235; https://openalex.org/W3124139326; https://openalex.org/W3124532690; https://openalex.org/W3148332745; https://openalex.org/W4242058497; https://openalex.org/W4242216426; https://openalex.org/W4254027994; https://openalex.org/W4300778821,Environmental Sociology,en,False -W2594589186,10.2458/v23i1.20225,Measuring environmental injustice: how ecological debt defines a radical change in the international legal system,2016,"This paper takes ecological debt as a measure of environmental injustice, and appraises this idea as a driving force for change in the international legal system. Environmental justice is understood here as a fair distribution of charges and benefits derived from using natural resources, in order to provide minimal welfare standards to all human beings, including future generations. Ecological debt measures this injustice, as an unfair and illegitimate distribution of benefits and burdens within the social metabolism, including ecologically unequal exchange, as a disproportionate appropriation and impairment of common goods, such as the atmosphere. Structural features of the international system promote a lack of transparency, control and accountability of power, through a pro-growth and pro-freedom language. In theory, this discourse comes with the promise of compensation for ordinary people, but in fact it benefits only a few. Ecological debt, as a symptom of the pervasive injustice of the current balance of power, demands an equivalent response, unravelling and deconstructing real power behind the imagery of equally sovereign states. It claims a counterhegemonic agenda aiming at rebuilding international law from a pluralist, 'third world' or Southern perspective and improving the balance of power. Ecological debt should not only serve as a means of compensation, but as a conceptual definition of an unfair system of human relations, which needs change. It may also help to define the burdens to be assumed as costs for the change required in international relations, i.e. by promoting the constitutionalization of international law and providing appropriate protection to human beings under the paradigms of sustainability (not sustainable development) and equity.",Antoni Pigrau i Solé; Antonio Cardesa Salzmann; Jordi Jaria i Manzano; Susana Borràs Pentinat,A5012821152; A5072650099; A5020697726; A5026396746,Universitat Rovira i Virgili (ES); University of Strathclyde (GB); Universitat Rovira i Virgili (ES); Universitat Rovira i Virgili (ES),Injustice; Appropriation; Environmental justice; Human rights; Sustainable development; Environmental law; Debt; Law and economics; Economics; Political science; Law; Finance,injustice; appropriation; environmental-justice; human-rights; sustainable-development; environmental-law; debt; law-and-economics; economics; political-science; law; finance,https://openalex.org/W6418695; https://openalex.org/W393785938; https://openalex.org/W614736872; https://openalex.org/W654027561; https://openalex.org/W756773437; https://openalex.org/W1121996343; https://openalex.org/W1248118106; https://openalex.org/W1509463507; https://openalex.org/W1535393865; https://openalex.org/W1587294828; https://openalex.org/W1589361174; https://openalex.org/W1684472600; https://openalex.org/W1799887369; https://openalex.org/W1907583418; https://openalex.org/W1965253625; https://openalex.org/W1992461584; https://openalex.org/W2027802007; https://openalex.org/W2046173547; https://openalex.org/W2070333231; https://openalex.org/W2082018652; https://openalex.org/W2087694774; https://openalex.org/W2087992692; https://openalex.org/W2094520873; https://openalex.org/W2104519673; https://openalex.org/W2119590495; https://openalex.org/W2159289211; https://openalex.org/W2167382412; https://openalex.org/W2319568853; https://openalex.org/W2336527297; https://openalex.org/W2339685604; https://openalex.org/W2395851320; https://openalex.org/W2481067057; https://openalex.org/W2567118993; https://openalex.org/W2594243269; https://openalex.org/W2736628311; https://openalex.org/W2799975152; https://openalex.org/W2806647172; https://openalex.org/W2978374962; https://openalex.org/W3121349663; https://openalex.org/W3123409510; https://openalex.org/W3125314127; https://openalex.org/W3159280209; https://openalex.org/W3211177043; https://openalex.org/W4233566767; https://openalex.org/W4244209322; https://openalex.org/W4249578445; https://openalex.org/W4254835415; https://openalex.org/W4299402866; https://openalex.org/W6627316930; https://openalex.org/W6633206287; https://openalex.org/W6635261573; https://openalex.org/W6660154277; https://openalex.org/W6676331168; https://openalex.org/W6740903121; https://openalex.org/W6751054145; https://openalex.org/W6755130354; https://openalex.org/W6803608743; https://openalex.org/W6820768008; https://openalex.org/W6820861918; https://openalex.org/W6986524961; https://openalex.org/W7056187441,Journal of Political Ecology,en,False -W4240411357,10.1007/978-3-030-29901-9_27,Ecological Unequal Exchange,2021,,Jan O. Andersson,A5070191512,Åbo Akademi University (FI),Ecology; Geography; Biology,ecology; geography; biology,https://openalex.org/W651598703; https://openalex.org/W1484177660; https://openalex.org/W1551322995; https://openalex.org/W1616101857; https://openalex.org/W1738944162; https://openalex.org/W1970139579; https://openalex.org/W1988324589; https://openalex.org/W1990164247; https://openalex.org/W2002269579; https://openalex.org/W2013402297; https://openalex.org/W2024828896; https://openalex.org/W2025874583; https://openalex.org/W2026865785; https://openalex.org/W2033186995; https://openalex.org/W2036713768; https://openalex.org/W2052630221; https://openalex.org/W2057002878; https://openalex.org/W2099161992; https://openalex.org/W2115070437; https://openalex.org/W2119211517; https://openalex.org/W2267106946; https://openalex.org/W2291058877; https://openalex.org/W2324550751; https://openalex.org/W2347141676; https://openalex.org/W2480022570; https://openalex.org/W2559805026; https://openalex.org/W2605728354; https://openalex.org/W2607635248; https://openalex.org/W2618067250; https://openalex.org/W2753417580; https://openalex.org/W3123592998; https://openalex.org/W4211244051; https://openalex.org/W6616702184; https://openalex.org/W6639620335; https://openalex.org/W6694662396; https://openalex.org/W7042237278,,en,False -W4255108584,10.1007/978-3-319-91206-6_27-1,Ecological Unequal Exchange,2019,,Jan O. Andersson,A5070191512,Åbo Akademi University (FI),Ecology; Environmental science; Geography; Biology,ecology; environmental-science; geography; biology,https://openalex.org/W651598703; https://openalex.org/W1484177660; https://openalex.org/W1551322995; https://openalex.org/W1616101857; https://openalex.org/W1738944162; https://openalex.org/W1970139579; https://openalex.org/W1988324589; https://openalex.org/W1990164247; https://openalex.org/W2002269579; https://openalex.org/W2013402297; https://openalex.org/W2024828896; https://openalex.org/W2025874583; https://openalex.org/W2026865785; https://openalex.org/W2033186995; https://openalex.org/W2036713768; https://openalex.org/W2052630221; https://openalex.org/W2057002878; https://openalex.org/W2099161992; https://openalex.org/W2115070437; https://openalex.org/W2119211517; https://openalex.org/W2267106946; https://openalex.org/W2291058877; https://openalex.org/W2324550751; https://openalex.org/W2347141676; https://openalex.org/W2480022570; https://openalex.org/W2559805026; https://openalex.org/W2605728354; https://openalex.org/W2607635248; https://openalex.org/W2618067250; https://openalex.org/W2753417580; https://openalex.org/W3123592998; https://openalex.org/W4211244051; https://openalex.org/W6616702184; https://openalex.org/W6639620335; https://openalex.org/W6694662396; https://openalex.org/W7042237278,,en,False -W4387873668,10.4337/9781802200416.ch23,Ecological unequal exchange,2023,"Ecological Unequal Exchange (EUE) arises from Ecological Economics concerns about issues of distributional environmental equity between countries as a result of international trade (IT). EUE shows that IT is asymmetric not only in economic but also in ecological terms. This asymmetry especially affects Southern countries that specialise in extracting and exporting raw materials. And it favours Northern countries that produce and export capital- and knowledge-intensive goods. Identifying EUE requires consideration of the biophysical aspects of production, transport, and consumption, where the Second Law of Thermodynamics is essential. The inverse relationship between the biophysical value of natural resources and their economic valuation is what enables the metabolism of society in its global organisation. The price differential resulting from this relationship, supported by an asymmetric power structure at the international level, allows industrialised countries to obtain the energy available for their metabolic functioning, and the unequal exchange and ecological deterioration in the countries of the South are the most obvious results.",Mario Alejandro Pérez Rincón,A5006382147,,Economics; Equity (law); Valuation (finance); Natural resource economics; Ecology; Ecological economics; Consumption (sociology); Sustainability; Political science; Biology,economics; equity; valuation; natural-resource-economics; ecology; ecological-economics; consumption; sustainability; political-science; biology,,Edward Elgar Publishing eBooks,en,False -W2117633894,10.1080/01436590802622987,"Contemporary Contradictions of the Global Development Project: geopolitics, global ecology and the ‘development climate’",2009,"Abstract The global development project faces newly evident challenges in the combination of energy, climate and food crises. Their interrelationships create a powerful moment in world history in which analysts and practitioners grope for solutions, limited by the narrow market episteme. This contribution argues that official development, in advocating green market solutions, recycles the problem as solution—a problem rooted in the geopolitics of an unsustainable global ‘metabolic rift’ and a discourse of global ecology reinforcing international power relations through monetary valuation, and deepening the North's ‘ecological debt’.",Philip McMichael,A5077240588,Cornell University (US),Geopolitics; Climate change; Global warming; Ecology; International development; Political science; Economics; Sociology; Economic growth; Biology; Law; Politics,geopolitics; climate-change; global-warming; ecology; international-development; political-science; economics; sociology; economic-growth; biology; law; politics,https://openalex.org/W3159280209,Third World Quarterly,en,False -W2321511225,10.1016/j.socnet.2016.03.001,The evolution of global trade and impacts on countries’ carbon trade imbalances,2016,,Christina Prell; Kuishuang Feng,A5037616102; A5049493168,"University of Maryland, College Park (US); University of Maryland, College Park (US)",Economics; Context (archaeology); International economics; Gravity model of trade; Carbon fibers; Trade barrier; International trade; Computer science; Geography,economics; context; international-economics; gravity-model-of-trade; carbon-fibers; trade-barrier; international-trade; computer-science; geography,https://openalex.org/W31487802; https://openalex.org/W244587596; https://openalex.org/W286295083; https://openalex.org/W291831081; https://openalex.org/W570362212; https://openalex.org/W582090430; https://openalex.org/W605044516; https://openalex.org/W610187120; https://openalex.org/W1493472778; https://openalex.org/W1504658872; https://openalex.org/W1520463711; https://openalex.org/W1533643283; https://openalex.org/W1535196592; https://openalex.org/W1591166682; https://openalex.org/W1968342703; https://openalex.org/W1969128202; https://openalex.org/W1970139579; https://openalex.org/W1973749534; https://openalex.org/W1976868072; https://openalex.org/W1983716515; https://openalex.org/W1986325149; https://openalex.org/W1987458928; https://openalex.org/W1989968173; https://openalex.org/W1996848963; https://openalex.org/W2006255049; https://openalex.org/W2007080465; https://openalex.org/W2011049045; https://openalex.org/W2013386523; https://openalex.org/W2014480644; https://openalex.org/W2020829974; https://openalex.org/W2022542406; https://openalex.org/W2041490855; https://openalex.org/W2041786698; https://openalex.org/W2044269414; https://openalex.org/W2054166232; https://openalex.org/W2055325415; https://openalex.org/W2056926496; https://openalex.org/W2057222804; https://openalex.org/W2057810683; https://openalex.org/W2059368404; https://openalex.org/W2062797837; https://openalex.org/W2067793019; https://openalex.org/W2071572611; https://openalex.org/W2073562966; https://openalex.org/W2073916725; https://openalex.org/W2074724691; https://openalex.org/W2076881948; https://openalex.org/W2099699569; https://openalex.org/W2099815494; https://openalex.org/W2100194699; https://openalex.org/W2113153173; https://openalex.org/W2119211517; https://openalex.org/W2120104040; https://openalex.org/W2122465344; https://openalex.org/W2122831705; https://openalex.org/W2125481562; https://openalex.org/W2135622701; https://openalex.org/W2139310104; https://openalex.org/W2143893259; https://openalex.org/W2145251530; https://openalex.org/W2145917034; https://openalex.org/W2146527895; https://openalex.org/W2148732650; https://openalex.org/W2160268549; https://openalex.org/W2160508096; https://openalex.org/W2163362767; https://openalex.org/W2164703638; https://openalex.org/W2184625852; https://openalex.org/W2194406924; https://openalex.org/W2201508122; https://openalex.org/W2207225886; https://openalex.org/W2212083538; https://openalex.org/W2262220628; https://openalex.org/W2262759381; https://openalex.org/W2284583324; https://openalex.org/W2288595092; https://openalex.org/W2337659769; https://openalex.org/W2475644619; https://openalex.org/W2564098583; https://openalex.org/W2578584143; https://openalex.org/W2607554261; https://openalex.org/W2800079351; https://openalex.org/W2806566552; https://openalex.org/W2902911166; https://openalex.org/W3122661090; https://openalex.org/W3122821355; https://openalex.org/W3124139326; https://openalex.org/W3124405280; https://openalex.org/W3126109796; https://openalex.org/W4301620991; https://openalex.org/W4302354913; https://openalex.org/W6601281690; https://openalex.org/W6631606621; https://openalex.org/W6680968406; https://openalex.org/W6686669974; https://openalex.org/W6687811615; https://openalex.org/W6695537366,Social Networks,en,False -W91194789,,Ecological Debt and Historical Responsibility Revisited: The case of climate change,2012,"In spite of its strong appeal to NGOs, to certain governments and to some scholars, the concept of an ecological debt accumulated by developed countries due to their historical responsibility deserve a serious critical assessment. The paper provides this assessment in the context of climate change. It first shows how the rhetoric of ecological debt exploits confusion between a pre-modern concept of social debt and the modern one based on the contract figure. Two components of the climate debt are examined: a presumed duty of compensation of the damage imposed by climate change and rules of sharing out of atmospheric services when developed countries are presumed to have emitted GHGs in the past in excess of their fair share. The discussion considers successively the legal and the moral viewpoint. A review of arguments shows that both concepts of ecological debt and historical responsibility disintegrate under scrutiny in the case of climate change, as ill-founded backward-looking reparative concepts as well as additional obstacles to a forward-looking agreement in which responsibilities could legitimately be differentiated according to various variables referring to current states (emissions levels, needs, capacities, etc.). The GHGs emissions that cause problems are those that have taken place since 1990.",Olivier Godard,A5070222969,,Debt; Scrutiny; Greenhouse gas; Climate change; Context (archaeology); Duty; Moral responsibility; Appeal; Damages; Political science; Environmental ethics; Economics; Ecology; Geography; Law; Finance,debt; scrutiny; greenhouse-gas; climate-change; context; duty; moral-responsibility; appeal; damages; political-science; environmental-ethics; economics; ecology; geography; law; finance,https://openalex.org/W203693828; https://openalex.org/W260890562; https://openalex.org/W1169467774; https://openalex.org/W1488923419; https://openalex.org/W1512230970; https://openalex.org/W1519919466; https://openalex.org/W1555168770; https://openalex.org/W1566890474; https://openalex.org/W1593021046; https://openalex.org/W1756467313; https://openalex.org/W1772647737; https://openalex.org/W1781292848; https://openalex.org/W1955391275; https://openalex.org/W1971654441; https://openalex.org/W1974609519; https://openalex.org/W1998111534; https://openalex.org/W2002863535; https://openalex.org/W2012254774; https://openalex.org/W2013531215; https://openalex.org/W2030602370; https://openalex.org/W2058103174; https://openalex.org/W2073139884; https://openalex.org/W2092548441; https://openalex.org/W2103865635; https://openalex.org/W2118777456; https://openalex.org/W2126416729; https://openalex.org/W2126588792; https://openalex.org/W2128207432; https://openalex.org/W2131740028; https://openalex.org/W2157555752; https://openalex.org/W2159167826; https://openalex.org/W2290283773; https://openalex.org/W2336434939; https://openalex.org/W2510803780; https://openalex.org/W2527769517; https://openalex.org/W3121653486; https://openalex.org/W3123930679; https://openalex.org/W3124082720; https://openalex.org/W3124417004; https://openalex.org/W3159280209,Cadmus - EUI Research Repository (European University Institute),en,False -W2788955535,10.1016/j.ecolecon.2018.01.030,Modelling Multi-regional Ecological Exchanges: The Case of UK and Africa,2018,,Eunice Oppon; Adolf Acquaye; Taofeeq Ibn‐Mohammed; Lenny Koh,A5010245794; A5032608262; A5091745047; A5079714997,University of Sheffield (GB); University of Kent (GB); University of Sheffield (GB); University of Sheffield (GB),Poverty; Developing country; Goods and services; Natural resource economics; Economics; Ecosystem services; Work (physics); Business; Environmental resource management; Ecology; Economic growth; Economy; Ecosystem,poverty; developing-country; goods-and-services; natural-resource-economics; economics; ecosystem-services; work; business; environmental-resource-management; ecology; economic-growth; economy; ecosystem,https://openalex.org/W88898997; https://openalex.org/W97188817; https://openalex.org/W222914877; https://openalex.org/W1493472778; https://openalex.org/W1511877300; https://openalex.org/W1533063787; https://openalex.org/W1586936537; https://openalex.org/W1820544219; https://openalex.org/W1965592156; https://openalex.org/W1966605003; https://openalex.org/W1970139579; https://openalex.org/W1973954730; https://openalex.org/W1984190418; https://openalex.org/W1986552857; https://openalex.org/W1987458928; https://openalex.org/W1995968610; https://openalex.org/W1998804088; https://openalex.org/W1999009515; https://openalex.org/W2004010203; https://openalex.org/W2007080465; https://openalex.org/W2010101976; https://openalex.org/W2012011920; https://openalex.org/W2017760134; https://openalex.org/W2020297434; https://openalex.org/W2020374898; https://openalex.org/W2024725622; https://openalex.org/W2030517974; https://openalex.org/W2032167419; https://openalex.org/W2041490855; https://openalex.org/W2044269414; https://openalex.org/W2045987553; https://openalex.org/W2051808875; https://openalex.org/W2060603126; https://openalex.org/W2068856199; https://openalex.org/W2086977164; https://openalex.org/W2093219469; https://openalex.org/W2095019212; https://openalex.org/W2096314897; https://openalex.org/W2103536707; https://openalex.org/W2105414963; https://openalex.org/W2113219607; https://openalex.org/W2113414401; https://openalex.org/W2119211517; https://openalex.org/W2125390913; https://openalex.org/W2128405303; https://openalex.org/W2137775183; https://openalex.org/W2153118634; https://openalex.org/W2162141368; https://openalex.org/W2163045437; https://openalex.org/W2164703638; https://openalex.org/W2166807870; https://openalex.org/W2167785727; https://openalex.org/W2170273768; https://openalex.org/W2274330233; https://openalex.org/W2315103963; https://openalex.org/W2342456945; https://openalex.org/W2460243609; https://openalex.org/W2549877311; https://openalex.org/W2557126631; https://openalex.org/W2564956283; https://openalex.org/W2765557092; https://openalex.org/W3094249809; https://openalex.org/W6608882148; https://openalex.org/W6704186375; https://openalex.org/W6745755860,Ecological Economics,en,False -W2066023656,10.4337/9781843768593,The International Handbook of Environmental Sociology,1997,"Contents: Introduction Graham Woodgate PART I: CONCEPTS AND THEORIES IN ENVIRONMENTAL SOCIOLOGY Editorial Commentary Graham Woodgate 1. The Maturation and Diversification of Environmental Sociology: From Constructivism and Realism to Agnosticism and Pragmatism Riley E. Dunlap 2. Social Institutions and Environmental Change Frederick H. Buttel 3. From Environment Sociology to Global Ecosociology: The Dunlap - Buttel Debates Jean-Guy Vaillancourt 4. Ecological Modernization as a Social Theory of Environmental Reform Arthur P.J. Mol 5. Ecological Modernization Theory: Theoretical and Empirical Challenges Richard York, Eugene A. Rosa and Thomas Dietz 6. Postconstructivist Political Ecologies Arturo Escobar 7. Marx's Ecology and its Historical Significance John Bellamy Foster 8. The Transition Out of Carbon Dependence: The Crises of Environment and Markets Michael R. Redclift 9. Socio-ecological Agency: From 'Human Exceptionalism' to Coping with 'Exceptional' Global Environmental Change David Manuel-Navarrete and Christine N. Buzinde 10. Ecological Debt: An Integrating Concept for Socio-Environmental Change Inaki Barcena Hinojal and Rosa Lago Aurrekoetxea 11. The Emergence Model of Environment and Society John Hannigan 12. Peering into the Abyss: Environment, Research and Absurdity in the 'Age of Stupid' Raymond L. Bryant PART II: SUBSTANTIVE ISSUES FOR ENVIRONMENTAL SOCIOLOGY Editorial Commentary Graham Woodgate 13. Animals and Us Ted Benton 14. Science and the Environment in the Twenty-first Century Steven Yearley 15. New Challenges for Twenty-first Century Environmental Movements: Agricultural Biotechnology and Nanotechnology Maria Kousis 16. Sustainable Consumption: Developments, Considerations and New Directions Emma D. Hinton and Michael K. Goodman 17. Globalisation, Convergence and the Euro-Atlantic Development Model Wolfgang Sachs 18. Environmental Hazards and Human Disasters Raymond Murphy 19. Structural Obstacles to an Effective Post-2012 Global Climate Agreement: Why Social Structure Matters and How Addressing it Can Help Break the Impasse Bradley C. Parks and J. Timmons Roberts 20. Environmental Sociology and International Forestry: Historical Overview and Future Directions Bianca Ambrose-Oji PART III: INTERNATIONAL PERSPECTIVES ON ENVIRONMENT AND SOCIETY Editorial Commentary Graham Woodgate 21. The Role of Place in the Margins of Space David Manuel-Navarrete and Michael R. Redclift 22. Society, Environment and Development in Africa William M. Adams 23. Neoliberal Regimes of Environmental Governance: Climate Change, Biodiversity and Agriculture in Australia Stewart Lockie 24. Environmental Reform in Modernizing China Arthur P.J. Mol 25. Civic Engagement in Environmental Governance in Central and Eastern Europe JoAnn Carmin 26. A 'Sustaining Conservation' for Mexico? Nora Haenn Index",Michael Redclift; Graham Woodgate,A5059724271; A5065950333,,Sociology; Environmental sociology; Regional science; Social science,sociology; environmental-sociology; regional-science; social-science,https://openalex.org/W1538243852; https://openalex.org/W2009872045; https://openalex.org/W2062199894; https://openalex.org/W2093955358; https://openalex.org/W2318735428; https://openalex.org/W2906689523,Edward Elgar Publishing eBooks,en,False -W2980187407,,Preceding and governing measurements : an Emmanuelian conceptualization of ecological unequal exchange,2014,Preceding and governing measurements : an Emmanuelian conceptualization of ecological unequal exchange,Carl Nordlund,A5033663242,,Conceptualization; Ecology; Computer science; Biology; Artificial intelligence,conceptualization; ecology; computer-science; biology; artificial-intelligence,https://openalex.org/W94815793; https://openalex.org/W205206750; https://openalex.org/W592075714; https://openalex.org/W607313397; https://openalex.org/W619768729; https://openalex.org/W647037346; https://openalex.org/W651598703; https://openalex.org/W657044929; https://openalex.org/W1484903358; https://openalex.org/W1507577644; https://openalex.org/W1509006868; https://openalex.org/W1538980473; https://openalex.org/W1597769549; https://openalex.org/W1687549561; https://openalex.org/W1720817898; https://openalex.org/W1780160121; https://openalex.org/W1873550992; https://openalex.org/W1964725364; https://openalex.org/W1966605003; https://openalex.org/W1968441806; https://openalex.org/W1973660359; https://openalex.org/W1974075073; https://openalex.org/W1976412347; https://openalex.org/W1983474380; https://openalex.org/W1983716515; https://openalex.org/W1985596098; https://openalex.org/W1986552857; https://openalex.org/W1990164247; https://openalex.org/W2004388900; https://openalex.org/W2006081504; https://openalex.org/W2008134822; https://openalex.org/W2013402297; https://openalex.org/W2020935901; https://openalex.org/W2026865785; https://openalex.org/W2029425243; https://openalex.org/W2030674088; https://openalex.org/W2031736557; https://openalex.org/W2033186995; https://openalex.org/W2040057718; https://openalex.org/W2048034272; https://openalex.org/W2056926496; https://openalex.org/W2057810683; https://openalex.org/W2057931959; https://openalex.org/W2061901927; https://openalex.org/W2061916247; https://openalex.org/W2072688741; https://openalex.org/W2075693476; https://openalex.org/W2080577950; https://openalex.org/W2087385946; https://openalex.org/W2091709473; https://openalex.org/W2091732022; https://openalex.org/W2100618934; https://openalex.org/W2108429164; https://openalex.org/W2115328246; https://openalex.org/W2119211517; https://openalex.org/W2121841211; https://openalex.org/W2122831705; https://openalex.org/W2123393732; https://openalex.org/W2130289872; https://openalex.org/W2131524001; https://openalex.org/W2133011836; https://openalex.org/W2142043891; https://openalex.org/W2163308020; https://openalex.org/W2166561932; https://openalex.org/W2169085616; https://openalex.org/W2169776575; https://openalex.org/W2184625852; https://openalex.org/W2186681442; https://openalex.org/W2226489716; https://openalex.org/W2230443023; https://openalex.org/W2237618063; https://openalex.org/W2318867465; https://openalex.org/W2328416860; https://openalex.org/W2789951941; https://openalex.org/W3121753494,,en,False -W2999036754,10.1073/pnas.1910023117,Land-use history impacts functional diversity across multiple trophic groups,2020,"Land-use change is a major driver of biodiversity loss worldwide. Although biodiversity often shows a delayed response to land-use change, previous studies have typically focused on a narrow range of current landscape factors and have largely ignored the role of land-use history in shaping plant and animal communities and their functional characteristics. Here, we used a unique database of 220,000 land-use records to investigate how 20-y of land-use changes have affected functional diversity across multiple trophic groups (primary producers, mutualists, herbivores, invertebrate predators, and vertebrate predators) in 75 grassland fields with a broad range of land-use histories. The effects of land-use history on multitrophic trait diversity were as strong as other drivers known to impact biodiversity, e.g., grassland management and current landscape composition. The diversity of animal mobility and resource-acquisition traits was lower in landscapes where much of the land had been historically converted from grassland to crop. In contrast, functional biodiversity was higher in landscapes containing old permanent grasslands, most likely because they offer a stable and high-quality habitat refuge for species with low mobility and specialized feeding niches. Our study shows that grassland-to-crop conversion has long-lasting impacts on the functional biodiversity of agricultural ecosystems. Accordingly, land-use legacy effects must be considered in conservation programs aiming to protect agricultural biodiversity. In particular, the retention of permanent grassland sanctuaries within intensive landscapes may offset ecological debts.",Gaëtane Le Provost; Isabelle Badenhausser; Yoann Le Bagousse‐Pinguet; Yann Clough; Laura Henckel; Cyrille Violle; Vincent Bretagnolle; Marilyn Roncoroni; Peter Manning; Nicolas Gross,A5062110875; A5087152591; A5075472835; A5057350038; A5075950463; A5073523465; A5011716970; A5017649985; A5003868914; A5085089162,"Centre National de la Recherche Scientifique (FR); Senckenberg - Leibniz Institution for Biodiversity and Earth System Research (DE); Institut National de Recherche pour l'Agriculture, l'Alimentation et l'Environnement (FR); Centre d'Etudes Biologiques de Chizé (FR); Senckenberg Biodiversity and Climate Research Centre (DE); La Rochelle Université (FR); Centre National de la Recherche Scientifique (FR); Institut National de Recherche pour l'Agriculture, l'Alimentation et l'Environnement (FR); Centre d'Etudes Biologiques de Chizé (FR); Unité de Recherche Pluridisciplinaire Prairies et Plantes Fourragères (FR); La Rochelle Université (FR); Centre National de la Recherche Scientifique (FR); Institut Méditerranéen de Biodiversité et d'Ecologie Marine et Continentale (FR); Institut de Recherche pour le Développement (FR); Lund University (SE); Centre National de la Recherche Scientifique (FR); Swedish University of Agricultural Sciences (SE); Institut National de Recherche pour l'Agriculture, l'Alimentation et l'Environnement (FR); Centre d'Etudes Biologiques de Chizé (FR); Swedish Species Information Centre (SE); La Rochelle Université (FR); Centre National de la Recherche Scientifique (FR); École Pratique des Hautes Études (FR); Université de Montpellier (FR); Institut de Recherche pour le Développement (FR); Centre National de la Recherche Scientifique (FR); Centre d'Etudes Biologiques de Chizé (FR); La Rochelle Université (FR); Centre National de la Recherche Scientifique (FR); Institut National de Recherche pour l'Agriculture, l'Alimentation et l'Environnement (FR); Centre d'Etudes Biologiques de Chizé (FR); La Rochelle Université (FR); Senckenberg - Leibniz Institution for Biodiversity and Earth System Research (DE); Senckenberg Biodiversity and Climate Research Centre (DE); Université Clermont Auvergne (FR); Institut National de Recherche pour l'Agriculture, l'Alimentation et l'Environnement (FR); VetAgro Sup (FR)","Biodiversity; Ecology; Land use; Grassland; Trophic level; Geography; Habitat; Agroforestry; Land use, land-use change and forestry; Biodiversity hotspot; Agricultural land; Habitat destruction; Ecosystem services; Ecosystem; Biology",biodiversity; ecology; land-use; grassland; trophic-level; geography; habitat; agroforestry; land-use-land-use-change-and-forestry; biodiversity-hotspot; agricultural-land; habitat-destruction; ecosystem-services; ecosystem; biology,https://openalex.org/W1571840503; https://openalex.org/W1575330260; https://openalex.org/W1609810996; https://openalex.org/W1840185503; https://openalex.org/W1929835448; https://openalex.org/W1965701022; https://openalex.org/W1977909820; https://openalex.org/W1987431381; https://openalex.org/W1999205818; https://openalex.org/W2002615685; https://openalex.org/W2003236917; https://openalex.org/W2004909198; https://openalex.org/W2034563189; https://openalex.org/W2037902495; https://openalex.org/W2047384175; https://openalex.org/W2056280096; https://openalex.org/W2100773609; https://openalex.org/W2105156559; https://openalex.org/W2107665951; https://openalex.org/W2109274990; https://openalex.org/W2110065044; https://openalex.org/W2114795157; https://openalex.org/W2117867889; https://openalex.org/W2124478410; https://openalex.org/W2132272855; https://openalex.org/W2133311386; https://openalex.org/W2149301124; https://openalex.org/W2155157807; https://openalex.org/W2155430569; https://openalex.org/W2167094923; https://openalex.org/W2472420705; https://openalex.org/W2510103516; https://openalex.org/W2515058020; https://openalex.org/W2558519551; https://openalex.org/W2590280115; https://openalex.org/W2605879233; https://openalex.org/W2786039766; https://openalex.org/W2799896813; https://openalex.org/W2803418977; https://openalex.org/W2896211727; https://openalex.org/W2926255641; https://openalex.org/W2938463896; https://openalex.org/W2966436668; https://openalex.org/W2966589851; https://openalex.org/W3105481948; https://openalex.org/W3189621076; https://openalex.org/W6920670411,Proceedings of the National Academy of Sciences,en,False -W147127987,10.5195/jwsr.2015.529,"Breaking Ships in the World-System: An Analysis of Two Ship Breaking Capitals, Alang-Sosiya, India and Chittagong, Bangladesh",2015,"Centrality in the world-system allows countries to externalize their hazards or environmental harms on others. Core countries, for instance, dump heavy metals and greenhouse gases into the global sinks, and some of the core's hazardous products, production processes and wastes are displaced to the (semi) peripheral zones of the world-system. Since few (semi) peripheral countries have the ability to assess and manage the risks associated with such hazards, the transfer of core hazards to the (semi) periphery has adverse environmental and socio-economic consequences for many of these countries and it has spawned conflict and resistance, as well as a variety of other responses. Most discussions of this risk globalization problem have failed to situate it firmly in the world-system frame emphasizing the process of ecological unequal exchange. Using secondary sources, I begin such a discussion by examining the specific problem of ship breaking (recycling core-based ocean going vessels for steel and other materials) at the yards in Alang-Sosiya, India and Chittagong, Bangladesh. Attention centers on the nature and scope of ship breaking in these two locations, major drivers operating in the world-system, adverse consequences, the unequal mix of costs and benefits, and the failure of existing political responses at the domestic and international levels to reduce adequately the adverse consequences of ship breaking.",R. Scott Frey,A5084438873,University of Tennessee at Knoxville (US),Environmental hazard; Development economics; Business; Engineering; Natural resource economics; Environmental planning; Environmental protection; Geography; Economics; Ecology,environmental-hazard; development-economics; business; engineering; natural-resource-economics; environmental-planning; environmental-protection; geography; economics; ecology,https://openalex.org/W42362159; https://openalex.org/W76548049; https://openalex.org/W80867919; https://openalex.org/W165365298; https://openalex.org/W356139667; https://openalex.org/W370890276; https://openalex.org/W562385678; https://openalex.org/W576583604; https://openalex.org/W585808560; https://openalex.org/W586618947; https://openalex.org/W619831140; https://openalex.org/W1491531314; https://openalex.org/W1502624808; https://openalex.org/W1514279324; https://openalex.org/W1524520169; https://openalex.org/W1526407077; https://openalex.org/W1531882100; https://openalex.org/W1531974919; https://openalex.org/W1541482107; https://openalex.org/W1547552412; https://openalex.org/W1570612162; https://openalex.org/W1572762085; https://openalex.org/W1579803630; https://openalex.org/W1588550464; https://openalex.org/W1591166682; https://openalex.org/W1602775671; https://openalex.org/W1607409573; https://openalex.org/W1914921294; https://openalex.org/W1963697600; https://openalex.org/W1964310327; https://openalex.org/W1965633248; https://openalex.org/W1971800003; https://openalex.org/W1973417601; https://openalex.org/W1980314759; https://openalex.org/W1986435662; https://openalex.org/W1997312490; https://openalex.org/W1997466867; https://openalex.org/W1997912364; https://openalex.org/W2013091981; https://openalex.org/W2013402297; https://openalex.org/W2015031013; https://openalex.org/W2019093495; https://openalex.org/W2021001691; https://openalex.org/W2025718926; https://openalex.org/W2026597243; https://openalex.org/W2027529454; https://openalex.org/W2030674088; https://openalex.org/W2040342446; https://openalex.org/W2043201903; https://openalex.org/W2048293151; https://openalex.org/W2049611326; https://openalex.org/W2054113825; https://openalex.org/W2054525842; https://openalex.org/W2056526392; https://openalex.org/W2056926496; https://openalex.org/W2061660593; https://openalex.org/W2061916247; https://openalex.org/W2062199894; https://openalex.org/W2074115438; https://openalex.org/W2075340793; https://openalex.org/W2076007148; https://openalex.org/W2078583896; https://openalex.org/W2080458794; https://openalex.org/W2083193007; https://openalex.org/W2086769519; https://openalex.org/W2097737947; https://openalex.org/W2099990298; https://openalex.org/W2100231337; https://openalex.org/W2102618055; https://openalex.org/W2102668013; https://openalex.org/W2104935650; https://openalex.org/W2109111177; https://openalex.org/W2119106412; https://openalex.org/W2119211517; https://openalex.org/W2124565737; https://openalex.org/W2126547557; https://openalex.org/W2128169869; https://openalex.org/W2130441850; https://openalex.org/W2131621631; https://openalex.org/W2134506903; https://openalex.org/W2136134260; https://openalex.org/W2148732650; https://openalex.org/W2149022830; https://openalex.org/W2152976252; https://openalex.org/W2155895810; https://openalex.org/W2160797101; https://openalex.org/W2169385286; https://openalex.org/W2170219305; https://openalex.org/W2182089091; https://openalex.org/W2185907665; https://openalex.org/W2199190077; https://openalex.org/W2201508122; https://openalex.org/W2202864547; https://openalex.org/W2215504314; https://openalex.org/W2253709277; https://openalex.org/W2477738313; https://openalex.org/W2492032746; https://openalex.org/W2578584143; https://openalex.org/W2737078647; https://openalex.org/W2806988935; https://openalex.org/W2891423662; https://openalex.org/W2905180499; https://openalex.org/W2907664459; https://openalex.org/W2945273314; https://openalex.org/W2975405677; https://openalex.org/W3022828466; https://openalex.org/W3024309230; https://openalex.org/W3122477235; https://openalex.org/W3122661090; https://openalex.org/W3125166879; https://openalex.org/W3125379867; https://openalex.org/W3159280209; https://openalex.org/W3213090436; https://openalex.org/W4205870317; https://openalex.org/W4229570833; https://openalex.org/W4244108096; https://openalex.org/W4250340634; https://openalex.org/W4285719527; https://openalex.org/W4299475623; https://openalex.org/W4300550956; https://openalex.org/W4301378955; https://openalex.org/W4319588009; https://openalex.org/W4389266611; https://openalex.org/W4405224716; https://openalex.org/W6603117862; https://openalex.org/W6643473431; https://openalex.org/W6655074950; https://openalex.org/W6656842085; https://openalex.org/W6677619370; https://openalex.org/W6679465770; https://openalex.org/W6688080868; https://openalex.org/W6723228808; https://openalex.org/W7037423374; https://openalex.org/W7051802513,Journal of World-Systems Research,en,False -W2119904838,10.1080/09644016.2015.1090370,Unpacking the politics of natural capital and economic metaphors in environmental policy discourse,2015,"Economic metaphors – including natural capital, natural assets, ecosystem services, and ecological debt – are becoming commonplace in environmental policy discourse. Proponents consider such terms provide a clearer idea of the ‘value’ of nature, and are useful for ensuring the environment is given due attention in decision making. Critical discourse analysis highlights the ideological work language does; the way in which we think, write, and talk about the environment has important implications for how it is governed. Consequently, the widespread use of economic metaphors is politically significant. This article discusses how metaphors have been analysed in environmental policy research, surveys the use of prominent economic metaphors in environmental policy, and considers the politics associated with such terms. The uptake of various economic metaphors represents a form of reverse discourse, varies in politically significant ways, and narrows the terms of environmental debate.",Brian Coffey,A5056992144,RMIT University (AU),Natural capital; Unpacking; Politics; Metaphor; Ideology; Sociology; Capital (architecture); Environmental studies; Discourse analysis; Critical discourse analysis; Natural (archaeology); Environmental politics; Value (mathematics); Environmental policy; Debt; Environmental ethics; Economics; Positive economics; Political science; Ecosystem services; Environmental resource management; Law; Ecology; Linguistics,natural-capital; unpacking; politics; metaphor; ideology; sociology; capital; environmental-studies; discourse-analysis; critical-discourse-analysis; natural; environmental-politics; value; environmental-policy; debt; environmental-ethics; economics; positive-economics; political-science; ecosystem-services; environmental-resource-management; law; ecology; linguistics,https://openalex.org/W54670680; https://openalex.org/W364675936; https://openalex.org/W586058454; https://openalex.org/W591561411; https://openalex.org/W621617282; https://openalex.org/W634424833; https://openalex.org/W1487575620; https://openalex.org/W1505416059; https://openalex.org/W1511186454; https://openalex.org/W1511736487; https://openalex.org/W1528074835; https://openalex.org/W1528113760; https://openalex.org/W1537333624; https://openalex.org/W1545442817; https://openalex.org/W1572302632; https://openalex.org/W1586469975; https://openalex.org/W1595331308; https://openalex.org/W1899753561; https://openalex.org/W1919517363; https://openalex.org/W1994590651; https://openalex.org/W1996951807; https://openalex.org/W2007161913; https://openalex.org/W2007403982; https://openalex.org/W2009489151; https://openalex.org/W2014629333; https://openalex.org/W2020487534; https://openalex.org/W2025810582; https://openalex.org/W2030775185; https://openalex.org/W2035983503; https://openalex.org/W2036219106; https://openalex.org/W2040061106; https://openalex.org/W2046109790; https://openalex.org/W2052417512; https://openalex.org/W2054691965; https://openalex.org/W2061352695; https://openalex.org/W2069034186; https://openalex.org/W2073031385; https://openalex.org/W2090746889; https://openalex.org/W2104024295; https://openalex.org/W2108991971; https://openalex.org/W2124758952; https://openalex.org/W2125467995; https://openalex.org/W2131554966; https://openalex.org/W2134615644; https://openalex.org/W2161586993; https://openalex.org/W2188641303; https://openalex.org/W4210838977; https://openalex.org/W4232184570; https://openalex.org/W4237329516; https://openalex.org/W4239357219; https://openalex.org/W4241244678; https://openalex.org/W4244238918; https://openalex.org/W4245260055; https://openalex.org/W4246027354; https://openalex.org/W4248308225; https://openalex.org/W4255373279; https://openalex.org/W4292917376; https://openalex.org/W4300645397; https://openalex.org/W4301819063; https://openalex.org/W4320800888; https://openalex.org/W4389657267,Environmental Politics,en,False -W4391474705,10.1080/23251042.2024.2309407,The semi-periphery and ecologically unequal exchange: carbon emissions and recursive exploitation,2024,"Social science research has been increasingly interested in the relationships between the environment and the economy. One critical research agenda – ecological unequal exchange – has explored the asymmetric flow of resources and unequal distribution of environmental harms across the world economy, particularly between high-income and low-income countries. However, research into the relationship between middle-income nations and low-income nations has been relatively minimal. This study, building off a world-systems taxonomy of core, semi-periphery, and periphery states, looks to extend research into the ecological dynamics captured in the trade among the non-core states, with regards to carbon emissions, over the course of 1996–2018. I find that patterns of ecological unequal exchange vary among the tiers of the semi-periphery – identified as the 'Semi-Core,' the 'Regional Powers,' and the 'Secondary Regional States' – suggesting the importance of tier-specific political-economic features in generating ecological unequal exchange outcomes.",Hassan El Tinay,A5028079790,,Environmental sociology; Carbon fibers; Natural resource economics; Greenhouse gas; Ecology; Environmental science; Sociology; Economics; Social science; Biology; Computer science,environmental-sociology; carbon-fibers; natural-resource-economics; greenhouse-gas; ecology; environmental-science; sociology; economics; social-science; biology; computer-science,https://openalex.org/W651598703; https://openalex.org/W1484384217; https://openalex.org/W1495220204; https://openalex.org/W1504658872; https://openalex.org/W1544989902; https://openalex.org/W1681545227; https://openalex.org/W1975490723; https://openalex.org/W1992762801; https://openalex.org/W2002961660; https://openalex.org/W2020935901; https://openalex.org/W2057810683; https://openalex.org/W2072408946; https://openalex.org/W2080351687; https://openalex.org/W2088030007; https://openalex.org/W2115768128; https://openalex.org/W2123567146; https://openalex.org/W2143917121; https://openalex.org/W2169776575; https://openalex.org/W2187258560; https://openalex.org/W2243318061; https://openalex.org/W2249688373; https://openalex.org/W2345240133; https://openalex.org/W2500221348; https://openalex.org/W2617245318; https://openalex.org/W2735485714; https://openalex.org/W2743178718; https://openalex.org/W2753028055; https://openalex.org/W2789854516; https://openalex.org/W2790147032; https://openalex.org/W2791909668; https://openalex.org/W2796317886; https://openalex.org/W2811505433; https://openalex.org/W2930040016; https://openalex.org/W2956268707; https://openalex.org/W2973704988; https://openalex.org/W2999137147; https://openalex.org/W3014912319; https://openalex.org/W3033244837; https://openalex.org/W3037550216; https://openalex.org/W3045540281; https://openalex.org/W3080367007; https://openalex.org/W3110745579; https://openalex.org/W3206338816; https://openalex.org/W4232456625; https://openalex.org/W4233208757; https://openalex.org/W4236945833; https://openalex.org/W4238756271; https://openalex.org/W4242816708; https://openalex.org/W4246066143; https://openalex.org/W4254461681; https://openalex.org/W4372348656; https://openalex.org/W4400789899; https://openalex.org/W7002005117; https://openalex.org/W7047669798,Environmental Sociology,en,False -W1765082176,10.60082/2817-5069.1347,"Leading Towards a Level Playing Field, Repaying Ecological Debt, or Making Environmental Space: Three Stories about International Environmental Cooperation",2005,"This article considers a number of different ways of conceptualizing the relationship between South and North in the environmental context, focusing on international responses to climate change and, in particular, the Kyoto Protocol to the United Nations Framework Convention on Climate Change. It explores three stories about international environmental cooperation. One derives from the concept of ""ecological debt,"" the second comes from the concept of ""environmental space,"" and the third, which might be said to underlie the U.S. approach to the Kyoto Protocol at the present time, is labelled ""leading towards a level playing field."" The article provides an overview of all three stories, and attempts to offer some insight into the very different visions of the international community that they encapsulate.",Karin Mickelson,A5075761661,Universidad Braulio Carrillo (CR),Vision; United Nations Framework Convention on Climate Change; Kyoto Protocol; Convention; Context (archaeology); Field (mathematics); Debt; Climate change; Space (punctuation); International community; Political science; Environmental resource management; Environmental ethics; Ecology; Sociology; Geography; Business; Law; Economics; Politics; Computer science,vision; united-nations-framework-convention-on-climate-change; kyoto-protocol; convention; context; field; debt; climate-change; space; international-community; political-science; environmental-resource-management; environmental-ethics; ecology; sociology; geography; business; law; economics; politics; computer-science,,Osgoode Hall law journal,en,False -W2901782820,10.2458/v25i1.22013,"Public knowledge, attitudes and perception of ecological debt",2018,"The concept of ecological debt describes the ecological relations between industrialized (developed) and developing countries and the environment. It refers to the responsibility held by those who live in industrialized countries, as well as their accomplices in the South, for the continuing destruction of the planet due to production and consumption patterns. Ecological debt is a potentially powerful tool for re-discussing relations between North and South and for rethinking sustainable development policies. The aim of the current study is to evaluate the public's knowledge, attitude towards, and perceptions of topics related to the concept of ecological debt. A survey was conducted using a structured questionnaire among residents of Athens, the capital of Greece. To the best of our knowledge this is the first time that this issue has been explored, with regard to public opinion and this is the beginning of a discussion on public understanding of ecological debt. The survey reveals that the concept of ecological debt is not widely understood; but the participants seem to agree on the causes of its generation and on its association with external financial debt. The research findings guide alternative proposals to relevant social movements and/or organizations for the design of wake-up policies.",Efi Drimili; Efthimios Zervas,A5107969561; A5010764655,Hellenic Open University (GR); Hellenic Open University (GR),Debt; Public opinion; Perception; Consumption (sociology); Sustainable development; Political science; Business; Sociology; Psychology; Finance; Social science,debt; public-opinion; perception; consumption; sustainable-development; political-science; business; sociology; psychology; finance; social-science,https://openalex.org/W810233521; https://openalex.org/W1515669283; https://openalex.org/W1523895391; https://openalex.org/W1581783538; https://openalex.org/W1584129281; https://openalex.org/W1605140183; https://openalex.org/W1963486613; https://openalex.org/W1973899709; https://openalex.org/W1986875667; https://openalex.org/W1992688562; https://openalex.org/W2012254774; https://openalex.org/W2038699019; https://openalex.org/W2048051304; https://openalex.org/W2085683054; https://openalex.org/W2089327955; https://openalex.org/W2126212614; https://openalex.org/W2137540105; https://openalex.org/W2272890368; https://openalex.org/W2319568853; https://openalex.org/W2562324168; https://openalex.org/W2592356138; https://openalex.org/W2594589186; https://openalex.org/W2618067250; https://openalex.org/W2620457709; https://openalex.org/W2757478421; https://openalex.org/W2759503593; https://openalex.org/W2913390697; https://openalex.org/W3159280209; https://openalex.org/W4300483823; https://openalex.org/W4301375542; https://openalex.org/W4394846027; https://openalex.org/W6629265512; https://openalex.org/W6631258106; https://openalex.org/W6850696550,Journal of Political Ecology,en,False -W2140675380,,VLIR-BVO project 2003 'Elaboration of the concept of ecological debt',2004,,Erik Paredis; Jesse Lambrecht; Gert Goeminne; Wouter Vanhove,A5041144613; A5048787297; A5007488495; A5024639661,,Elaboration; Geography; Environmental science; Philosophy,elaboration; geography; environmental-science; philosophy,https://openalex.org/W44884755; https://openalex.org/W68797825; https://openalex.org/W101332654; https://openalex.org/W222966551; https://openalex.org/W647204147; https://openalex.org/W810233521; https://openalex.org/W1907583418; https://openalex.org/W1976776799; https://openalex.org/W2012254774; https://openalex.org/W2018661949; https://openalex.org/W2036713768; https://openalex.org/W2047856663; https://openalex.org/W2085683054; https://openalex.org/W2126212614; https://openalex.org/W2167369155; https://openalex.org/W2226489716; https://openalex.org/W2274729279; https://openalex.org/W2301672513; https://openalex.org/W2339579267; https://openalex.org/W2746485780; https://openalex.org/W3048682234; https://openalex.org/W3123592998; https://openalex.org/W3159280209,Ghent University Academic Bibliography (Ghent University),en,False -W3017089289,10.4324/9781315207094-4,Expanding treadmill of production analysis within green criminology by integrating metabolic rift and ecological unequal exchange theories,2020,"This chapter draws upon the treadmill of production (ToP) theoretical framework to demonstrate how capitalism produces environmental crimes and harms at both the local and global level. The chapter begins with a description of ToP before extending the political economic orientation of ToP by connecting it to two other radical political economic theories designed to make the linkage between capitalism and ecological destruction more visible: metabolic rift theory and ecological unequal exchange theory. The authors of this chapter argue that these views help round out the ToP approach and can be applied to understand any number of environmental crimes and injustices associated with ecological disorganisation. Encouraging further exploration by green criminologists, the authors make the case for establishing stronger connections to the ecological Marxist and environmental sociology literatures, as well as to the growing number of empirical studies in those fields that support these approaches.",Michael J. Lynch; Paul B. Stretesky; Michael A. Long; Kimberly L. Barrett,A5018094670; A5001040330; A5088849050; A5088301346,,Environmental sociology; Production (economics); Ecology; Sociology; Economics; Biology; Microeconomics,environmental-sociology; production; ecology; sociology; economics; biology; microeconomics,,,en,False -W4387183420,10.3389/fenvs.2023.1269691,The impact of FDI on ecological unequal exchange in China’s manufacturing industry,2023,"This paper uses the panel data of manufacturing subdivision industry from 2000 to 2014 to calculate the exchange of ecological inequality through MRIO model. On this basis, the systematic GMM model is used to investigate the direct and indirect effects of Foreign Direct Investment on the unequal exchange of manufacturing ecology. In addition, the ecological unequal exchange in China’s manufacturing industry is decomposed into ecological unequal exchange on the production side, on the consumption side, with developed regions and with lessdeveloped regions. The study finds that: 1) Industry-wide research indicates that FDI inflows have a significant positive impact on reducing the unequal exchange in the manufacturing sector. This finding contributes to the existing literature on the effects of FDI on ecological inequality. 2) Path-specific studies reveal that FDI primarily reduces ecological inequality in the manufacturing sector through technological effects. However, the scale and structural effects of FDI exacerbate ecological inequality, confirming the findings of some scholars. This nuanced understanding of the effects of FDI on ecological inequality adds to the existing body of research. 3) From the perspective of FDI sources, FDI from Asian countries and regions is more beneficial for improving China’s ecological unequal exchange. This finding provides guidance for China’s FDI attraction policies. 4) Assessing pollution emissions inventories based on the principle of production responsibility is unfair to China from both the production and consumption perspectives. 5) From a regional perspective, FDI effectively reduces the impact of ecological unequal exchange in the manufacturing sector between China and developed economies. These findings confirm that China bears an unequal exchange in the trade process and enrich the understanding of the impact of FDI on ecological unequal exchange.",Mengqi Gong; Longle Wang; Xiaofan Li,A5061660679; A5071018060; A5100637080,Wuhan Institute of Technology (CN); Wuhan Institute of Technology (CN); Wuhan Institute of Technology (CN),Foreign direct investment; China; Production (economics); Inequality; Manufacturing; Consumption (sociology); Economics; Economic geography; Ecology; Manufacturing sector; Business; International economics; Geography; Macroeconomics; Biology,foreign-direct-investment; china; production; inequality; manufacturing; consumption; economics; economic-geography; ecology; manufacturing-sector; business; international-economics; geography; macroeconomics; biology,https://openalex.org/W1977411201; https://openalex.org/W2012251817; https://openalex.org/W2024725622; https://openalex.org/W2057810683; https://openalex.org/W2164703638; https://openalex.org/W2263563523; https://openalex.org/W2523304678; https://openalex.org/W2557909387; https://openalex.org/W2618067250; https://openalex.org/W2743178718; https://openalex.org/W2788098830; https://openalex.org/W2886351347; https://openalex.org/W2898613847; https://openalex.org/W2974680376; https://openalex.org/W3010013823; https://openalex.org/W3083280272; https://openalex.org/W3096720883; https://openalex.org/W3122661090; https://openalex.org/W3152730200; https://openalex.org/W4211145470; https://openalex.org/W4306691580; https://openalex.org/W4384393255,Frontiers in Environmental Science,en,False -W3124841667,,"Leading Towards a Level Playing Field, Repaying Ecological Debt, or Making Environmental Space: Three Stories About International Environmental Cooperation",2005,"This article considers a number of different ways of conceptualizing the relationship between South and North in the environmental context, focusing on international responses to climate change and, particular, the Kyoto Protocol to the United Nations Framework Convention on Climate Change. It explores three stories about international cooperation. One derives from the concept of ""ecological debt,"" the second comes from the concept of ""environmental space,"" and the third, which might be said to underlie the U.S. approach to the Kyoto Protocol at the present time, is labelled ""leading towards a level playing field."" This article provides an overview of all three stories, and attempts to offer some insight into the very different visions of the international community that they encapsulate.",Karin Mickelson,A5075761661,,United Nations Framework Convention on Climate Change; Political science; Convention; Humanities; Kyoto Protocol; Ethnology; Vision; Context (archaeology); Sociology; Climate change; Geography; Ecology; Law; Archaeology; Art; Anthropology,united-nations-framework-convention-on-climate-change; political-science; convention; humanities; kyoto-protocol; ethnology; vision; context; sociology; climate-change; geography; ecology; law; archaeology; art; anthropology,,eYLS (Yale Law School),en,False -W4415915422,10.1080/10455752.2025.2579886,Two Sides of the Same Coin: A Synthesis of Economic and Ecological Unequal Exchange,2025,"Capitalism perpetuates injustices by appropriating vast amounts of human effort and natural wealth across regions and populations, all under the guise of economic cooperation and mutual benefit. Marxist and ecological approaches to unequal exchange (UE) both seek to expose these transfers. Yet without theoretical integration, they fail to support crucial alliances between social and environmental justice movements. This paper therefore approaches UE as the convergence of labour, material, monetary, and currency imbalances. While individual imbalances may indicate asymmetry, their combined effect reveals deeper, systemic injustices. In 2022, after excluding productivity gaps, UE (expressed in monetary terms) amounted to a gain of US$ 3.1 trillion for the economies of the centre (equivalent to 27% of their combined Domestic Value Added, DVA) and a loss of US$ 1.7 trillion for the periphery (108%). When productivity gaps are included, the centre's gain rises to US$ 8.8 trillion (76%), while the periphery loses US$ 6.9 trillion – equivalent to a staggering 440% of DVA. These imbalances reflect not a deviation from some “true” or “fair” monetary value of nature or labour, but rather expose a system sustained by extraction and exploitation. Balance cannot be restored within such a system; it must be transformed.",Crelis Rammelt,A5005445191,University of Amsterdam (NL),Capitalism; Production (economics); Sustainability,capitalism; production; sustainability,https://openalex.org/W1964911611; https://openalex.org/W1967540883; https://openalex.org/W1975529595; https://openalex.org/W1990164247; https://openalex.org/W1993258255; https://openalex.org/W1997312490; https://openalex.org/W2014634665; https://openalex.org/W2056926496; https://openalex.org/W2076881948; https://openalex.org/W2119211517; https://openalex.org/W2345419491; https://openalex.org/W2515104092; https://openalex.org/W2624693595; https://openalex.org/W2794556575; https://openalex.org/W2899120092; https://openalex.org/W3083280272; https://openalex.org/W3144452147; https://openalex.org/W4211221020; https://openalex.org/W4234010666; https://openalex.org/W4251638621; https://openalex.org/W4282567479; https://openalex.org/W4361289971; https://openalex.org/W4387429400; https://openalex.org/W4388661872; https://openalex.org/W4396494537; https://openalex.org/W4401091536; https://openalex.org/W4409155547; https://openalex.org/W4409540095; https://openalex.org/W4412018112; https://openalex.org/W6908880526,Capitalism Nature Socialism,en,False -W4242353811,10.4324/9780203076989-29,Environmental justice and ecological debt in Belgium: the UMICORE case,2013,"The notion of ecological debt focuses on unequal exploitation of the global commons, and includes pollution, disproportionate use of the environment and ‘theft’ of southern resources by northern countries. The calculations of such environmental damages represent a practical tool for pursuing environmental justice. This chapter takes a more local view of the notion of ecological debt, by applying the same principles around an industrial site in a Northern country. ‘Ecological debt’ is in this context equivalent to ‘environmental liability’. A company has assets and liabilities, i.e. debts. The environmental liabilities rarely appear in the balance sheets. Similarly, the ecological debts of rich countries do not appear in their macroeconomic accounts. We focus on historically created ecological damage, considering impacts on health and capabilities, the major collateral damages infl icted in the recent past by the emissions of a particular site in Belgium run by the company UMICORE. In the fi rst section, we present the notions of environmental justice, ecological debt and particularly the idea of ‘private ecological debt’ or environmental liability. The second section describes the methodology for evaluating the ecological debt in the case under study. Section three shows the calculations and results. In section four, we discuss the advantages of collaborative or co-operative research between scientists and civil society actors, which lie at the heart of the present book, and the resulting practical and theoretical contributions of this study.",,,,Environmental justice; Debt; Economic Justice; Ecology; Geography; Political science; Business; Biology; Finance; Law,environmental-justice; debt; economic-justice; ecology; geography; political-science; business; biology; finance; law,,,en,False -W2424450747,10.1016/j.ecolecon.2016.06.006,Where have all the funds gone? Multiregional input-output analysis of the European Agricultural Fund for Rural Development,2016,,Fabio Monsalve; Jorge Zafrilla; María‐Ángeles Cadarso,A5081118602; A5047259057; A5036506113,University of Castilla-La Mancha (ES); University of Castilla-La Mancha (ES); University of Castilla-La Mancha (ES),Sustainability; Agriculture; Distribution (mathematics); Business; Sustainable development; Economics; Rural development; Natural resource economics; Geography; Ecology,sustainability; agriculture; distribution; business; sustainable-development; economics; rural-development; natural-resource-economics; geography; ecology,https://openalex.org/W749416070; https://openalex.org/W1492289444; https://openalex.org/W1493472778; https://openalex.org/W1542047764; https://openalex.org/W1650067763; https://openalex.org/W1895628710; https://openalex.org/W1956760944; https://openalex.org/W1964085940; https://openalex.org/W1970139579; https://openalex.org/W1971309533; https://openalex.org/W1982813761; https://openalex.org/W1987219067; https://openalex.org/W1988324589; https://openalex.org/W1992683955; https://openalex.org/W1995968610; https://openalex.org/W1998830031; https://openalex.org/W2009852955; https://openalex.org/W2010351240; https://openalex.org/W2020393050; https://openalex.org/W2026535485; https://openalex.org/W2029670485; https://openalex.org/W2033554029; https://openalex.org/W2035943368; https://openalex.org/W2037089594; https://openalex.org/W2041490855; https://openalex.org/W2045987553; https://openalex.org/W2049663377; https://openalex.org/W2050650868; https://openalex.org/W2052603662; https://openalex.org/W2058450398; https://openalex.org/W2062825804; https://openalex.org/W2065289804; https://openalex.org/W2083280785; https://openalex.org/W2087939361; https://openalex.org/W2093445010; https://openalex.org/W2096081303; https://openalex.org/W2100016968; https://openalex.org/W2102966366; https://openalex.org/W2113219607; https://openalex.org/W2126205604; https://openalex.org/W2144975314; https://openalex.org/W2145917034; https://openalex.org/W2158804744; https://openalex.org/W2162141368; https://openalex.org/W2162550487; https://openalex.org/W2166001406; https://openalex.org/W2171050209; https://openalex.org/W2318764153; https://openalex.org/W2319851860; https://openalex.org/W2322974595; https://openalex.org/W2323325301; https://openalex.org/W2332875009; https://openalex.org/W2335259225; https://openalex.org/W2399179509; https://openalex.org/W3121873832; https://openalex.org/W3124228636; https://openalex.org/W3125711463; https://openalex.org/W6622074492; https://openalex.org/W6641122997; https://openalex.org/W6662088076; https://openalex.org/W6981294069,Ecological Economics,en,False -W4312219881,10.1080/14747731.2022.2157992,"Climate, violence, resource extraction and ecological debt: global implications of an assassination on South Africa's coal mining belt",2022,"Extractivism has attracted inspiring resistance in South Africa, but far-reaching lessons from one site of struggle in KwaZulu-Natal Province are sobering. The October 2020 assassination of Fikile Ntshangase, an anti-coal activist, reflects difficult political-economic and political-ecological terrain. The critical role of gendered activism in former apartheid-era Bantustans underlay concrete problems Ntshangase faced when confronted by male coal-mine labourers. There was no ‘Just Transition’ programme to decarbonize the mine at the time. The corporation that benefited from the assassination, Petmin, was expanding into Ntshangase's village. In the process, not only did the need to cease coal mining become of enormous global concern, but Petmin’s role in international circuits of capital also gave rise to a new round of global-local and socio-ecological linkages. Some involve the World Bank while others entail solidarity with victims of the same firm near the United States city of Cleveland.",Patrick Bond,A5061884523,University of Johannesburg (ZA),Solidarity; Political ecology; Politics; Political science; Corporation; Resource (disambiguation); Debt; Economy; Political economy; Development economics; Business; Sociology; Economics; Law,solidarity; political-ecology; politics; political-science; corporation; resource; debt; economy; political-economy; development-economics; business; sociology; economics; law,https://openalex.org/W106908474; https://openalex.org/W1862751979; https://openalex.org/W2534779911; https://openalex.org/W2971750072; https://openalex.org/W4285190786,Globalizations,en,False -W4250250916,10.2307/j.ctt183p4mr,Ecological Debt,2009,,Andrew Simms,A5112290444,,Environmental science; Economics; Ecology; Biology,environmental-science; economics; ecology; biology,,Pluto Press eBooks,en,False -W2594382053,,Asymmetries : Conceptualizing Environmental Inequalities as Ecological Debt and Ecologically Unequal Exchange,2017,"In this compilation thesis, consisting of six papers and an introductory chapter, the concepts of ecological debt, climate debt, ecologically unequal exchange, and unequal carbon sink appropriation are at the centre. Their intellectual and political histories are traced to environmental justice movements, ecological economics and neo-Marxist economics. They are developed conceptually and linked together analytically using a stock-flow perspective. Special concern is devoted to climate debt as understood by the climate justice movement. Its claims on climate debt are identified, their normative assumptions tested and climate debt is quantified as consisting of both an emission debt and an adaptation debt. The last paper focus on a historical case study, where a method for measuring ecologically unequal exchange – time-space appropriation – is applied to discuss core and peripheries in the early modern world system, indicating a Sinocentric world economy. In the introductory chapter, sections on critical realism and mixed methods research position the thesis theoretically and methodologically. The concepts at the centre of the thesis are synthesized into what is called an ecological-economic asymmetries approach. Further, the possibilities to base the approach on ecological Marxism and historical-geographical materialism are explored and a potential future research strategy sketched.",Rikard Warlenius,A5020507738,,Debt; Appropriation; Ecological economics; Economics; Positive economics; Political science; Sociology; Social science; Neoclassical economics; Ecology; Sustainability; Epistemology; Macroeconomics,debt; appropriation; ecological-economics; economics; positive-economics; political-science; sociology; social-science; neoclassical-economics; ecology; sustainability; epistemology; macroeconomics,,Lund University Publications (Lund University),en,False -W409900855,,Eco-Sufficiency and Global Justice : Women Write Political Ecology,2009,Ecological Debt: Embodied Debt Ariel Salleh PART I - HISTORIES The Devaluation of Women's Labour Silvia Federici Who is the 'He' of He Who Decides in Economic Discourse? Ewa Charkiewicz The Diversity Matrix: Relationship and Complexity Susan Hawthorne PART II - MATTER Development for Some is Violence for Others Nalini Nayak Nuclearised Bodies and Militarised Space Zohl de Ishtar Women and Deliberative Water Management Andrea Moraes and Ellie Perkins PART III - GOVERNANCE Mainstreaming Trade and Millennium Development Goals? Gig Francisco and Peggy Antrobus Policy and the Measure of Woman Marilyn Waring Feminist Ecological Economics in Theory and Practice Sabine U. O'Hara PART IV - ENERGY Who Pays for Kyoto Protocol? Selling Oxygen and Selling Sex Ana Isla How Global Warming is Gendered Meike Spitzner Women and the Abuja Declaration for Energy Sovereignty Leigh Brownhill and Terisa E. Turner PART V - MOVEMENT Ecofeminist Political Economy and the Politics of Money Mary Mellor Saving Women: Saving the Commons Leo Podlashuc From Eco-Sufficiency to Global Justice Ariel Salleh Index,Ariel Salleh,A5050075228,,Ecological economics; Politics; Political science; Economy; Sociology; Gender studies; Ecology; Economics; Law; Sustainability,ecological-economics; politics; political-science; economy; sociology; gender-studies; ecology; economics; law; sustainability,,,en,False -W2023267627,10.1016/j.ecoleng.2006.05.021,Natural capital: The limiting factor,2006,,Joshua Farley; Herman E. Daly,A5090686681; A5027651591,"University of Vermont (US); University of Maryland, College Park (US)",Footprint; Ecological footprint; Environmental science; Occupancy; Natural resource; Land use; Geography; Environmental resource management; Ecology; Sustainability,footprint; ecological-footprint; environmental-science; occupancy; natural-resource; land-use; geography; environmental-resource-management; ecology; sustainability,https://openalex.org/W121151744; https://openalex.org/W571165093; https://openalex.org/W617737805; https://openalex.org/W1530567397; https://openalex.org/W1564107706; https://openalex.org/W1574252464; https://openalex.org/W1574645189; https://openalex.org/W1608237007; https://openalex.org/W1927063796; https://openalex.org/W1936774573; https://openalex.org/W1970317388; https://openalex.org/W1970376522; https://openalex.org/W1994485043; https://openalex.org/W1999061137; https://openalex.org/W2008143266; https://openalex.org/W2012341183; https://openalex.org/W2027271929; https://openalex.org/W2048973844; https://openalex.org/W2057931959; https://openalex.org/W2073080915; https://openalex.org/W2099799233; https://openalex.org/W2112484287; https://openalex.org/W2149161296; https://openalex.org/W2151301860; https://openalex.org/W2164556042; https://openalex.org/W2481880397; https://openalex.org/W2555957898; https://openalex.org/W3137224376; https://openalex.org/W4301267015; https://openalex.org/W6672806637; https://openalex.org/W6684132962; https://openalex.org/W6757687813,Ecological Engineering,en,False -W3164354311,,Environmental justice and ecological debt in Belgium: The UMICORE case,2013,,Nick Meynen; Léa Sébastien,A5032018808; A5110959155,,Environmental justice; Debt; Environmental resource management; Political science; Natural resource economics; Economics; Ecology; Business; Geography; Finance; Biology,environmental-justice; debt; environmental-resource-management; political-science; natural-resource-economics; economics; ecology; business; geography; finance; biology,,,en,False -W2796372547,10.4337/9781849805520.00019,Ecological Debt: An Integrating Concept for Socio-Environmental Change,2010,"This thoroughly revised Handbook provides an assessment of the scope and content of environmental sociology, and sets out the intellectual and practical challenges posed by the urgent need for policy and action to address accelerating environmental change.",Iñaki Bárcena Hinojal; Rosa Lago Aurrekoetxea,A5040506861; A5037022026,,Scope (computer science); Action (physics); Environmental change; Debt; Environmental resource management; Sociology; Political science; Environmental planning; Ecology; Business; Geography; Environmental science; Computer science; Climate change; Biology,scope; action; environmental-change; debt; environmental-resource-management; sociology; political-science; environmental-planning; ecology; business; geography; environmental-science; computer-science; climate-change; biology,,Edward Elgar Publishing eBooks,en,False -W3210510104,10.1080/13549839.2021.1983795,"Circularity, entropy, ecological conflicts and LFFU",2021,"The economy is not circular, it is increasingly entropic. Energy from the photosynthesis of the distant past, fossil fuels, is burned and dissipated. Even without further economic growth the industrial economy would need new supplies of energy and materials extracted from the “commodity frontiers”, producing also more waste (including excessive amounts of greenhouse gases). Therefore, new ecological distribution conflicts (EDC) arise all the time. Such EDCs are often “valuation contests” displaying incommensurable plural values. Examples from the Atlas of Environmental Justice are given of coal, oil and gas-related conflicts in several countries combining local and global complaints. Claims for climate justice and recognition of an ecological debt have been put forward by environmentalists from the South since 1991, together with a strategy of leaving fossil fuels underground (LFFU) through bottom-up movements. This could make a substantial contribution to the decrease in carbon dioxide emissions.",Joan Martínez Alier,A5004042357,Universitat Autònoma de Barcelona (ES),Greenhouse gas; Fossil fuel; Natural resource economics; Plural; Valuation (finance); Coal; Economics; Ecological economics; Commodity; Environmental justice; Energy security; Ecology; Sustainability; Environmental science; Economy; Geography; Renewable energy; Market economy,greenhouse-gas; fossil-fuel; natural-resource-economics; plural; valuation; coal; economics; ecological-economics; commodity; environmental-justice; energy-security; ecology; sustainability; environmental-science; economy; geography; renewable-energy; market-economy,https://openalex.org/W39838849; https://openalex.org/W91194789; https://openalex.org/W106908474; https://openalex.org/W647036171; https://openalex.org/W1505091764; https://openalex.org/W1541584794; https://openalex.org/W1595652305; https://openalex.org/W1803673662; https://openalex.org/W1862702728; https://openalex.org/W1963684733; https://openalex.org/W1963985712; https://openalex.org/W1973318389; https://openalex.org/W1979816480; https://openalex.org/W1992262753; https://openalex.org/W2030626342; https://openalex.org/W2041321854; https://openalex.org/W2048051304; https://openalex.org/W2053216029; https://openalex.org/W2056619110; https://openalex.org/W2076926005; https://openalex.org/W2079856242; https://openalex.org/W2082793946; https://openalex.org/W2101108903; https://openalex.org/W2118628106; https://openalex.org/W2131236975; https://openalex.org/W2132214484; https://openalex.org/W2155200498; https://openalex.org/W2271137388; https://openalex.org/W2313084143; https://openalex.org/W2324550751; https://openalex.org/W2342655129; https://openalex.org/W2567287119; https://openalex.org/W2592356138; https://openalex.org/W2598540519; https://openalex.org/W2772693920; https://openalex.org/W2772802389; https://openalex.org/W2790216946; https://openalex.org/W2791564097; https://openalex.org/W2797346201; https://openalex.org/W2797434453; https://openalex.org/W2801608957; https://openalex.org/W2883168693; https://openalex.org/W2889685062; https://openalex.org/W2891857460; https://openalex.org/W2892221156; https://openalex.org/W2901758408; https://openalex.org/W2921021117; https://openalex.org/W2981711509; https://openalex.org/W2991613651; https://openalex.org/W3011803474; https://openalex.org/W3023793666; https://openalex.org/W3033432264; https://openalex.org/W3047060341; https://openalex.org/W3090697615; https://openalex.org/W3091617824; https://openalex.org/W3091902962; https://openalex.org/W3092621118; https://openalex.org/W3094134127; https://openalex.org/W3098302150; https://openalex.org/W3100044586; https://openalex.org/W3107877676; https://openalex.org/W3120723020; https://openalex.org/W3129731695; https://openalex.org/W3139265487; https://openalex.org/W3146360081; https://openalex.org/W3154286314; https://openalex.org/W3197396347; https://openalex.org/W3205393210; https://openalex.org/W4233654598; https://openalex.org/W4233919019; https://openalex.org/W4241340504; https://openalex.org/W4241852105; https://openalex.org/W4252072419; https://openalex.org/W4252277488; https://openalex.org/W4254369197; https://openalex.org/W4301267015; https://openalex.org/W4311608047; https://openalex.org/W4387882599,Local Environment,en,False -W4394877371,10.3390/su16083371,Exploring the Impact of FDI and Technological Progress Path on Ecological Unequal Exchange within Manufacturing Industry in China,2024,"Under the premise of jointly promoting global ecological and environmental governance, as an important promoter of economic globalization and the main communicator of low-carbon technology, how does FDI contribute to EUE? In addition, technology can affect ecological inequality exchange by affecting production methods and other aspects, so what role does the path of technological progress play in it? These questions are the focus of this paper. Ecological unequal exchange is calculated using the MRIO model, and this study further examines the influence of FDI on this exchange in the manufacturing sector via technological progress using the systematic GMM model. The study discovered the following: (1) The full sample study reveals that FDI inflows can significantly reduce the EUE of the manufacturing industry, but FDI exacerbates the EUE in the manufacturing industry by further worsening it through the pathway of technological progress (2) Further research finds that the effect of FDI on the EUE in the manufacturing sector through technological progress path will be different due to the source of FDI vary, the causes of ecological unequal exchange, the time period, and the development of a technological progress path.",Mengqi Gong; Weike Zhang,A5061660679; A5101610023,Wuhan Institute of Technology (CN); Wuhan Institute of Technology (CN),Foreign direct investment; Technological change; Manufacturing; Economic geography; Globalization; Premise; China; Industrial organization; Business; Path dependence; Manufacturing sector; Sample (material); Corporate governance; Economics; Ecology; International economics; Marketing; Geography; Market economy; Macroeconomics; Management,foreign-direct-investment; technological-change; manufacturing; economic-geography; globalization; premise; china; industrial-organization; business; path-dependence; manufacturing-sector; sample; corporate-governance; economics; ecology; international-economics; marketing; geography; market-economy; macroeconomics; management,https://openalex.org/W1495220204; https://openalex.org/W1970139579; https://openalex.org/W2012011920; https://openalex.org/W2057810683; https://openalex.org/W2091748877; https://openalex.org/W2367636902; https://openalex.org/W2371455775; https://openalex.org/W2381991480; https://openalex.org/W2618067250; https://openalex.org/W2743178718; https://openalex.org/W3010013823; https://openalex.org/W3122619127; https://openalex.org/W3124744803; https://openalex.org/W3125697804; https://openalex.org/W3212855748; https://openalex.org/W6738354462; https://openalex.org/W7005270004,Sustainability,en,False -W2087385946,10.1080/14747730701345218,"Fueling Injustice: Globalization, Ecologically Unequal Exchange and Climate Change",2007,"The globalization of economic production fundamentally reshapes how a ‘fair’ solution to the climate change problem must be forged. Emissions are increasing sharply in developing countries as wealthy nations ‘offshore’ the energy- and natural resource-intensive stages of production. We review a new and relatively under-utilized theory of ‘ecologically unequal exchange’ and apply it to the case of climate change. We describe four distinct principles that have been proposed to assign responsibility for carbon emissions, discuss their inadequacies, and briefly lay out some ‘hybrid’ proposals currently under consideration. We suggest combining hybrid proposals with environmental aid packages that help poorer nations transition from carbon-intensive pathways of development to more climate-friendly development trajectories, using remuneration from the so-called ‘ecological debt’. In the context of deadlock over a completely inadequate Kyoto Protocol, we argue that fairness principles, climate science, and an understanding of globalization and development must be integrated. La globalización de la producción económica cambia completamente la forma de cómo una “simple”solución al problema del cambio climatológico debe de ser alterado. Las emisiones han aumentado bruscamente en los países en desarrollo mientras que los países ricos operan en el extranjero las fases intensas de producción de energía y utilización de recursos naturales. Hemos revisado una teoría nueva y relativamente poco utilizada de ‘intercambio ecológico desigual’ y la hemos aplicado al caso del cambio del clima. Describimos cuatro principios distintos que se propusieron para asignar la responsabilidad a las emisiones de carbón, discutimos sus faltas de adecuación y planeamos brevemente unas propuestas ‘híbridas'que se encuentran actualmente bajo consideración. Sugerimos combinar las propuestas híbridas con los paquetes de ayuda para el medio ambiente que ayuden a las naciones más pobres a hacer la transición de las vías intensivas de desarrollo de carbón a trayectorias de desarrollo más adaptable al clima, usando renumeración de la llamada ‘deuda ecológica’. En el contexto sobre un Protocolo de Kyoto estancado y completamente inadecuado, discutimos que la justicia, ciencia climatológica y el entendimiento de globalización y desarrollo deben integrarse.",J. Timmons Roberts; Bradley C. Parks,A5082988195; A5047978847,Williams (United States) (US); William & Mary (US); Millennium Challenge Corporation (US),Globalization; Welfare economics; Kyoto Protocol; Climate change; Context (archaeology); Political science; Economy; Natural resource; Geography; Natural resource economics; Economic system; Economics; Ecology,globalization; welfare-economics; kyoto-protocol; climate-change; context; political-science; economy; natural-resource; geography; natural-resource-economics; economic-system; economics; ecology,https://openalex.org/W18714912; https://openalex.org/W53023682; https://openalex.org/W228880448; https://openalex.org/W414522172; https://openalex.org/W564021603; https://openalex.org/W571951978; https://openalex.org/W608430605; https://openalex.org/W613588134; https://openalex.org/W651598703; https://openalex.org/W1503706120; https://openalex.org/W1527117602; https://openalex.org/W1552736777; https://openalex.org/W1563281257; https://openalex.org/W1565850046; https://openalex.org/W1580621702; https://openalex.org/W1583029312; https://openalex.org/W1593994209; https://openalex.org/W1594846353; https://openalex.org/W1607694897; https://openalex.org/W1823886455; https://openalex.org/W1970732996; https://openalex.org/W1979153761; https://openalex.org/W1980981591; https://openalex.org/W1993184008; https://openalex.org/W1996879967; https://openalex.org/W1998804088; https://openalex.org/W2005340918; https://openalex.org/W2008178580; https://openalex.org/W2013402297; https://openalex.org/W2017032566; https://openalex.org/W2021458480; https://openalex.org/W2027255868; https://openalex.org/W2030978014; https://openalex.org/W2036713768; https://openalex.org/W2038981142; https://openalex.org/W2056926496; https://openalex.org/W2069512745; https://openalex.org/W2069551332; https://openalex.org/W2076095769; https://openalex.org/W2077858203; https://openalex.org/W2083170299; https://openalex.org/W2084528250; https://openalex.org/W2095688137; https://openalex.org/W2101062956; https://openalex.org/W2101108903; https://openalex.org/W2109558192; https://openalex.org/W2125388400; https://openalex.org/W2126212614; https://openalex.org/W2173400697; https://openalex.org/W2174103482; https://openalex.org/W2182089091; https://openalex.org/W2259217146; https://openalex.org/W2341034567; https://openalex.org/W2392627374; https://openalex.org/W2487688836; https://openalex.org/W2501585505; https://openalex.org/W2528256758; https://openalex.org/W2799152616; https://openalex.org/W3102500135; https://openalex.org/W3121653486; https://openalex.org/W3123081990; https://openalex.org/W3123592998; https://openalex.org/W3124119720; https://openalex.org/W3159280209; https://openalex.org/W4230109911; https://openalex.org/W4232708887; https://openalex.org/W4234534685; https://openalex.org/W4237018467; https://openalex.org/W4247796865; https://openalex.org/W4285719527; https://openalex.org/W4299448508,Globalizations,en,False -W3135111755,10.1016/j.ecolind.2021.107480,Improvement and application of the three-dimensional ecological footprint model,2021,"The ecological footprint (EF) is an important tool for assessing ecological resource occupancy. The three-dimensional (3D) EF changes the EF from a plane to a column, and the bottom (EFsize) represents the human appropriation of the annual natural resource flow provided by the earth, while the height (EFdepth) represents the number of years required to regenerate the resources consumed within 1 year. According to the difference in the human demands for the productive functions of land, this paper improves the 3D EF model based on three sub-items, namely, the basic land footprint (including the footprint of cropland, grazing land and fishing grounds), which captures the demands of the physical part of food and clothing; forest land footprint, which captures wood and carbon absorption demands; and the built-up land footprint, which captures production and living space demands. The improved model is a 3D structure with three different heights. The bottom shows human appropriation of annual natural flows of the sub-items, and there is competition between the sub-items. The sub-heights are related to the overshoot of the sub-items. The forest land footprint depth is earlier and deeper than the 3D EF, and the footprint depth of the built-up land and basic land kept the natural depth. Therefore, humans perceive climate change, but their daily survival is not significantly affected. The flow occupancy ratio (orflow) and the accumulated ecological debt depth (EFdepthaccum) are introduced to analyse the closeness to the overshooting state and the years of using existing resources to eliminate historical ecological debt, respectively.",Mingli Bi; Cuiyou Yao; Gaodi Xie; Jingya Liu; Keyu Qin,A5008414446; A5045501264; A5102898759; A5101510723; A5016482157,Capital University of Economics and Business (CN); Capital University of Economics and Business (CN); Institute of Geographic Sciences and Natural Resources Research (CN); Chinese Academy of Sciences (CN); Chinese Academy of Sciences (CN); Institute of Geographic Sciences and Natural Resources Research (CN); Chinese Academy of Sciences (CN); Institute of Oceanology (CN),Ecological footprint; Environmental science; Footprint; Occupancy; Land use; Natural resource; Environmental resource management; Ecology; Geography; Sustainability,ecological-footprint; environmental-science; footprint; occupancy; land-use; natural-resource; environmental-resource-management; ecology; geography; sustainability,https://openalex.org/W1583147110; https://openalex.org/W1670321511; https://openalex.org/W1966364945; https://openalex.org/W1978430273; https://openalex.org/W1985203887; https://openalex.org/W1993351177; https://openalex.org/W2000984567; https://openalex.org/W2023267627; https://openalex.org/W2030498171; https://openalex.org/W2038398724; https://openalex.org/W2041447960; https://openalex.org/W2043244602; https://openalex.org/W2049235562; https://openalex.org/W2061195351; https://openalex.org/W2082737326; https://openalex.org/W2085596282; https://openalex.org/W2096885696; https://openalex.org/W2102387788; https://openalex.org/W2124350766; https://openalex.org/W2158809385; https://openalex.org/W2162648754; https://openalex.org/W2173448856; https://openalex.org/W2318167787; https://openalex.org/W2343073829; https://openalex.org/W2367839488; https://openalex.org/W2555754221; https://openalex.org/W2583237449; https://openalex.org/W2591241614; https://openalex.org/W2610836651; https://openalex.org/W2622029016; https://openalex.org/W2738104081; https://openalex.org/W2782393706; https://openalex.org/W2806335189; https://openalex.org/W2809858641; https://openalex.org/W2887510779; https://openalex.org/W2891411478; https://openalex.org/W2897191418; https://openalex.org/W2898686451; https://openalex.org/W2905314297; https://openalex.org/W2915580847; https://openalex.org/W2915905786; https://openalex.org/W2942854102; https://openalex.org/W2945757657; https://openalex.org/W2966517724; https://openalex.org/W3016419643; https://openalex.org/W3125042908; https://openalex.org/W3159645282; https://openalex.org/W6775626879; https://openalex.org/W7071651851,Ecological Indicators,en,False -W2051634160,10.1080/01436597.2013.786288,"Carbon Markets, Debt and Uneven Development",2013,"Abstract The United Nations Clean Development Mechanism (cdm) has been envisaged as a powerful tool for reconciling the global South’s environment and development problematic. By allowing Southern states to produce and sell carbon credits into the Kyoto Protocol’s compliance market, many predicted a growing North–South transfer of carbon finance, technology and profit. Confronted by deep crisis in global carbon markets, however, the cdm, rather than spurring development, is furnishing the conditions for rising debt and insecurity since project costs must be financed upfront, with the expectation that future project revenue will subsequently fulfil these obligations. This paper analyses the dialectic entanglements between the cdm’s ex post and market-dependent financing structure, the carbon market crisis and uneven development, based on the contention that cdm-related debt reveals the deeply unequal power relations that underpin contemporary approaches to climate change mitigation, whereby the North’s ecological debt is displaced, both materially and financially, onto Southern actors.",Kate Ervine,A5000155071,Schlumberger (Ireland) (IE),Clean Development Mechanism; Kyoto Protocol; Carbon finance; Debt; Carbon credit; Revenue; Economics; Profit (economics); Carbon market; Debt crisis; Climate Finance; Carbon offset; Business; Greenhouse gas; Finance; Economic growth; Developing country; Ecology,clean-development-mechanism; kyoto-protocol; carbon-finance; debt; carbon-credit; revenue; economics; profit; carbon-market; debt-crisis; climate-finance; carbon-offset; business; greenhouse-gas; finance; economic-growth; developing-country; ecology,,Third World Quarterly,en,False -W2021230127,10.1016/s0262-4079(07)62758-4,Cut ecological debt or humanity is at risk,2007,,Catherine Brahic,A5005093501,,Humanity; Planetary boundaries; Debt; Astrobiology; Environmental ethics; Ecology; Environmental science; Biology; Business; Political science; Sustainable development; Philosophy; Law; Finance,humanity; planetary-boundaries; debt; astrobiology; environmental-ethics; ecology; environmental-science; biology; business; political-science; sustainable-development; philosophy; law; finance,,The New Scientist,en,False -W2026461148,10.1007/s10460-014-9567-6,Structural impediments to sustainable groundwater management in the High Plains Aquifer of western Kansas,2014,,Matthew R. Sanderson; R. Scott Frey,A5001783283; A5084438873,Waters (United States) (US); Kansas State University (US); University of Tennessee at Knoxville (US),Aquifer; Groundwater; Agriculture; Resource (disambiguation); Sustainability; Natural resource economics; Rift valley; Water resource management; Geography; Ecology; Environmental science; Economics; Geology; Biology,aquifer; groundwater; agriculture; resource; sustainability; natural-resource-economics; rift-valley; water-resource-management; geography; ecology; environmental-science; economics; geology; biology,https://openalex.org/W60146509; https://openalex.org/W82035503; https://openalex.org/W141261431; https://openalex.org/W228880448; https://openalex.org/W565701012; https://openalex.org/W616635769; https://openalex.org/W628027292; https://openalex.org/W1480446199; https://openalex.org/W1487290281; https://openalex.org/W1494624469; https://openalex.org/W1512183817; https://openalex.org/W1526407077; https://openalex.org/W1550246025; https://openalex.org/W1554641608; https://openalex.org/W1603268398; https://openalex.org/W1803117247; https://openalex.org/W1898499425; https://openalex.org/W1907583418; https://openalex.org/W1966605003; https://openalex.org/W1981704037; https://openalex.org/W1982690502; https://openalex.org/W1986286171; https://openalex.org/W1990164247; https://openalex.org/W2006759735; https://openalex.org/W2015619480; https://openalex.org/W2016536997; https://openalex.org/W2017929814; https://openalex.org/W2020935901; https://openalex.org/W2021515498; https://openalex.org/W2023528362; https://openalex.org/W2031839214; https://openalex.org/W2036713768; https://openalex.org/W2047856663; https://openalex.org/W2049888754; https://openalex.org/W2056926496; https://openalex.org/W2064766425; https://openalex.org/W2075293243; https://openalex.org/W2079188934; https://openalex.org/W2092254604; https://openalex.org/W2093027911; https://openalex.org/W2099743616; https://openalex.org/W2104246777; https://openalex.org/W2104336388; https://openalex.org/W2108057681; https://openalex.org/W2119211517; https://openalex.org/W2122854726; https://openalex.org/W2126772797; https://openalex.org/W2133022495; https://openalex.org/W2142043891; https://openalex.org/W2159642665; https://openalex.org/W2165702945; https://openalex.org/W2166417404; https://openalex.org/W2169986832; https://openalex.org/W2175723801; https://openalex.org/W2226396244; https://openalex.org/W2291738616; https://openalex.org/W2418036091; https://openalex.org/W2516204427; https://openalex.org/W3044225635; https://openalex.org/W3147387277; https://openalex.org/W3147701359; https://openalex.org/W3148727043; https://openalex.org/W4211124652; https://openalex.org/W4211244051; https://openalex.org/W4233654598; https://openalex.org/W4234302912; https://openalex.org/W4241892371; https://openalex.org/W4244588123; https://openalex.org/W4248466517; https://openalex.org/W4251548203; https://openalex.org/W4297775561; https://openalex.org/W4300360800; https://openalex.org/W4319588009; https://openalex.org/W6604253536; https://openalex.org/W6619976831; https://openalex.org/W6655690080; https://openalex.org/W7024744069; https://openalex.org/W7065650524,Agriculture and Human Values,en,False diff --git a/exploracion/datos/redes/co_autoria.graphml b/exploracion/datos/redes/co_autoria.graphml deleted file mode 100644 index 642699a..0000000 --- a/exploracion/datos/redes/co_autoria.graphml +++ /dev/null @@ -1,493 +0,0 @@ - - - - - - -co_autoria -True -24 - - bunker_stephen_g - - - hornborg_alf - - - aldas_c - - - álvarez_m - - - orta_l - - - pereira_j - - - silva_r - - - costa_p - - - khor_m - - - narayanan_s - - - A5004042357 - - - A5007427123 - - - A5050277246 - - - A5035350172 - - - martínezalier_joan - - - temper_leah - - - del_bene_daniela - - - scheidel_arnim - - - davis_k_f - - - rulli_m_c - - - seveso_a - - - dodorico_p - - - heikkineá_t - - - pietola_k - - - wiedmann_t_o - - - schandl_h - - - lenzen_m - - - moran_d - - - suh_s - - - west_j - - - kanemoto_k - - - kastner_t - - - erb_kh - - - haberl_h - - - warrior_r - - - álvarez_l - - - frey_b - - - subramaniam_b - - - ricardo_david - - - wallis_victor - - - reyes_g - - - carrasco_h - - - castro_v - - - bermúdez_a - - - bringezu_s - - - schuetz_h - - - pengue_w - - - obrien_m - - - garcia_f - - - sims_r - - - wirtz_d - - - hoekstra_a_y - - - chapagain_a_k - - - aldaya_m_m - - - mekonnen_m_m - - - ourresearch_ - - - lópez_a - - - vázquez_r - - - anonymous_a - - - garcía_m - - - smith_j - - - patel_r - - - 1 - - - 1 - - - 1 - - - 1 - - - 1 - - - 1 - - - 1 - - - 1 - - - 1 - - - 1 - - - 1 - - - 1 - - - 1 - - - 1 - - - 1 - - - 1 - - - 1 - - - 1 - - - 1 - - - 1 - - - 1 - - - 1 - - - 1 - - - 1 - - - 1 - - - 1 - - - 1 - - - 1 - - - 1 - - - 1 - - - 1 - - - 1 - - - 1 - - - 1 - - - 1 - - - 1 - - - 1 - - - 1 - - - 1 - - - 1 - - - 1 - - - 1 - - - 1 - - - 1 - - - 1 - - - 1 - - - 1 - - - 1 - - - 1 - - - 1 - - - 1 - - - 1 - - - 1 - - - 1 - - - 1 - - - 1 - - - 1 - - - 1 - - - 1 - - - 1 - - - 1 - - - 1 - - - 1 - - - 1 - - - 1 - - - 1 - - - 1 - - - 1 - - - 1 - - - 1 - - - 1 - - - 1 - - - 1 - - - 1 - - - 1 - - - 1 - - - 1 - - - 1 - - - 1 - - - 1 - - - 1 - - - 1 - - - 1 - - - 1 - - - 1 - - - 1 - - - 1 - - - 1 - - - 1 - - - 1 - - - 1 - - - 1 - - - 1 - - - 1 - - - 1 - - - 1 - - - 1 - - - 1 - - - 1 - - \ No newline at end of file diff --git a/exploracion/datos/redes/co_citacion.graphml b/exploracion/datos/redes/co_citacion.graphml deleted file mode 100644 index c71c575..0000000 --- a/exploracion/datos/redes/co_citacion.graphml +++ /dev/null @@ -1,118 +0,0 @@ - - - - - - -co_citacion -True -24 - - Modes of Extraction, Unequal Exchange, and the Progressive -Underdevelopment of an Extreme Periphery: The Brazilian Amazon, -1600--1980 - 1984 - - - Towards an Ecological Theory of Unequal Exchange: Articulating -World System Theory and Ecological Economics - 1998 - - - Biophysical Trade Balance of Ecuador: A Biophysical Perspective -on Asymmetric Exchange - 2018 - - - Physical Trade Deficits of Brazil 1990--2015: A Material Flow -Analysis - 2019 - - - South-South Trade and Ecological Unequal Exchange: The Case of -India's Pharmaceutical Exports - 2020 - - - Is there a global environmental justice movement? - 2016 - - - Increased Food Production and Reduced Water Use Through -Teleconnection Between Producers and Consumers - 2017 - - - Food Miles, Carbon Labeling, and the Hidden Ecological Costs of -Northern Consumption - 2019 - - - The Material Footprint of Nations - 2015 - - - Rapidly Increasing Pressure on Commodity Agriculture in Latin -America - 2014 - - - A Critique of Material Flow Analysis as a Tool for Ecological -Unequal Exchange Research - 2019 - - - Postcolonial Critiques of the Treadmill of Production: The Case -of India-Brazil Mineral Trade - 2021 - - - On the Principles of Political Economy and Taxation - 1817 - - - The Ecology of Unequal Exchange - 1969 - - - Deuda ecológica del Perú con el mundo, 1990--2018 - 2020 - - - Comercio internacional y deuda ecológica en Bolivia - 2021 - - - Assessing Global Land Use: Balancing Consumption with -Sustainable Supply - 2015 - - - The Water Footprint Assessment Manual - 2011 - - - OpenAlex: Open Infrastructure for Bibliographic Data - 2024 - - - Extractivismo y deuda ecológica: revisitando el debate - 2017 - - - Notas sobre comercio y medio ambiente - 2010 - - - Huella ecológica y comercio Sur-Norte - 2015 - - - Global Ecological Footprint Report - 2020 - - - Tensiones Norte-Sur en políticas climáticas - 2022 - - \ No newline at end of file diff --git a/exploracion/datos/redes/co_word.graphml b/exploracion/datos/redes/co_word.graphml deleted file mode 100644 index 4b24e8e..0000000 --- a/exploracion/datos/redes/co_word.graphml +++ /dev/null @@ -1,664 +0,0 @@ - - - - - - -co_word -True -24 - - unequal_exchange - - - ecological exchange - - - periphery - - - world_system - - - ecological economics - - - throughput - - - biophysical_trade - - - ecuador - - - latin america - - - material_flow_analysis - - - brazil - - - south_south_trade - - - india - - - pharmaceuticals - - - environmental_justice - - - movement (music) - - - economic justice - - - political science - - - global justice - - - environmental ethics - - - sociology - - - political economy - - - law - - - aesthetics - - - philosophy - - - movements - - - telecoupling - - - virtual_water - - - food_miles - - - carbon_labeling - - - northern_consumption - - - northern europe - - - material_footprint - - - trade - - - land_use - - - commodity_agriculture - - - methodology_mfa - - - political ecology - - - postcolonial_critique - - - treadmill_of_production - - - minerals - - - comparative advantage - - - classical - - - ecology - - - marxism - - - ecological_debt - - - peru - - - comercio - - - america latina - - - bolivia - - - extractive_economy - - - global - - - methodology - - - supply chain - - - manual - - - open_data - - - bibliometrics - - - critica - - - 1 - - - 1 - - - 2 - - - 1 - - - 1 - - - 1 - - - 1 - - - 1 - - - 1 - - - 1 - - - 1 - - - 1 - - - 1 - - - 1 - - - 1 - - - 1 - - - 1 - - - 1 - - - 1 - - - 1 - - - 1 - - - 1 - - - 1 - - - 1 - - - 1 - - - 1 - - - 1 - - - 1 - - - 1 - - - 1 - - - 1 - - - 1 - - - 1 - - - 1 - - - 1 - - - 1 - - - 1 - - - 1 - - - 1 - - - 1 - - - 1 - - - 1 - - - 1 - - - 1 - - - 1 - - - 1 - - - 1 - - - 1 - - - 1 - - - 1 - - - 1 - - - 1 - - - 1 - - - 1 - - - 1 - - - 1 - - - 1 - - - 1 - - - 1 - - - 1 - - - 1 - - - 1 - - - 1 - - - 1 - - - 1 - - - 1 - - - 1 - - - 1 - - - 1 - - - 1 - - - 1 - - - 1 - - - 1 - - - 1 - - - 1 - - - 1 - - - 1 - - - 1 - - - 1 - - - 1 - - - 1 - - - 1 - - - 1 - - - 1 - - - 1 - - - 1 - - - 1 - - - 1 - - - 1 - - - 1 - - - 1 - - - 1 - - - 1 - - - 1 - - - 1 - - - 1 - - - 1 - - - 1 - - - 1 - - - 1 - - - 1 - - - 1 - - - 1 - - - 1 - - - 1 - - - 1 - - - 1 - - - 1 - - - 1 - - - 1 - - - 1 - - - 1 - - - 1 - - - 1 - - - 1 - - - 1 - - - 1 - - - 1 - - - 1 - - - 1 - - - 1 - - - 1 - - - 1 - - - 1 - - - 1 - - - 1 - - - 1 - - - 1 - - - 1 - - - 1 - - - 1 - - - 1 - - - 1 - - - 1 - - - 1 - - - 1 - - - 1 - - - 1 - - - 1 - - - 1 - - - 2 - - - 2 - - - 1 - - - 1 - - - 2 - - - 1 - - - 1 - - - 1 - - - 1 - - - 1 - - - 1 - - - 1 - - - 1 - - - 1 - - - 1 - - - 1 - - - 1 - - - 1 - - - 1 - - - 1 - - \ No newline at end of file diff --git a/exploracion/datos/redes/coupling_full.graphml b/exploracion/datos/redes/coupling_full.graphml deleted file mode 100644 index ba2b611..0000000 --- a/exploracion/datos/redes/coupling_full.graphml +++ /dev/null @@ -1,2477 +0,0 @@ - - - - - - - - -coupling -True -24 - - Modes of Extraction, Unequal Exchange, and the Progressive -Underdevelopment of an Extreme Periphery: The Brazilian Amazon, -1600--1980 - 1984 - True - - - Towards an Ecological Theory of Unequal Exchange: Articulating -World System Theory and Ecological Economics - 1998 - True - - - Biophysical Trade Balance of Ecuador: A Biophysical Perspective -on Asymmetric Exchange - 2018 - True - - - Physical Trade Deficits of Brazil 1990--2015: A Material Flow -Analysis - 2019 - True - - - South-South Trade and Ecological Unequal Exchange: The Case of -India's Pharmaceutical Exports - 2020 - True - - - Is there a global environmental justice movement? - 2016 - True - - - Increased Food Production and Reduced Water Use Through -Teleconnection Between Producers and Consumers - 2017 - True - - - Food Miles, Carbon Labeling, and the Hidden Ecological Costs of -Northern Consumption - 2019 - True - - - The Material Footprint of Nations - 2015 - True - - - Rapidly Increasing Pressure on Commodity Agriculture in Latin -America - 2014 - True - - - A Critique of Material Flow Analysis as a Tool for Ecological -Unequal Exchange Research - 2019 - True - - - Postcolonial Critiques of the Treadmill of Production: The Case -of India-Brazil Mineral Trade - 2021 - True - - - Ecological Unequal Exchange: International Trade and Uneven Utilization of Environmental Space in the World System - 2007 - False - - - Ecological Unequal Exchange: Consumption, Equity, and Unsustainable Structural Relationships within the Global Economy - 2007 - False - - - Ecologically Unequal Exchange, Ecological Debt, and Climate Justice - 2009 - False - - - Ecologically unequal exchange and ecological debt - 2016 - False - - - Classifying and valuing ecosystem services for urban planning - 2012 - False - - - Reversing the arrow of arrears: The concept of “ecological debt” and its value for environmental justice - 2014 - False - - - The concept of ecological debt: some steps towards an enriched sustainability paradigm - 2009 - False - - - Environmental Space, Equity and the Ecological Debt - 2012 - False - - - North—South Relations and the Ecological Debt: Asserting a Counter-Hegemonic Discourse - 2009 - False - - - ECOLOGICAL DEBT: - 2009 - False - - - Natural Resource Extraction, Armed Violence, and Environmental Degradation - 2010 - False - - - Ecological Debt and Property Rights on Carbon Sinks and Reservoirs - 2002 - False - - - The Transnational Organization of Production and Uneven Environmental Degradation and Change in the World Economy - 2009 - False - - - Ecological debts induced by heat extremes - 2024 - False - - - Ecological unequal exchange: quantifying emissions of toxic chemicals embodied in the global trade of chemicals, products, and waste - 2022 - False - - - Ecologically unequal exchange: A theory of global environmental <i>in</i> justice - 2019 - False - - - Just Sustainabilities - 2012 - False - - - Ecological unequal exchange: Evidence from imbalanced cropland soil erosion and agricultural value-added embodied in global agricultural trade - 2024 - False - - - Ecological Unequal Exchange - 2025 - False - - - Ecological unequal exchange between Turkey and the European Union: An assessment from value added perspective - 2021 - False - - - Linking ecological debt and ecologically unequal exchange: stocks, flows, and unequal sink appropriation - 2016 - False - - - Cumulative material flows provide indicators to quantify the ecological debt - 2016 - False - - - Ecological unequal exchange between China and European Union: An investigation from global value chains and carbon emissions viewpoint - 2023 - False - - - Ecological Debt: Exploring the Factors that Affect National Footprints - 2010 - False - - - Between activism and science: grassroots concepts for sustainability coined by Environmental Justice Organizations - 2014 - False - - - The Ecological Debt - 2002 - False - - - The ‘Environmentalism of the Poor’ revisited: Territory and place in disconnected glocal struggles - 2014 - False - - - Great expectations: the psychodynamics of ecological debt - 2012 - False - - - A modest proposal: global rationalization of ecological footprint to eliminate ecological debt - 2008 - False - - - An Ecological Footprint Approach to External Debt Relief - 2003 - False - - - Environmental Homogenization or Heterogenization? The Effects of Globalization on Carbon Dioxide Emissions, 1970–2014 - 2019 - False - - - Decolonizing the Atmosphere: The Climate Justice Movement on Climate Debt - 2017 - False - - - Engaging with Climate Change - 2012 - False - - - Unequal carbon exchanges: understanding pollution embodied in global trade - 2015 - False - - - Measuring environmental injustice: how ecological debt defines a radical change in the international legal system - 2016 - False - - - Ecological Unequal Exchange - 2021 - False - - - Ecological Unequal Exchange - 2019 - False - - - Ecological unequal exchange - 2023 - False - - - Contemporary Contradictions of the Global Development Project: geopolitics, global ecology and the ‘development climate’ - 2009 - False - - - The evolution of global trade and impacts on countries’ carbon trade imbalances - 2016 - False - - - Modelling Multi-regional Ecological Exchanges: The Case of UK and Africa - 2018 - False - - - The International Handbook of Environmental Sociology - 1997 - False - - - Land-use history impacts functional diversity across multiple trophic groups - 2020 - False - - - Breaking Ships in the World-System: An Analysis of Two Ship Breaking Capitals, Alang-Sosiya, India and Chittagong, Bangladesh - 2015 - False - - - Unpacking the politics of natural capital and economic metaphors in environmental policy discourse - 2015 - False - - - The semi-periphery and ecologically unequal exchange: carbon emissions and recursive exploitation - 2024 - False - - - Leading Towards a Level Playing Field, Repaying Ecological Debt, or Making Environmental Space: Three Stories about International Environmental Cooperation - 2005 - False - - - Public knowledge, attitudes and perception of ecological debt - 2018 - False - - - Expanding treadmill of production analysis within green criminology by integrating metabolic rift and ecological unequal exchange theories - 2020 - False - - - The impact of FDI on ecological unequal exchange in China’s manufacturing industry - 2023 - False - - - Two Sides of the Same Coin: A Synthesis of Economic and Ecological Unequal Exchange - 2025 - False - - - Environmental justice and ecological debt in Belgium: the UMICORE case - 2013 - False - - - Where have all the funds gone? Multiregional input-output analysis of the European Agricultural Fund for Rural Development - 2016 - False - - - Climate, violence, resource extraction and ecological debt: global implications of an assassination on South Africa's coal mining belt - 2022 - False - - - Ecological Debt - 2009 - False - - - Natural capital: The limiting factor - 2006 - False - - - Ecological Debt: An Integrating Concept for Socio-Environmental Change - 2010 - False - - - Circularity, entropy, ecological conflicts and LFFU - 2021 - False - - - Exploring the Impact of FDI and Technological Progress Path on Ecological Unequal Exchange within Manufacturing Industry in China - 2024 - False - - - Fueling Injustice: Globalization, Ecologically Unequal Exchange and Climate Change - 2007 - False - - - Improvement and application of the three-dimensional ecological footprint model - 2021 - False - - - Carbon Markets, Debt and Uneven Development - 2013 - False - - - Cut ecological debt or humanity is at risk - 2007 - False - - - Structural impediments to sustainable groundwater management in the High Plains Aquifer of western Kansas - 2014 - False - - - On the Principles of Political Economy and Taxation - 1817 - True - - - The Ecology of Unequal Exchange - 1969 - True - - - Deuda ecológica del Perú con el mundo, 1990--2018 - 2020 - True - - - Comercio internacional y deuda ecológica en Bolivia - 2021 - True - - - Assessing Global Land Use: Balancing Consumption with -Sustainable Supply - 2015 - True - - - The Water Footprint Assessment Manual - 2011 - True - - - OpenAlex: Open Infrastructure for Bibliographic Data - 2024 - True - - - Extractivismo y deuda ecológica: revisitando el debate - 2017 - True - - - Notas sobre comercio y medio ambiente - 2010 - True - - - Huella ecológica y comercio Sur-Norte - 2015 - True - - - Global Ecological Footprint Report - 2020 - True - - - Tensiones Norte-Sur en políticas climáticas - 2022 - True - - - Ecological Debt: The Health of the Planet and the Wealth of Nations - 2005 - False - - - Ecological Unequal Exchange - 2001 - False - - - The Concept of Ecological Debt: Its Meaning and Applicability in International Policy - 2009 - False - - - Ecological Debt: Global Warming and the Wealth of Nations - 2009 - False - - - Elaboration of the Concept of Ecological Debt - 2004 - False - - - Human's Consumption of Ecosystem Services and Ecological Debt in China - 2010 - False - - - An environmental war economy : the lessons of ecological debt and global warming - 2001 - False - - - Social Ecography: International Trade, Network Analysis and an Emmanuelian Conceptualization of Ecological Unequal Exchange - 2010 - False - - - Ecological Debt and Historical Responsibility Revisited: The case of climate change - 2012 - False - - - Preceding and governing measurements : an Emmanuelian conceptualization of ecological unequal exchange - 2014 - False - - - VLIR-BVO project 2003 'Elaboration of the concept of ecological debt' - 2004 - False - - - Leading Towards a Level Playing Field, Repaying Ecological Debt, or Making Environmental Space: Three Stories About International Environmental Cooperation - 2005 - False - - - Asymmetries : Conceptualizing Environmental Inequalities as Ecological Debt and Ecologically Unequal Exchange - 2017 - False - - - Eco-Sufficiency and Global Justice : Women Write Political Ecology - 2009 - False - - - Environmental justice and ecological debt in Belgium: The UMICORE case - 2013 - False - - - 4 - - - 5 - - - 5 - - - 6 - - - 2 - - - 12 - - - 5 - - - 4 - - - 7 - - - 1 - - - 8 - - - 1 - - - 2 - - - 8 - - - 9 - - - 1 - - - 71 - - - 33 - - - 1 - - - 1 - - - 3 - - - 7 - - - 3 - - - 3 - - - 1 - - - 1 - - - 1 - - - 3 - - - 1 - - - 1 - - - 8 - - - 6 - - - 1 - - - 1 - - - 2 - - - 18 - - - 3 - - - 3 - - - 2 - - - 5 - - - 1 - - - 30 - - - 10 - - - 2 - - - 3 - - - 2 - - - 7 - - - 2 - - - 17 - - - 1 - - - 12 - - - 2 - - - 2 - - - 6 - - - 2 - - - 2 - - - 5 - - - 1 - - - 2 - - - 1 - - - 4 - - - 5 - - - 1 - - - 6 - - - 6 - - - 1 - - - 2 - - - 6 - - - 3 - - - 2 - - - 2 - - - 1 - - - 9 - - - 7 - - - 1 - - - 1 - - - 8 - - - 4 - - - 13 - - - 2 - - - 1 - - - 3 - - - 3 - - - 10 - - - 1 - - - 24 - - - 1 - - - 16 - - - 3 - - - 2 - - - 9 - - - 2 - - - 1 - - - 5 - - - 2 - - - 4 - - - 2 - - - 10 - - - 2 - - - 7 - - - 1 - - - 6 - - - 6 - - - 1 - - - 5 - - - 5 - - - 4 - - - 2 - - - 2 - - - 3 - - - 12 - - - 4 - - - 1 - - - 1 - - - 12 - - - 3 - - - 2 - - - 4 - - - 3 - - - 10 - - - 14 - - - 1 - - - 15 - - - 3 - - - 3 - - - 9 - - - 3 - - - 4 - - - 2 - - - 1 - - - 5 - - - 4 - - - 1 - - - 5 - - - 5 - - - 1 - - - 2 - - - 2 - - - 6 - - - 3 - - - 3 - - - 2 - - - 1 - - - 34 - - - 6 - - - 1 - - - 8 - - - 4 - - - 4 - - - 1 - - - 2 - - - 1 - - - 2 - - - 1 - - - 10 - - - 3 - - - 1 - - - 9 - - - 3 - - - 4 - - - 3 - - - 1 - - - 3 - - - 1 - - - 2 - - - 2 - - - 1 - - - 3 - - - 3 - - - 1 - - - 9 - - - 1 - - - 2 - - - 1 - - - 4 - - - 1 - - - 2 - - - 1 - - - 1 - - - 2 - - - 1 - - - 1 - - - 1 - - - 1 - - - 2 - - - 1 - - - 2 - - - 1 - - - 1 - - - 1 - - - 1 - - - 1 - - - 9 - - - 7 - - - 5 - - - 1 - - - 5 - - - 1 - - - 2 - - - 16 - - - 4 - - - 26 - - - 3 - - - 2 - - - 3 - - - 4 - - - 3 - - - 1 - - - 1 - - - 1 - - - 4 - - - 7 - - - 1 - - - 7 - - - 1 - - - 1 - - - 5 - - - 2 - - - 7 - - - 3 - - - 6 - - - 7 - - - 3 - - - 1 - - - 7 - - - 5 - - - 4 - - - 7 - - - 1 - - - 1 - - - 1 - - - 2 - - - 2 - - - 2 - - - 1 - - - 1 - - - 1 - - - 1 - - - 7 - - - 1 - - - 2 - - - 1 - - - 2 - - - 6 - - - 11 - - - 1 - - - 10 - - - 3 - - - 2 - - - 11 - - - 3 - - - 6 - - - 1 - - - 2 - - - 5 - - - 2 - - - 3 - - - 1 - - - 3 - - - 3 - - - 1 - - - 2 - - - 1 - - - 3 - - - 2 - - - 4 - - - 2 - - - 2 - - - 7 - - - 4 - - - 2 - - - 6 - - - 6 - - - 8 - - - 6 - - - 2 - - - 4 - - - 1 - - - 2 - - - 2 - - - 1 - - - 1 - - - 1 - - - 6 - - - 1 - - - 6 - - - 3 - - - 23 - - - 3 - - - 2 - - - 14 - - - 2 - - - 6 - - - 2 - - - 2 - - - 2 - - - 12 - - - 3 - - - 9 - - - 1 - - - 7 - - - 7 - - - 1 - - - 4 - - - 1 - - - 14 - - - 5 - - - 2 - - - 2 - - - 2 - - - 11 - - - 8 - - - 1 - - - 1 - - - 11 - - - 4 - - - 2 - - - 1 - - - 1 - - - 2 - - - 1 - - - 1 - - - 1 - - - 1 - - - 1 - - - 1 - - - 1 - - - 1 - - - 1 - - - 1 - - - 1 - - - 9 - - - 5 - - - 23 - - - 3 - - - 8 - - - 1 - - - 2 - - - 2 - - - 17 - - - 2 - - - 13 - - - 1 - - - 10 - - - 10 - - - 1 - - - 8 - - - 5 - - - 13 - - - 11 - - - 6 - - - 3 - - - 3 - - - 1 - - - 6 - - - 4 - - - 10 - - - 1 - - - 7 - - - 1 - - - 1 - - - 20 - - - 3 - - - 6 - - - 7 - - - 2 - - - 1 - - - 3 - - - 3 - - - 4 - - - 4 - - - 3 - - - 2 - - - 3 - - - 3 - - - 1 - - - 2 - - - 8 - - - 1 - - - 1 - - - 3 - - - 6 - - - 5 - - - 2 - - - 2 - - - 2 - - - 5 - - - 5 - - - 5 - - - 4 - - - 5 - - - 3 - - - 1 - - - 1 - - - 3 - - - 6 - - - 1 - - - 2 - - - 2 - - - 3 - - - 7 - - - 1 - - - 18 - - - 2 - - - 1 - - - 6 - - - 3 - - - 6 - - - 3 - - - 8 - - - 8 - - - 1 - - - 7 - - - 5 - - - 9 - - - 1 - - - 4 - - - 9 - - - 2 - - - 4 - - - 2 - - - 1 - - - 1 - - - 4 - - - 5 - - - 7 - - - 2 - - - 18 - - - 4 - - - 6 - - - 3 - - - 1 - - - 1 - - - 2 - - - 3 - - - 1 - - - 2 - - - 2 - - - 8 - - - 1 - - - 1 - - - 2 - - - 1 - - - 1 - - - 3 - - - 1 - - - 1 - - - 1 - - - 1 - - - 1 - - - 1 - - - 2 - - - 1 - - - 1 - - - 1 - - - 42 - - - 3 - - - 3 - - - 2 - - - 5 - - - 4 - - - 4 - - - 2 - - - 2 - - - 1 - - - 4 - - - 2 - - - 13 - - - 1 - - - 6 - - - 1 - - - 2 - - - 7 - - - 5 - - - 3 - - - 6 - - - 6 - - - 3 - - - 2 - - - 1 - - - 1 - - - 1 - - - 2 - - - 1 - - - 11 - - - 3 - - - 5 - - - 2 - - - 1 - - - 1 - - - 2 - - - 4 - - - 1 - - - 1 - - - 1 - - - 1 - - - 2 - - - 1 - - - 1 - - - 1 - - - 1 - - - 2 - - - 3 - - - 2 - - - 2 - - - 2 - - - 11 - - - 4 - - - 4 - - - 5 - - - 4 - - - 5 - - - 5 - - - 1 - - - 1 - - - 1 - - - 2 - - - 4 - - - 4 - - - 7 - - - 1 - - - 1 - - - 1 - - - 1 - - - 1 - - - 2 - - - 3 - - - 3 - - - 1 - - - 1 - - - 2 - - - 2 - - - 26 - - - 9 - - - 10 - - - 2 - - - 3 - - - 3 - - - 2 - - - 4 - - - 2 - - - 3 - - - 2 - - - 7 - - - 1 - - - 1 - - - 2 - - - 1 - - - 1 - - - 1 - - - 2 - - - 36 - - - 2 - - - 2 - - - 2 - - - 1 - - - 1 - - - 1 - - - 2 - - - 2 - - - 1 - - - 2 - - - 4 - - - 4 - - - 1 - - - 6 - - - 2 - - - 2 - - - 2 - - - 2 - - - 1 - - - 1 - - - 1 - - - 2 - - - 2 - - - 1 - - - 2 - - - 4 - - - 4 - - - 1 - - - 6 - - - 2 - - - 1 - - - 1 - - - 1 - - - 1 - - - 1 - - - 8 - - - 7 - - - 2 - - - 3 - - - 3 - - - 4 - - - 2 - - - 1 - - - 2 - - - 6 - - - 1 - - - 2 - - - 1 - - - 7 - - - 2 - - - 1 - - - 2 - - - 3 - - - 1 - - - 1 - - - 1 - - - 3 - - - 5 - - - 4 - - - 1 - - - 5 - - - 1 - - - 2 - - - 3 - - - 1 - - - 1 - - - 4 - - - 1 - - - 2 - - - 1 - - - 2 - - - 2 - - - 5 - - - 1 - - - 4 - - - 1 - - - 1 - - - 3 - - - 3 - - - 1 - - - 1 - - - 1 - - - 1 - - - 1 - - - 1 - - - 1 - - - 3 - - - 2 - - - 3 - - - 4 - - - 6 - - - 3 - - - 2 - - - 1 - - \ No newline at end of file diff --git a/exploracion/datos/semillas_ied.bib b/exploracion/datos/semillas_ied.bib deleted file mode 100644 index 18ed67c..0000000 --- a/exploracion/datos/semillas_ied.bib +++ /dev/null @@ -1,333 +0,0 @@ -% ===================================================================== -% semillas_ied.bib — corpus semilla sintético para el caso de uso IED -% ===================================================================== -% NO son papers reales. Autores, títulos, DOIs y journals son inventados -% pero plausibles, modelados a partir del patrón observado en la -% literatura real sobre intercambio ecológicamente desigual, deuda -% ecológica y huella ecológica transferida. -% -% Estructura intencional del corpus semilla: -% - Cluster "marcos teóricos" (Bunker-style, Hornborg-style): ~5 refs -% - Cluster "estudios empíricos IED" Global South-led: ~8 refs -% - Cluster "estudios empíricos IED" Global North-led: ~6 refs -% - Cluster "metodología / materiales": ~4 refs -% - Cluster "crítica y tensiones internas": ~3 refs -% - Refs "huérfanas" (sin keywords/abstract) para testear parser: ~4 refs -% -% CAMPO EXTRA vs BibTeX estándar: -% - affiliation = {Pais}: país principal de afiliación del paper. -% Lo lee 02_load_bibtex.py y lo mapea a authors_affiliations para -% permitir análisis de asimetrías Norte-Sur. No es un campo BibTeX -% estándar; es metadata específica de esta sandbox. -% ===================================================================== - -@article{bunker1984dep, - author = {Bunker, Stephen G.}, - title = {Modes of Extraction, Unequal Exchange, and the Progressive - Underdevelopment of an Extreme Periphery: The Brazilian Amazon, - 1600--1980}, - journal = {American Journal of Sociology}, - year = {1984}, - volume = {89}, - number = {5}, - pages = {1017--1064}, - doi = {10.1086/227972}, - keywords = {unequal exchange, ecological exchange, periphery, world-system}, - abstract = {We develop a framework for analyzing unequal ecological exchange - between core and peripheral regions, drawing on the case of the - Brazilian Amazon.}, - affiliation = {US}, -} - -@article{hornborg1998ecology, - author = {Hornborg, Alf}, - title = {Towards an Ecological Theory of Unequal Exchange: Articulating - World System Theory and Ecological Economics}, - journal = {Ecological Economics}, - year = {1998}, - volume = {25}, - number = {1}, - pages = {127--136}, - doi = {10.1016/S0921-8009(97)00100-6}, - keywords = {unequal exchange, ecological economics, world-system, throughput}, - abstract = {We articulate world-system theory and ecological economics to - develop a biophysical theory of unequal exchange.}, - affiliation = {SE}, -} - -@article{ricardo1817principles, - author = {Ricardo, David}, - title = {On the Principles of Political Economy and Taxation}, - year = {1817}, - keywords = {political economy, comparative advantage, classical}, - affiliation = {UK}, - % Sin journal, sin doi: referencia clásica antigua. Testea el parser. -} - -@incollection{wallis1969, - author = {Wallis, Victor}, - title = {The Ecology of Unequal Exchange}, - booktitle = {Environments and Societies}, - publisher = {Macmillan}, - year = {1969}, - keywords = {ecology, unequal exchange, marxism}, - affiliation = {US}, -} - -@article{aldas2018biophysical, - author = {Aldas, C. and {\'A}lvarez, M. and Orta, L.}, - title = {Biophysical Trade Balance of Ecuador: A Biophysical Perspective - on Asymmetric Exchange}, - journal = {Ecological Economics}, - year = {2018}, - volume = {144}, - pages = {137--152}, - doi = {10.1016/j.ecolecon.2017.08.001}, - keywords = {biophysical trade, Ecuador, unequal exchange, Latin America}, - abstract = {We compute the physical trade balance of Ecuador to expose - asymmetric ecological exchange.}, - affiliation = {EC}, -} - -@article{pereira2019physical, - author = {Pereira, J. and Silva, R. and Costa, P.}, - title = {Physical Trade Deficits of Brazil 1990--2015: A Material Flow - Analysis}, - journal = {Journal of Industrial Ecology}, - year = {2019}, - volume = {23}, - number = {4}, - pages = {812--826}, - doi = {10.1111/jiec.12830}, - keywords = {material flow analysis, Brazil, biophysical trade, periphery}, - abstract = {Material flow analysis applied to Brazilian trade shows persistent - physical deficits with the Global North.}, - affiliation = {BR}, -} - -@article{reyes2020deuda, - author = {Reyes, G. and Carrasco, H.}, - title = {Deuda ecol{\'o}gica del Per{\'u} con el mundo, 1990--2018}, - journal = {Ecolog{\'i}a Pol{\'i}tica}, - year = {2020}, - number = {59}, - pages = {45--62}, - keywords = {deuda ecol{\'o}gica, Per{\'u}, comercio, Am{\'e}rica Latina}, - abstract = {Estimaci{\'o}n de la deuda ecol{\'o}gica del Per{\'u} mediante - an{\'a}lisis de flujos de materiales y huella ecol{\'o}gica.}, - affiliation = {PE}, - % Sin doi: revista latinoamericana no siempre indexada. -} - -@article{castro2021comercio, - author = {Castro, V. and Berm{\'u}dez, A.}, - title = {Comercio internacional y deuda ecol{\'o}gica en Bolivia}, - journal = {Revista Boliviana de Investigaci{\'o}n}, - year = {2021}, - volume = {12}, - pages = {33--58}, - keywords = {deuda ecol{\'o}gica, Bolivia, comercio, extractivismo}, - affiliation = {BO}, -} - -@article{khor2020south, - author = {Khor, M. and Narayanan, S.}, - title = {South-South Trade and Ecological Unequal Exchange: The Case of - India's Pharmaceutical Exports}, - journal = {Third World Quarterly}, - year = {2020}, - volume = {41}, - number = {7}, - pages = {1234--1250}, - doi = {10.1080/01436597.2020.1723088}, - keywords = {South-South trade, India, unequal exchange, pharmaceuticals}, - abstract = {We challenge the assumption that South-South trade is intrinsically - more ecological, examining the Indian pharmaceutical sector.}, - affiliation = {IN}, -} - -@article{martinez2014ecological, - author = {Mart{\'i}nez-Alier, Joan and Temper, Leah and Del Bene, Daniela - and Scheidel, Arnim}, - title = {Is There a Global Environmental Justice Movement?}, - journal = {The Journal of Peasant Studies}, - year = {2016}, - volume = {43}, - number = {3}, - pages = {731--755}, - doi = {10.1080/03066150.2016.1141198}, - keywords = {environmental justice, ecological distribution, movements}, - abstract = {We map the global environmental justice movement and its tensions - with Marxist and post-colonial political ecology.}, - affiliation = {ES}, -} - -@article{davis2018telecoupling, - author = {Davis, K. F. and Rulli, M. C. and Seveso, A. and D'Odorico, P.}, - title = {Increased Food Production and Reduced Water Use Through - Teleconnection Between Producers and Consumers}, - journal = {Earth System Dynamics}, - year = {2017}, - volume = {8}, - number = {2}, - pages = {435--452}, - doi = {10.5194/esd-8-435-2017}, - keywords = {telecoupling, virtual water, food trade, teleconnections}, - abstract = {We document increased teleconnections between food producers and - consumers globally, with implications for water resources.}, - affiliation = {US}, -} - -@article{heikkine2019food, - author = {Heikkine{\"a}, T. and Pietola, K.}, - title = {Food Miles, Carbon Labeling, and the Hidden Ecological Costs of - Northern Consumption}, - journal = {Environmental Politics}, - year = {2019}, - volume = {28}, - number = {2}, - pages = {245--264}, - doi = {10.1080/09644016.2019.1549779}, - keywords = {food miles, carbon labeling, consumption, Northern Europe}, - abstract = {We examine the political economy of carbon labeling in food trade - and the hidden ecological costs of Northern consumption.}, - affiliation = {FI}, -} - -@article{wiedmann2015footprint, - author = {Wiedmann, T. O. and Schandl, H. and Lenzen, M. and Moran, D. and - Suh, S. and West, J. and Kanemoto, K.}, - title = {The Material Footprint of Nations}, - journal = {Proceedings of the National Academy of Sciences}, - year = {2015}, - volume = {112}, - number = {20}, - pages = {6271--6276}, - doi = {10.1073/pnas.1220362110}, - keywords = {material footprint, MRIO, consumption, trade}, - abstract = {We compute the material footprint of nations using multi-region - input-output analysis.}, - affiliation = {AU}, -} - -@article{kastner2014regime, - author = {Kastner, T. and Erb, K.-H. and Haberl, H.}, - title = {Rapidly Increasing Pressure on Commodity Agriculture in Latin - America}, - journal = {Environmental Research Letters}, - year = {2014}, - volume = {9}, - number = {10}, - pages = {104005}, - doi = {10.1088/1748-9326/9/10/104005}, - keywords = {land use, commodity agriculture, Latin America, telecoupling}, - abstract = {We map growing pressure on commodity agriculture in Latin America - driven by Northern demand.}, - affiliation = {AT}, -} - -@article{bringezu2015assessing, - author = {Bringezu, S. and Schuetz, H. and Pengue, W. and O'Brien, M. and - Garcia, F. and Sims, R. and Wirtz, D.}, - title = {Assessing Global Land Use: Balancing Consumption with - Sustainable Supply}, - year = {2015}, - journal = {UNEP Report}, - keywords = {land use, global, methodology, supply chain}, - affiliation = {DE}, - % Sin doi, sin abstract: testea el parser. -} - -@article{hoekstra2011water, - author = {Hoekstra, A. Y. and Chapagain, A. K. and Aldaya, M. M. and - Mekonnen, M. M.}, - title = {The Water Footprint Assessment Manual}, - year = {2011}, - publisher = {Earthscan}, - keywords = {water footprint, manual, methodology}, - affiliation = {NL}, -} - -@misc{openalex2024, - author = {{OurResearch}}, - title = {OpenAlex: Open Infrastructure for Bibliographic Data}, - year = {2024}, - howpublished = {Online}, - note = {https://openalex.org}, - keywords = {openalex, open data, bibliometrics}, - affiliation = {US}, -} - -@article{warrior2019critique, - author = {Warrior, R. and {\'A}lvarez, L.}, - title = {A Critique of Material Flow Analysis as a Tool for Ecological - Unequal Exchange Research}, - journal = {Capitalism Nature Socialism}, - year = {2019}, - volume = {30}, - number = {4}, - pages = {78--94}, - doi = {10.1080/10455752.2018.1556455}, - keywords = {methodology critique, MFA, unequal exchange, political ecology}, - abstract = {We critically examine methodological assumptions in MFA-based IED - research and propose a political-ecology framing.}, - affiliation = {AR}, -} - -@article{frey2021postcolonial, - author = {Frey, B. and Subramaniam, B.}, - title = {Postcolonial Critiques of the Treadmill of Production: The Case - of India-Brazil Mineral Trade}, - journal = {Journal of World-Systems Research}, - year = {2021}, - volume = {27}, - number = {2}, - pages = {312--340}, - doi = {10.5195/jwsr.2021.1011}, - keywords = {postcolonial, treadmill of production, minerals, India, Brazil}, - abstract = {We bring postcolonial theory to bear on treadmill-of-production - analyses of mineral trade between India and Brazil.}, - affiliation = {US}, -} - -@article{lopez2017extractivism, - author = {L{\'o}pez, A. and V{\'a}zquez, R.}, - title = {Extractivismo y deuda ecol{\'o}gica: revisitando el debate}, - journal = {Ecolog{\'i}a Pol{\'i}tica}, - year = {2017}, - number = {53}, - pages = {12--28}, - keywords = {extractivismo, deuda ecol{\'o}gica, Am{\'e}rica Latina, cr{\'i}tica}, - abstract = {Repaso cr{\'i}tico de la literatura latinoamericana sobre - extractivismo y deuda ecol{\'o}gica.}, - affiliation = {AR}, -} - -@article{anomimo2010, - author = {Anonymous, A.}, - title = {Notas sobre comercio y medio ambiente}, - year = {2010}, - affiliation = {MX}, -} - -@article{garcia2015, - author = {Garc{\'i}a, M.}, - title = {Huella ecol{\'o}gica y comercio Sur-Norte}, - year = {2015}, - journal = {Cuadernos Latinoamericanos}, - affiliation = {CO}, -} - -@misc{ecofootprint2020, - title = {Global Ecological Footprint Report}, - year = {2020}, - howpublished = {Global Footprint Network}, - affiliation = {US}, -} - -@article{anomimo2022, - author = {Smith, J. and Patel, R.}, - title = {Tensiones Norte-Sur en pol{\'i}ticas clim{\'a}ticas}, - year = {2022}, - affiliation = {IN}, -} diff --git a/exploracion/datos/semillas_ied.csv b/exploracion/datos/semillas_ied.csv deleted file mode 100644 index 53bde6e..0000000 --- a/exploracion/datos/semillas_ied.csv +++ /dev/null @@ -1,52 +0,0 @@ -id,doi,title,year,abstract,authors_raw,authors_id,authors_affiliations,keywords_raw,keywords_id,references_doi,source,language,is_seed -10.1086/227972,10.1086/227972,"Modes of Extraction, Unequal Exchange, and the Progressive -Underdevelopment of an Extreme Periphery: The Brazilian Amazon, -1600--1980",1984,"We develop a framework for analyzing unequal ecological exchange -between core and peripheral regions, drawing on the case of the -Brazilian Amazon.","Bunker, Stephen G.",bunker_stephen_g,Paper affiliation: US,unequal exchange; ecological exchange; periphery; world-system,unequal_exchange; ecological_exchange; periphery; world-system,,American Journal of Sociology,,True -10.1016/S0921-8009(97)00100-6,10.1016/S0921-8009(97)00100-6,"Towards an Ecological Theory of Unequal Exchange: Articulating -World System Theory and Ecological Economics",1998,"We articulate world-system theory and ecological economics to -develop a biophysical theory of unequal exchange.","Hornborg, Alf",hornborg_alf,Paper affiliation: SE,unequal exchange; ecological economics; world-system; throughput,unequal_exchange; ecological_economics; world-system; throughput,,Ecological Economics,,True -bib:ricardo1817principles,,On the Principles of Political Economy and Taxation,1817,,"Ricardo, David",ricardo_david,Paper affiliation: UK,political economy; comparative advantage; classical,political_economy; comparative_advantage; classical,,,,True -bib:wallis1969,,The Ecology of Unequal Exchange,1969,,"Wallis, Victor",wallis_victor,Paper affiliation: US,ecology; unequal exchange; marxism,ecology; unequal_exchange; marxism,,Environments and Societies,,True -10.1016/j.ecolecon.2017.08.001,10.1016/j.ecolecon.2017.08.001,"Biophysical Trade Balance of Ecuador: A Biophysical Perspective -on Asymmetric Exchange",2018,"We compute the physical trade balance of Ecuador to expose -asymmetric ecological exchange.","Aldas, C.; Álvarez, M.; Orta, L.",aldas_c; álvarez_m; orta_l,Paper affiliation: EC,biophysical trade; Ecuador; unequal exchange; Latin America,biophysical_trade; ecuador; unequal_exchange; latin_america,,Ecological Economics,,True -10.1111/jiec.12830,10.1111/jiec.12830,"Physical Trade Deficits of Brazil 1990--2015: A Material Flow -Analysis",2019,"Material flow analysis applied to Brazilian trade shows persistent -physical deficits with the Global North.","Pereira, J.; Silva, R.; Costa, P.",pereira_j; silva_r; costa_p,Paper affiliation: BR,material flow analysis; Brazil; biophysical trade; periphery,material_flow_analysis; brazil; biophysical_trade; periphery,,Journal of Industrial Ecology,,True -bib:reyes2020deuda,,"Deuda ecológica del Perú con el mundo, 1990--2018",2020,"Estimación de la deuda ecológica del Perú mediante -análisis de flujos de materiales y huella ecológica.","Reyes, G.; Carrasco, H.",reyes_g; carrasco_h,Paper affiliation: PE,deuda ecológica; Perú; comercio; América Latina,deuda_ecológica; perú; comercio; américa_latina,,Ecología Política,,True -bib:castro2021comercio,,Comercio internacional y deuda ecológica en Bolivia,2021,,"Castro, V.; Bermúdez, A.",castro_v; bermúdez_a,Paper affiliation: BO,deuda ecológica; Bolivia; comercio; extractivismo,deuda_ecológica; bolivia; comercio; extractivismo,,Revista Boliviana de Investigación,,True -10.1080/01436597.2020.1723088,10.1080/01436597.2020.1723088,"South-South Trade and Ecological Unequal Exchange: The Case of -India's Pharmaceutical Exports",2020,"We challenge the assumption that South-South trade is intrinsically -more ecological, examining the Indian pharmaceutical sector.","Khor, M.; Narayanan, S.",khor_m; narayanan_s,Paper affiliation: IN,South-South trade; India; unequal exchange; pharmaceuticals,south-south_trade; india; unequal_exchange; pharmaceuticals,,Third World Quarterly,,True -10.1080/03066150.2016.1141198,10.1080/03066150.2016.1141198,Is There a Global Environmental Justice Movement?,2016,"We map the global environmental justice movement and its tensions -with Marxist and post-colonial political ecology.","Martínez-Alier, Joan; Temper, Leah; Del Bene, Daniela; Scheidel, Arnim",martínezalier_joan; temper_leah; del_bene_daniela; scheidel_arnim,Paper affiliation: ES,environmental justice; ecological distribution; movements,environmental_justice; ecological_distribution; movements,,The Journal of Peasant Studies,,True -10.5194/esd-8-435-2017,10.5194/esd-8-435-2017,"Increased Food Production and Reduced Water Use Through -Teleconnection Between Producers and Consumers",2017,"We document increased teleconnections between food producers and -consumers globally, with implications for water resources.","Davis, K. F.; Rulli, M. C.; Seveso, A.; D'Odorico, P.",davis_k_f; rulli_m_c; seveso_a; dodorico_p,Paper affiliation: US,telecoupling; virtual water; food trade; teleconnections,telecoupling; virtual_water; food_trade; teleconnections,,Earth System Dynamics,,True -10.1080/09644016.2019.1549779,10.1080/09644016.2019.1549779,"Food Miles, Carbon Labeling, and the Hidden Ecological Costs of -Northern Consumption",2019,"We examine the political economy of carbon labeling in food trade -and the hidden ecological costs of Northern consumption.","Heikkineá, T.; Pietola, K.",heikkineá_t; pietola_k,Paper affiliation: FI,food miles; carbon labeling; consumption; Northern Europe,food_miles; carbon_labeling; consumption; northern_europe,,Environmental Politics,,True -10.1073/pnas.1220362110,10.1073/pnas.1220362110,The Material Footprint of Nations,2015,"We compute the material footprint of nations using multi-region -input-output analysis.","Wiedmann, T. O.; Schandl, H.; Lenzen, M.; Moran, D.; Suh, S.; West, J.; Kanemoto, K.",wiedmann_t_o; schandl_h; lenzen_m; moran_d; suh_s; west_j; kanemoto_k,Paper affiliation: AU,material footprint; MRIO; consumption; trade,material_footprint; mrio; consumption; trade,,Proceedings of the National Academy of Sciences,,True -10.1088/1748-9326/9/10/104005,10.1088/1748-9326/9/10/104005,"Rapidly Increasing Pressure on Commodity Agriculture in Latin -America",2014,"We map growing pressure on commodity agriculture in Latin America -driven by Northern demand.","Kastner, T.; Erb, K.-H.; Haberl, H.",kastner_t; erb_kh; haberl_h,Paper affiliation: AT,land use; commodity agriculture; Latin America; telecoupling,land_use; commodity_agriculture; latin_america; telecoupling,,Environmental Research Letters,,True -bib:bringezu2015assessing,,"Assessing Global Land Use: Balancing Consumption with -Sustainable Supply",2015,,"Bringezu, S.; Schuetz, H.; Pengue, W.; O'Brien, M.; Garcia, F.; Sims, R.; Wirtz, D.",bringezu_s; schuetz_h; pengue_w; obrien_m; garcia_f; sims_r; wirtz_d,Paper affiliation: DE,land use; global; methodology; supply chain,land_use; global; methodology; supply_chain,,UNEP Report,,True -bib:hoekstra2011water,,The Water Footprint Assessment Manual,2011,,"Hoekstra, A. Y.; Chapagain, A. K.; Aldaya, M. M.; Mekonnen, M. M.",hoekstra_a_y; chapagain_a_k; aldaya_m_m; mekonnen_m_m,Paper affiliation: NL,water footprint; manual; methodology,water_footprint; manual; methodology,,Earthscan,,True -bib:openalex2024,,OpenAlex: Open Infrastructure for Bibliographic Data,2024,,{OurResearch},ourresearch_,Paper affiliation: US,openalex; open data; bibliometrics,openalex; open_data; bibliometrics,,,,True -10.1080/10455752.2018.1556455,10.1080/10455752.2018.1556455,"A Critique of Material Flow Analysis as a Tool for Ecological -Unequal Exchange Research",2019,"We critically examine methodological assumptions in MFA-based IED -research and propose a political-ecology framing.","Warrior, R.; Álvarez, L.",warrior_r; álvarez_l,Paper affiliation: AR,methodology critique; MFA; unequal exchange; political ecology,methodology_critique; mfa; unequal_exchange; political_ecology,,Capitalism Nature Socialism,,True -10.5195/jwsr.2021.1011,10.5195/jwsr.2021.1011,"Postcolonial Critiques of the Treadmill of Production: The Case -of India-Brazil Mineral Trade",2021,"We bring postcolonial theory to bear on treadmill-of-production -analyses of mineral trade between India and Brazil.","Frey, B.; Subramaniam, B.",frey_b; subramaniam_b,Paper affiliation: US,postcolonial; treadmill of production; minerals; India; Brazil,postcolonial; treadmill_of_production; minerals; india; brazil,,Journal of World-Systems Research,,True -bib:lopez2017extractivism,,Extractivismo y deuda ecológica: revisitando el debate,2017,"Repaso crítico de la literatura latinoamericana sobre -extractivismo y deuda ecológica.","López, A.; Vázquez, R.",lópez_a; vázquez_r,Paper affiliation: AR,extractivismo; deuda ecológica; América Latina; crítica,extractivismo; deuda_ecológica; américa_latina; crítica,,Ecología Política,,True -bib:anomimo2010,,Notas sobre comercio y medio ambiente,2010,,"Anonymous, A.",anonymous_a,Paper affiliation: MX,,,,,,True -bib:garcia2015,,Huella ecológica y comercio Sur-Norte,2015,,"García, M.",garcía_m,Paper affiliation: CO,,,,Cuadernos Latinoamericanos,,True -bib:ecofootprint2020,,Global Ecological Footprint Report,2020,,,,Paper affiliation: US,,,,,,True -bib:anomimo2022,,Tensiones Norte-Sur en políticas climáticas,2022,,"Smith, J.; Patel, R.",smith_j; patel_r,Paper affiliation: IN,,,,,,True diff --git a/exploracion/datos/thesaurus_ied.json b/exploracion/datos/thesaurus_ied.json deleted file mode 100644 index 05cec83..0000000 --- a/exploracion/datos/thesaurus_ied.json +++ /dev/null @@ -1,140 +0,0 @@ -{ - "_meta": { - "purpose": "Thesaurus multilingüe mínimo para el campo IED (intercambio ecológicamente desigual). Usado por la sandbox de exploracion/ para colapsar keywords equivalentes en en/es/pt a un mismo concepto canónico.", - "scope": "IED, deuda ecológica, world-system, footprint, telecoupling, justicia ambiental, extractivismo.", - "limitations": [ - "Curado a mano a partir de los términos que aparecen en el corpus semilla (exploracion/datos/semillas_ied.bib).", - "No es exhaustivo: si un paper usa un término fuera de este thesaurus, queda como nodo propio en el grafo de co-word.", - "Variantes ortográficas y morfológicas no se infieren: hay que listar la variante explícita (ej: 'huella ecológica' Y 'huella ecologica').", - "Idiomas soportados: español (es), inglés (en), portugués (pt). Otros idiomas quedan como nodo propio." - ], - "extension": "Para extender: agregar entradas siguiendo el formato. Las claves canónicas son las que aparecen como nodos finales en el grafo; los aliases son las formas originales que se colapsan." - }, - "concepts": { - "unequal_exchange": { - "aliases_en": ["unequal exchange", "ecological unequal exchange", "unequal ecological exchange"], - "aliases_es": ["intercambio desigual", "intercambio ecológicamente desigual", "intercambio ecologico desigual"], - "aliases_pt": ["troca desigual", "troca ecológica desigual", "troca ecologica desigual"] - }, - "ecological_debt": { - "aliases_en": ["ecological debt", "ecological deficit"], - "aliases_es": ["deuda ecológica", "deuda ecologica"], - "aliases_pt": ["dívida ecológica", "divida ecologica"] - }, - "ecological_footprint": { - "aliases_en": ["ecological footprint", "footprint", "footprint analysis"], - "aliases_es": ["huella ecológica", "huella ecologica"], - "aliases_pt": ["pegada ecológica", "pegada ecologica"] - }, - "material_footprint": { - "aliases_en": ["material footprint", "MRIO", "multi-region input-output"], - "aliases_es": ["huella material", "huella de materiales"], - "aliases_pt": ["pegada material"] - }, - "material_flow_analysis": { - "aliases_en": ["material flow analysis", "MFA", "material flows"], - "aliases_es": ["análisis de flujos de materiales", "analisis de flujos de materiales"], - "aliases_pt": ["análise de fluxos de materiais", "analise de fluxos de materiais"] - }, - "telecoupling": { - "aliases_en": ["telecoupling", "teleconnection", "teleconnections"], - "aliases_es": ["teleacoplamiento"], - "aliases_pt": ["teleacoplamento"] - }, - "biophysical_trade": { - "aliases_en": ["biophysical trade", "physical trade", "biophysical trade balance"], - "aliases_es": ["comercio biofísico", "comercio biophysico", "balanza comercial física"], - "aliases_pt": ["comércio biofísico", "comercio biophysico"] - }, - "virtual_water": { - "aliases_en": ["virtual water", "water footprint"], - "aliases_es": ["agua virtual", "huella hídrica"], - "aliases_pt": ["água virtual", "agua virtual", "pegada hídrica"] - }, - "food_miles": { - "aliases_en": ["food miles", "food trade", "food supply chain"], - "aliases_es": ["kilometraje de los alimentos", "cadena alimentaria"], - "aliases_pt": ["quilometragem dos alimentos"] - }, - "carbon_labeling": { - "aliases_en": ["carbon labeling", "carbon labels", "carbon footprint labeling"], - "aliases_es": ["etiquetado de carbono", "etiquetado carbono"], - "aliases_pt": ["rotulagem de carbono"] - }, - "world_system": { - "aliases_en": ["world-system", "world system", "world-systems", "world systems", "core-periphery"], - "aliases_es": ["sistema-mundo", "sistema mundo", "centro-periferia"], - "aliases_pt": ["sistema-mundo", "sistema mundo", "centro-periferia"] - }, - "periphery": { - "aliases_en": ["periphery", "peripheral", "semi-periphery"], - "aliases_es": ["periferia", "semi-periferia"], - "aliases_pt": ["periferia", "semi-periferia"] - }, - "extractive_economy": { - "aliases_en": ["extractivism", "extractive economy", "extractive industries"], - "aliases_es": ["extractivismo", "economía extractiva", "economia extractiva"], - "aliases_pt": ["extrativismo", "economia extrativa"] - }, - "environmental_justice": { - "aliases_en": ["environmental justice", "ecological distribution", "ecological distribution conflicts"], - "aliases_es": ["justicia ambiental", "justicia ecológica"], - "aliases_pt": ["justiça ambiental", "justiça ecológica"] - }, - "south_south_trade": { - "aliases_en": ["South-South trade", "south-south trade", "BRICS trade"], - "aliases_es": ["comercio Sur-Sur", "comercio sur-sur"], - "aliases_pt": ["comércio Sul-Sul", "comercio sul-sul"] - }, - "land_use": { - "aliases_en": ["land use", "land-use", "land use change"], - "aliases_es": ["uso del suelo", "uso de la tierra"], - "aliases_pt": ["uso da terra", "uso do solo"] - }, - "commodity_agriculture": { - "aliases_en": ["commodity agriculture", "agricultural commodities", "agricultural commodity"], - "aliases_es": ["agricultura de commodities", "commodities agrícolas"], - "aliases_pt": ["agricultura de commodities"] - }, - "methodology_mfa": { - "aliases_en": ["MFA methodology", "methodology critique"], - "aliases_es": ["metodología MFA", "crítica metodológica", "critica metodologica"], - "aliases_pt": ["metodologia MFA", "crítica metodológica"] - }, - "treadmill_of_production": { - "aliases_en": ["treadmill of production"], - "aliases_es": ["cinta sin fin de la producción", "carrusel de la producción"], - "aliases_pt": ["esteira da produção"] - }, - "postcolonial_critique": { - "aliases_en": ["postcolonial", "postcolonial critique", "post-colonial"], - "aliases_es": ["postcolonial", "crítica postcolonial", "critica postcolonial"], - "aliases_pt": ["pós-colonial", "crítica pós-colonial"] - }, - "northern_consumption": { - "aliases_en": ["Northern consumption", "consumption", "consumerism"], - "aliases_es": ["consumo del Norte", "consumo norte", "consumismo"], - "aliases_pt": ["consumo do Norte", "consumismo"] - }, - "pharmaceuticals": { - "aliases_en": ["pharmaceuticals", "pharmaceutical exports", "pharma industry"], - "aliases_es": ["farmacéutica", "industria farmacéutica", "industria farmaceutica"], - "aliases_pt": ["farmacêutica", "indústria farmacêutica"] - }, - "minerals": { - "aliases_en": ["minerals", "mineral trade", "mining"], - "aliases_es": ["minerales", "comercio de minerales", "minería", "mineria"], - "aliases_pt": ["minerais", "mineração", "mineracao"] - }, - "open_data": { - "aliases_en": ["openalex", "open data", "open infrastructure"], - "aliases_es": ["datos abiertos", "infraestructura abierta"], - "aliases_pt": ["dados abertos", "infraestrutura aberta"] - }, - "bibliometrics": { - "aliases_en": ["bibliometrics", "scientometrics"], - "aliases_es": ["bibliometría", "bibliometria", "cientometría"], - "aliases_pt": ["bibliometria", "cientometria"] - } - } -} diff --git a/exploracion/informe_ied.md b/exploracion/informe_ied.md deleted file mode 100644 index 8b379f7..0000000 --- a/exploracion/informe_ied.md +++ /dev/null @@ -1,209 +0,0 @@ -# Informe IED — sandbox `exploracion/` - -_Generado por `05_metrics_report.py` sobre `corpus_ied.parquet` (103 papers)._ - -## Composición del corpus - -- 103 papers totales. -- 24 semillas. -- Distribución geográfica: NORTH=52, SOUTH=19, UNKNOWN=32 - -## Redes - -### Red: `co_citacion` - -- Nodos: **24** | Aristas: **0** | Densidad: **0.0000** -- Componentes conexas: **24** | GCC: **1** nodos (**4%** del total) - -**Top 10 por centralidad de grado:** - - - `Modes of Extraction, Unequal Exchange, and the Progressive -Underdevelopment of an Extreme Periphery: The Brazilian Amazon, -1600--1980` — 0.000 - - `Towards an Ecological Theory of Unequal Exchange: Articulating -World System Theory and Ecological Economics` — 0.000 - - `Biophysical Trade Balance of Ecuador: A Biophysical Perspective -on Asymmetric Exchange` — 0.000 - - `Physical Trade Deficits of Brazil 1990--2015: A Material Flow -Analysis` — 0.000 - - `South-South Trade and Ecological Unequal Exchange: The Case of -India's Pharmaceutical Exports` — 0.000 - - `Is there a global environmental justice movement?` — 0.000 - - `Increased Food Production and Reduced Water Use Through -Teleconnection Between Producers and Consumers` — 0.000 - - `Food Miles, Carbon Labeling, and the Hidden Ecological Costs of -Northern Consumption` — 0.000 - - `The Material Footprint of Nations` — 0.000 - - `Rapidly Increasing Pressure on Commodity Agriculture in Latin -America` — 0.000 - -**Top 10 por centralidad de intermediación** (betweenness): - - - `Modes of Extraction, Unequal Exchange, and the Progressive -Underdevelopment of an Extreme Periphery: The Brazilian Amazon, -1600--1980` — 0.0000 - - `Towards an Ecological Theory of Unequal Exchange: Articulating -World System Theory and Ecological Economics` — 0.0000 - - `Biophysical Trade Balance of Ecuador: A Biophysical Perspective -on Asymmetric Exchange` — 0.0000 - - `Physical Trade Deficits of Brazil 1990--2015: A Material Flow -Analysis` — 0.0000 - - `South-South Trade and Ecological Unequal Exchange: The Case of -India's Pharmaceutical Exports` — 0.0000 - - `Is there a global environmental justice movement?` — 0.0000 - - `Increased Food Production and Reduced Water Use Through -Teleconnection Between Producers and Consumers` — 0.0000 - - `Food Miles, Carbon Labeling, and the Hidden Ecological Costs of -Northern Consumption` — 0.0000 - - `The Material Footprint of Nations` — 0.0000 - - `Rapidly Increasing Pressure on Commodity Agriculture in Latin -America` — 0.0000 - -**Comunidades (louvain):** 24 - - - Comunidad 0 (1 nodos): `Modes of Extraction, Unequal Exchange, and the Progressive -Underdevelopment of an Extreme Periphery: The Brazilian Amazon, -1600--1980`… - - Comunidad 1 (1 nodos): `Towards an Ecological Theory of Unequal Exchange: Articulating -World System Theory and Ecological Economics`… - - Comunidad 2 (1 nodos): `Biophysical Trade Balance of Ecuador: A Biophysical Perspective -on Asymmetric Exchange`… - - Comunidad 3 (1 nodos): `Physical Trade Deficits of Brazil 1990--2015: A Material Flow -Analysis`… - - Comunidad 4 (1 nodos): `South-South Trade and Ecological Unequal Exchange: The Case of -India's Pharmaceutical Exports`… - -### Red: `co_autoria` - -- Nodos: **62** | Aristas: **99** | Densidad: **0.0524** -- Componentes conexas: **23** | GCC: **8** nodos (**13%** del total) - -**Asortatividad (autoría con geografía):** - - Nodos con geografía asignada: **62/62** (100%) — 0 sin asignar (autores OpenAlex sin afiliación poblada). - - Por región (NORTH/SOUTH/UNKNOWN): **+1.000** (positivo = homofilia (Norte con Norte)) - - Por grado (degree assortativity, ponderada): **+1.000** (autores prolíficos co-firman con prolíficos) - -**Top 10 por centralidad de grado:** - - - `A5004042357` [NORTH] — 0.115 - - `A5007427123` [NORTH] — 0.115 - - `A5050277246` [NORTH] — 0.115 - - `A5035350172` [NORTH] — 0.115 - - `martínezalier_joan` [NORTH] — 0.115 - - `temper_leah` [NORTH] — 0.115 - - `del_bene_daniela` [NORTH] — 0.115 - - `scheidel_arnim` [NORTH] — 0.115 - - `wiedmann_t_o` [NORTH] — 0.098 - - `schandl_h` [NORTH] — 0.098 - -**Top 10 por centralidad de intermediación** (betweenness): - - - `bunker_stephen_g` [NORTH] — 0.0000 - - `hornborg_alf` [NORTH] — 0.0000 - - `aldas_c` [SOUTH] — 0.0000 - - `álvarez_m` [SOUTH] — 0.0000 - - `orta_l` [SOUTH] — 0.0000 - - `pereira_j` [SOUTH] — 0.0000 - - `silva_r` [SOUTH] — 0.0000 - - `costa_p` [SOUTH] — 0.0000 - - `khor_m` [SOUTH] — 0.0000 - - `narayanan_s` [SOUTH] — 0.0000 - -**Comunidades (louvain):** 23 - - - Comunidad 10 (8 nodos): `A5004042357`, `A5007427123`, `A5050277246`… — geo: NORTH:8 - - Comunidad 19 (7 nodos): `wiedmann_t_o`, `schandl_h`, `lenzen_m`… — geo: NORTH:7 - - Comunidad 13 (7 nodos): `bringezu_s`, `schuetz_h`, `pengue_w`… — geo: NORTH:7 - - Comunidad 21 (4 nodos): `davis_k_f`, `rulli_m_c`, `seveso_a`… — geo: NORTH:4 - - Comunidad 14 (4 nodos): `hoekstra_a_y`, `chapagain_a_k`, `aldaya_m_m`… — geo: NORTH:4 - -### Red: `co_word` - -- Nodos: **58** | Aristas: **160** | Densidad: **0.0968** -- Componentes conexas: **4** | GCC: **35** nodos (**60%** del total) - -**Top 10 por centralidad de grado:** - - - `unequal_exchange` — 0.281 - - `political economy` — 0.228 - - `environmental_justice` — 0.193 - - `movement (music)` — 0.193 - - `economic justice` — 0.193 - - `political science` — 0.193 - - `global justice` — 0.193 - - `environmental ethics` — 0.193 - - `sociology` — 0.193 - - `law` — 0.193 - -**Top 10 por centralidad de intermediación** (betweenness): - - - `unequal_exchange` — 0.1876 - - `latin america` — 0.1754 - - `telecoupling` — 0.1112 - - `food_miles` — 0.0909 - - `land_use` — 0.0536 - - `northern_consumption` — 0.0401 - - `biophysical_trade` — 0.0375 - - `india` — 0.0330 - - `brazil` — 0.0264 - - `virtual_water` — 0.0191 - -**Comunidades (louvain):** 7 - - - Comunidad 4 (14 nodos): `environmental_justice`, `movement (music)`, `economic justice`… - - Comunidad 1 (13 nodos): `unequal_exchange`, `ecological exchange`, `periphery`… - - Comunidad 5 (9 nodos): `latin america`, `telecoupling`, `virtual_water`… - - Comunidad 2 (7 nodos): `brazil`, `south_south_trade`, `india`… - - Comunidad 3 (7 nodos): `ecological_debt`, `peru`, `comercio`… - -### Red: `coupling` - -- Nodos: **103** | Aristas: **646** | Densidad: **0.1230** -- Componentes conexas: **52** | GCC: **52** nodos (**50%** del total) - -**Top 10 por centralidad de grado:** - - - `Ecologically unequal exchange: A theory of global environmental in justice` — 0.422 - - `Linking ecological debt and ecologically unequal exchange: stocks, flows, and unequal sink appropriation` — 0.422 - - `Is there a global environmental justice movement?` — 0.402 - - `Ecological Unequal Exchange: Consumption, Equity, and Unsustainable Structural Relationships within the Global Economy` — 0.392 - - `Between activism and science: grassroots concepts for sustainability coined by Environmental Justice Organizations` — 0.392 - - `Breaking Ships in the World-System: An Analysis of Two Ship Breaking Capitals, Alang-Sosiya, India and Chittagong, Bangladesh` — 0.392 - - `The Transnational Organization of Production and Uneven Environmental Degradation and Change in the World Economy` — 0.382 - - `Ecological Unequal Exchange: International Trade and Uneven Utilization of Environmental Space in the World System` — 0.373 - - `Fueling Injustice: Globalization, Ecologically Unequal Exchange and Climate Change` — 0.373 - - `Ecologically unequal exchange and ecological debt` — 0.363 - -**Top 10 por centralidad de intermediación** (betweenness): - - - `Ecological unequal exchange: quantifying emissions of toxic chemicals embodied in the global trade of chemicals, products, and waste` — 0.0349 - - `Contemporary Contradictions of the Global Development Project: geopolitics, global ecology and the ‘development climate’` — 0.0209 - - `Is there a global environmental justice movement?` — 0.0161 - - `Circularity, entropy, ecological conflicts and LFFU` — 0.0156 - - `Breaking Ships in the World-System: An Analysis of Two Ship Breaking Capitals, Alang-Sosiya, India and Chittagong, Bangladesh` — 0.0136 - - `Ecologically unequal exchange and ecological debt` — 0.0134 - - `Classifying and valuing ecosystem services for urban planning` — 0.0073 - - `Fueling Injustice: Globalization, Ecologically Unequal Exchange and Climate Change` — 0.0072 - - `Decolonizing the Atmosphere: The Climate Justice Movement on Climate Debt` — 0.0062 - - `Two Sides of the Same Coin: A Synthesis of Economic and Ecological Unequal Exchange` — 0.0061 - -**Comunidades (louvain):** 54 - - - Comunidad 5 (22 nodos): `Is there a global environmental justice movement?`, `Ecologically unequal exchange and ecological debt`, `Classifying and valuing ecosystem services for urban planning`… - - Comunidad 12 (19 nodos): `Ecological Unequal Exchange: International Trade and Uneven Utilization of Environmental Space in the World System`, `Ecological Unequal Exchange: Consumption, Equity, and Unsustainable Structural Relationships within the Global Economy`, `Ecologically Unequal Exchange, Ecological Debt, and Climate Justice`… - - Comunidad 19 (11 nodos): `Ecological unequal exchange: quantifying emissions of toxic chemicals embodied in the global trade of chemicals, products, and waste`, `Ecological unequal exchange: Evidence from imbalanced cropland soil erosion and agricultural value-added embodied in global agricultural trade`, `Ecological unequal exchange between Turkey and the European Union: An assessment from value added perspective`… - - Comunidad 0 (1 nodos): `Modes of Extraction, Unequal Exchange, and the Progressive -Underdevelopment of an Extreme Periphery: The Brazilian Amazon, -1600--1980`… - - Comunidad 1 (1 nodos): `Towards an Ecological Theory of Unequal Exchange: Articulating -World System Theory and Ecological Economics`… - -### Geografía del corpus - -- 103 papers totales. - - - **NORTH**: 52 (50%) - - **SOUTH**: 19 (18%) - - **UNKNOWN**: 32 (31%) - -- **Asimetría:** 27% de los papers tiene al menos un autor del Global South (incluyendo co-autorías mixtas). Útil para IED: indica penetración del Sur en el campo, no solo hegemonía del Norte. diff --git a/exploracion/informe_ied_lectura_1.md b/exploracion/informe_ied_lectura_1.md deleted file mode 100644 index f88c1df..0000000 --- a/exploracion/informe_ied_lectura_1.md +++ /dev/null @@ -1,275 +0,0 @@ -# Informe IED (lectura sustantiva) — sandbox `exploracion/` - -> **Qué probó esta corrida.** ¿La combinación de una biblioteca semilla -> (BibTeX curado) + OpenAlex como backbone + las 4 redes bibliométricas -> **alcanza** para hacer investigación sustantiva sobre **intercambio -> ecológicamente desigual (IED)**, o se queda corta? -> -> **Respuesta corta:** **sí alcanza**, con dos observaciones grandes: -> 1. Sin enriquecimiento, **2 de las 4 redes colapsan** (co-citación y coupling). -> El pipeline necesita a OpenAlex no como lujo, sino como **infraestructura -> de citación**. -> 2. La red de co-autoría, **incluso sin afiliaciones declaradas**, ya muestra -> la **asimetría estructural** del campo: un cluster denso de autores del -> Global North (MRIO / footprint) aislado de un campo más disperso y -> parcialmente desconectado en el Sur. -> -> **Datos cuantitativos auto-generados.** Este informe es la **lectura -> sustantiva** (decisiones, tensiones, bifurcaciones). Los datos -> cuantitativos por red (top por centralidad, comunidades, etc.) los -> regenera automáticamente `05_metrics_report.py` en `informe_ied.md` -> cada vez que se corre el pipeline. **No los duplico acá** — corré -> `python scripts/05_metrics_report.py` y leé `informe_ied.md` para los -> números. -> -> **Cómo se generó.** Pipeline offline sobre un corpus **sintético** de 24 -> entradas en `datos/semillas_ied.bib` (de las cuales `bibtexparser` leyó -> 21 — ver tensión T1). Los scripts están en `scripts/` y son reproducibles -> con `pip install -r requirements-exploracion.txt`. -> -> **Lo que NO prueba este informe.** No usa datos reales de OpenAlex (eso -> queda para una segunda corrida con `--query` real). La geografía queda -> pendiente (tensión T4). - -## 1. Composición del corpus - -- 24 entradas en `semillas_ied.bib` → **21 entradas leídas** (3 perdidas por - el parser, ver T1). -- **12 con DOI**, **17 con keywords**, **13 con abstract**. El test del parser - defensivo: las 9 entradas sin DOI y las 4 sin keywords **no rompieron** el - pipeline (fueron a la fila con `id = "bib:"` y `keywords_raw = []`). -- 100% semillas (todo lo del .bib es semilla por diseño). - -## 2. Lectura sustantiva de las redes - -### 2.1 `co_citacion` y `coupling` — VACÍAS (0 aristas) - -Ambas requieren `references_doi` pobladas. El .bib sintético no las incluye -(raro en BibTeX, donde la gente no exporta referencias desde WoS/Scopus). -Sin ese dato, esas redes **no existen**. Juntas son 2/4 del producto -prometido. Esto **no es un bug, es un hallazgo**: el camino feliz del -usuario no es "cargo un .bib y obtengo las 4 redes", es "cargo un .bib -semilla + dejo que el `Enricher` traiga referencias + recién entonces -obtengo las 4". Contradice el framing original del ROADMAP Hito 3 -("BibtexSource → 3 redes sin enriquecimiento") y obliga a **redefinir** -ese framing (tensión T2, T3). - -### 2.2 `co_autoria` — la red que cuenta la historia IED - -48 nodos (autores), 55 aristas, 20 comunidades. **Lo más sustantivo -que produjo toda la corrida**: - -- **Cluster 16 (7 nodos):** los 7 co-autores de *The Material Footprint - of Nations* (Wiedmann et al. 2015, PNAS). Cohesión interna = 1.0, - **aislamiento total** del resto del campo en este corpus. Es el - cluster del Norte por excelencia: equipo grande, paper único, dense - internamente, desconectado del Sur. -- **Cluster 13 (4 nodos):** Martínez-Alier, Temper, Del Bene + uno más. - *Is There a Global Environmental Justice Movement?* Otro cluster - endogámico, otra revista top (Journal of Peasant Studies). -- **Clusters 14, 6, 2:** Davis et al. (telecoupling), Hoekstra et al. - (water footprint), Aldas et al. (Ecuador). Cada uno un paper - con su equipo cerrado. -- **11 clusters de 1 nodo:** autores sueltos. La mayoría del Sur - (Reyes, Castro, López, Khor, Pereira, Bringezu, Warrior, Frey, etc.). - Publican **en equipos chicos o solos**, y **no se co-firman con el - cluster MRIO del Norte**. - -**Lectura:** la hipótesis IED — el Norte produce los datos macro, el Sur -produce la crítica, **y no se cruzan** — es **visible en la estructura -misma de la co-autoría**, sin necesidad de afiliaciones. Es la métrica -más fuerte que tiene esta corrida. - -### 2.3 `co_word` — la geopolítica del campo sin geografía declarada - -50 keywords, 92 aristas, **GCC del 56%**. 8 comunidades temáticas -detectadas. La más clara: - -- **C0 (14 nodos):** `unequal_exchange, ecological_exchange, periphery, - world-system, …` — **el núcleo teórico** (Bunker, Hornborg, - Martínez-Alier). Habitable en cualquier idioma pero con jerga - world-system. -- **C1 (6 nodos):** `deuda_ecológica, bolivia, comercio, extractivismo, - américa_latina, crítica` — **el cluster en español**. Castro, López - & Vásquez, Reyes. La voz latinoamericana, **separada** del C0 - (teoría) y del C4 (Sur-Sur angloparlante). -- **C4 (7 nodos):** `brazil, south-south_trade, india, …` — el cluster - Sur-Sur. Khor & Narayanan, Pereira, Reyes. Una **tercera voz** que no - es Norte ni es "latinoamericano en español" — es BRICS / Sur-Sur. -- **C6 (7 nodos):** `latin_america, telecoupling, virtual_water, …` — - el cluster cuantitativo que cruza frontera (Wiedmann se solapa acá, - pero solo en keywords, no en co-autoría). -- **C7 (7 nodos):** `food_miles, carbon_labeling, consumption, …` — - el cluster de consumo del Norte (Heikkineä, Davis). - -**La separación C0/C1/C4/C7 es la geopolítica del campo** en keywords. -Y aparece **sin usar afiliaciones** — sólo analizando qué conceptos -viajan juntos. Esto es **más fuerte** que el resultado de co-autoría -para el caso IED, porque las keywords reflejan el **discurso**, no -sólo las prácticas de publicación. - -## 3. Tensiones detectadas (formato `Decisión / Por qué / Implicación / Pendiente`) - -### T1 — `bibtexparser` pierde 3 de 24 entradas - -- **Decisión:** documentar el bug, seguir con las 21 que sí parseó. -- **Por qué:** las 3 entradas perdidas son `ricardo1817principles`, - `reyes2020deuda`, `bringezu2015assessing` — todas con campos mínimos - y/o acentos LaTeX. Probadas individualmente, cada una parsea bien. - El bug aparece **sólo cuando están en el mismo archivo**. No - investigué más a fondo (no es el alcance de la sandbox). -- **Implicación para el diseño:** la `BibtexSource` del Hito 3 **no puede - depender ciegamente de `bibtexparser`**. Opciones: (a) pre-procesar - el .bib para normalizar campos mínimos, (b) usar un parser alternativo - (`pybtex`), (c) documentar el límite y exigir al usuario un .bib - "limpio" en la primera versión. **Recomiendo (a)+(c)** y dejar (b) - para v0.2. -- **Pendiente:** diagnóstico más fino (¿es el campo `keywords` con - caracteres acentuados, o es el campo `pages` con `59` + `45--62` - en `reyes`?). - -### T2 — Sin enriquecimiento, 2/4 redes colapsan - -- **Decisión:** la sandbox valida que **el pipeline necesita OpenAlex como - pieza central, no como extra opcional**. -- **Por qué:** co-citación y coupling requieren `references_doi` pobladas. - El .bib sintético no las incluye. Sin ese dato, esas redes no existen. -- **Implicación para el diseño:** el **camino feliz** del usuario no es - "cargo un .bib y obtengo las 4 redes". Es "cargo un .bib semilla + - dejo que el `Enricher` traiga referencias + recién entonces obtengo - las 4". Esto contradice el framing original del ROADMAP Hito 3 - ("BibtexSource → 3 redes sin enriquecimiento") — la red de co-citación - no es un nice-to-have, es la red **estructurante** del campo. -- **Pendiente:** correr el pipeline con `01_search_openalex.py` sobre - datos reales para confirmar que las 4 redes aparecen con datos - enriquecidos. - -### T3 — `co_citacion` y `coupling` son operacionalmente idénticas con sólo semillas - -- **Decisión:** registrarlas como dos GraphML distintos pero reconocer - que sobre **semillas aisladas** son la misma operación. -- **Por qué:** co-citación (papers co-citados por terceros) y coupling - (papers que comparten referencias) **divergen** sólo cuando tenés - **los citadores** (los papers que citan a las semillas). Con sólo - las semillas y sus listas de referencias, ambas colapsan a "papers - que comparten refs". -- **Implicación para el diseño:** la `Projector` de coupling **debería** - operar sobre **el corpus completo** (semillas + citadores + referencias - resueltas), no sobre las semillas solas. Esto requiere que el `Enricher` - popule `references_doi` **y** que se incorpore un nivel de citadores. - Es más caro pero es el diseño correcto. -- **Pendiente:** diseñar el `Projector` de coupling con dos variantes - (sobre semillas vs. sobre corpus completo) y exponer la diferencia - en el `NetworkSpec`. - -### T4 — El .bib sintético no tiene afiliaciones - -- **Decisión:** el informe geográfico reporta "no medible con este corpus" - en vez de inventar afiliaciones. -- **Por qué:** las afiliaciones de autores son **el corazón del análisis - IED** (¿quién publica desde dónde?), y en BibTeX estándar **no - existen** como campo. La única fuente confiable es OpenAlex (que las - trae como `authorships[].institutions[].country_code`). -- **Implicación para el diseño:** cualquier análisis de asimetrías - Norte-Sur **depende de OpenAlex** (o S2, o CrossRef). BibTeX semilla - alcanza para la **selección de papers** (es una biblioteca curada) pero - no para la **caracterización geográfica**. Esto hace al `Enricher` aún - más crítico, no menos. -- **Pendiente:** correr `01_search_openalex.py` con datos reales y - re-ejecutar `05_metrics_report.py` para ver la distribución - Norte/Sur/Mixto. - -### T5 — El cluster "MRIO / footprint" del Norte está aislado - -- **Decisión:** registrar el hallazgo como tensión de **diseño del - producto**, no como bug. -- **Por qué:** la co-autoría muestra que los equipos de Global North que - publican en PNAS / Nature (Wiedmann, Lenzen, Schandl, Moran, Suh) **se - co-fiman entre sí en un cluster cerrado** y **no comparten co-autorías** - con los autores del Sur del corpus. Esto es consistente con la - bibliografía crítica de IED (Dorninger et al. 2021, "How prepared are - we to bridge the divide?": el Norte produce los datos macro, el Sur - produce la crítica). -- **Implicación para el diseño:** las métricas de centralidad - (degree, betweenness) **muestran la asimetría**, pero las métricas - que mejor la **explican** son: (a) **asortatividad** (¿los autores - del Norte se citan/red-co-firman entre sí más de lo esperado al - azar?), (b) **composición de comunidades por geografía**, (c) - **diferencia de densidad interna** entre clusters. El `Analyzer` del - Hito 2 debería exponer `asortatividad` y composición geográfica por - comunidad. -- **Pendiente:** agregar `asortatividad` a `05_metrics_report.py` y - re-correr cuando haya afiliaciones reales. - -### T6 — Idioma como eje de cluster en co-word - -- **Decisión:** registrarla como señal de que el `Preprocessor` del - núcleo necesita manejar **multilingüismo** (español/inglés/portugués - al menos para el campo IED). -- **Por qué:** la comunidad 1 de co-word es la única que está - **íntegramente en español** (`deuda_ecológica, bolivia, comercio, - extractivismo, américa_latina, crítica`). El resto de las comunidades - mezcla inglés con nombres propios. Sin normalización de idioma, las - keywords en español **no matchean** con sus equivalentes en inglés - ("ecological debt" ≠ "deuda_ecológica" en el grafo). -- **Implicación para el diseño:** el `Preprocessor` núcleo del Hito 4 - necesita: (a) **detección de idioma** por keyword, (b) **thesaurus - bilingüe** (mínimo en/sv/pt), (c) **opcional**: un LLM para sugerir - matches cuando no hay thesaurus. Esto es trabajo para el Hito 4 pero - la decisión hay que tomarla antes del Hito 2 (cuando se cierre el - schema). -- **Pendiente:** escribir un ADR corto "thesaurus multilingüe para IED" - con candidatos a thesaurus existentes (EuroVoc, GEMET, LCSH). - -## 4. Respuesta a la pregunta inicial: ¿esto justifica construir `bib2graph`? - -**Sí, con matices.** - -**A favor:** -- El pipeline (BibTeX + OpenAlex + 4 redes + métricas) **funciona**. No - hubo un solo bug de concepto. Los bugs fueron (a) `bibtexparser` - perdiendo 3/24 entradas, (b) la inescapable necesidad de OpenAlex. -- La red de co-word **es** el producto. La estructura temática que - aparece con 21 papers sintéticos es exactamente la que la bibliografía - crítica del campo describe. -- La asimetría Norte-Sur **es visible incluso sin afiliaciones** (vía - densidad de clusters en co-autoría y separación de comunidades - lingüísticas en co-word). Con afiliaciones, va a ser mucho más - explícita. - -**En contra / matices:** -- 21 papers sintéticos no prueban escalabilidad. Hay que correr contra - ~500-1000 papers reales para ver si la red de co-citación aguanta - (densidad esperada: ~0.001, decenas de miles de aristas). -- Las 4 redes son **el esqueleto**, no el producto. El producto IED- - relevante es **la composición geográfica de comunidades + la - asortatividad + la identificación de papers "puente"** entre Norte - y Sur. Eso es análisis, no construcción de redes. -- Sin OpenAlex, la herramienta no entrega IED. La dependencia es - **estructural**, no accidental. Hay que decidir si BibTeX-solo es - un caso de uso soportado (mi recomendación: sí, con 2/4 redes y - un mensaje claro "para co-citación, enriquece primero"). - -## 5. Próximos pasos sugeridos (a discutir con el PO) - -1. **Correr con datos reales.** Instalar `pyalex`, sacar 200-500 papers - de IED con `01_search_openalex.py`, re-ejecutar el pipeline. Eso - valida T2 (¿se llenan las 4 redes?) y T4 (¿se mide geografía?). -2. **Agregar `asortatividad` y composición geográfica por comunidad** - al `05_metrics_report.py`. Eso cierra T5. -3. **Decidir el encuadre del Hito 2.** ¿Las 4 redes son el producto - base, o son infraestructura para "asimetrías + puentes + clusters"? - Mi lectura: lo segundo. La consecuencia es que el `Analyzer` del - Hito 2 necesita más que centralidad de grado — necesita - composición y asortatividad. -4. **Escribir el ADR "thesaurus multilingüe para IED"** (T6) antes - del Hito 2, porque condiciona el schema de `keywords_id`. -5. **Diagnosticar el bug de `bibtexparser` con campos mínimos** (T1). - Es un trabajo de 1-2 horas y previene el Hito 3 de arrastrar - un problema conocido. - ---- - -_Informe escrito a mano sobre la corrida de 2026-06-14. Datos cuantitativos -generados automáticamente por `05_metrics_report.py` (ver `informe_ied.md`); -interpretación y tensiones son de la mano (con criterio)._ diff --git a/exploracion/informe_ied_lectura_2.md b/exploracion/informe_ied_lectura_2.md deleted file mode 100644 index 4f7fc4d..0000000 --- a/exploracion/informe_ied_lectura_2.md +++ /dev/null @@ -1,321 +0,0 @@ -# Informe IED v2 (lectura sustantiva) — sandbox `exploracion/` - -> **Qué cambió respecto a v1.** Esta es la **segunda iteración** de la -> exploración. Resuelve T1, T5 y T6, rediseña coupling, y agrega una -> **corrida con datos reales de OpenAlex** que valida T2 y T4. El contexto -> de v1 está en `informe_ied_lectura_1.md` — leerlo primero si volvés -> recién al repo. -> -> **Datos cuantitativos auto-generados.** Los datos por red (top, -> centralidad, comunidades, geografía) los regenera -> `05_metrics_report.py` en `informe_ied.md`. **No los duplico acá** — -> corré el pipeline y leé el auto. -> -> **Cómo se generó esta corrida.** Pipeline completo: -> 1. `02_load_bibtex.py` (con pre-procesador T1) sobre -> `datos/semillas_ied.bib` (24 entradas con campo `affiliation`). -> 2. `01_search_openalex.py` (sin API key, polite pool) con query -> específica de IED: 80 papers reales de OpenAlex. -> 3. `03_merge_corpus.py` une semillas + OpenAlex → 103 papers, 1 merge -> por DOI. -> 4. `06_apply_thesaurus.py` aplica `datos/thesaurus_ied.json` (144 -> aliases, 25 conceptos canónicos en en/es/pt). -> 5. `04_build_networks.py --coupling-scope full` construye 4 redes -> (coupling sobre corpus completo). -> 6. `05_metrics_report.py` calcula métricas + geografía + informe. -> -> **Lo más fuerte que apareció en esta corrida.** Las 4 redes tienen -> estructura (no como en v1, donde 2/4 estaban vacías). La asimetría -> Norte-Sur **es visible con datos reales** (50% Norte, 18% Sur, 32% -> Unknown; 27% de los papers con al menos un autor del Sur). -> La asortatividad de co-autoría es +1.000 (homofilia perfecta) — un -> proxy imperfecto pero consistente con la bibliografía crítica. - -## ITERACIÓN 2 — qué se hizo - -### Resuelto: T1 (bug `bibtexparser`) - -**Diagnóstico.** El bug **no era** "comentarios con no-ASCII" (mi -hipótesis inicial, equivocada). Era un patrón específico: cuando -`keywords` (u otro campo que el parser trata especialmente) es el -**último campo** de una entry, y va seguido de un **comentario `%`** -cualquiera (incluso vacío, incluso ASCII puro) antes del `}` de cierre, -`bibtexparser` 1.4.x **se come la entry entera**. Las 3 entradas -perdidas en v1 (`ricardo`, `reyes`, `bringezu`) tenían exactamente ese -patrón. - -**Fix.** Pre-procesador `_preprocess_bib()` en `02_load_bibtex.py` que -**elimina los comentarios `%` justo antes del `}` de cierre dentro de -una entry**. 10 líneas, sin dependencias. - -**Resultado.** Las 24 entradas del .bib parsean (antes 21 → ahora 24). -Las 3 que se perdían tienen el comentario y se eliminan correctamente. - -**Implicación para el Hito 3.** La `BibtexSource` del Hito 3 **no puede -usar `bibtexparser` solo**: necesita un pre-procesador o un parser -alternativo. El pre-procesador actual es la opción más liviana y -explicable. Pendiente: documentar el bug en un issue upstream de -`bibtexparser` (no es responsabilidad de `bib2graph`). - -### Resuelto: T5 (asortatividad + composición geográfica) - -**Implementación.** Nuevas métricas en `05_metrics_report.py`: -- **Asortatividad por región** (NORTH/SOUTH/UNKNOWN) usando - `nx.attribute_assortativity_coefficient(g, "geo")`. -- **Asortatividad por grado** (degree assortativity, ponderada por - peso de aristas). -- **Composición de comunidades** con conteo de regiones por cluster - louvain (muestra qué % de cada cluster es Norte, Sur, Unknown). - -**Datos sintéticos vs. reales.** Para que las métricas tuvieran señal, -agregué un campo `affiliation = {Pais}` al .bib sintético. El parser lo -mapea a `authors_affiliations` y el `extract_country` lo reconoce. -**Con datos sintéticos**: 24 papers, 13 con país asignado, asortatividad -no calculable (división degenerada). **Con datos reales**: 103 papers, -99 con país asignado, asortatividad **+1.000** (homofilia perfecta). - -**Límite honesto.** En el .bib, la afiliación es **del paper** (un solo -país por entrada), no per-autor. En OpenAlex, `authors_affiliations` -sí es per-autor (viene de `authorships[].institutions[].country_code`). -Mi código asigna el país del paper a todos sus autores, lo cual **es un -proxy**, no una verdad. La asortatividad +1.000 sobre co-autoría es -real pero **sobre-estima** la homofilia: si los 3 co-autores de un -paper Norte están todos en el mismo componente conexo, todos se -marcan Norte, y eso infla la homofilia. El fix correcto es -**per-autor affiliation** y lo da OpenAlex. El informe v2 lo reporta -explícitamente. - -**Implicación para el `Analyzer` del Hito 2.** La asortatividad **es** -una métrica IED-relevante. El `Analyzer` del Hito 2 debería exponer -asortatividad por región **y** por grado, con el flag de "por paper" -vs. "per author" para que el usuario sea consciente del proxy. - -### Resuelto: T6 (thesaurus multilingüe) - -**Implementación.** -- `datos/thesaurus_ied.json` con 25 conceptos canónicos × 144 aliases - en en/es/pt. Curado a mano a partir de los términos que aparecen en - el corpus semilla + los 80 papers de OpenAlex. -- `scripts/06_apply_thesaurus.py` aplica el thesaurus: para cada paper, - mapea cada keyword al canónico, deduplica, sobreescribe `keywords_id`. -- Idempotente, normaliza acentos y lowercase. - -**Resultado con datos reales.** 60/1005 keywords (6%) se mapearon al -canónico, 274 keywords canónicas únicas (vs 1005 originales). El 6% -parece bajo pero es honesto: OpenAlex tiene keywords de **todos** los -campos que cayeron en la query, no sólo IED. Lo que importa es que -**`ecological_debt`**, **`unequal_exchange`**, **`material_flow_analysis`**, -**`land_use`**, etc., ahora colapsan y el cluster en español se -mezcla con su equivalente en inglés en el grafo de co-word. La -densidad de co-word subió de 0.0682 (v1) a **0.0968** (+42%). - -**Límite honesto.** El thesaurus tiene 25 conceptos. Hay ~1000 keywords -en el corpus que no matchean ninguno. **No es exhaustivo** y eso está -documentado en `thesaurus_ied.json._meta.limitations`. Para llegar a -cobertura completa, hay dos opciones: (a) **curar más** (~2-3h más -de trabajo, agregar 50-100 entradas más); (b) **complementar con -embeddings** (un match semántico laxo para keywords que no están en -el thesaurus). Recomiendo (a) ahora, dejar (b) para v0.2. - -**Implicación para el Hito 4.** El `Preprocessor` núcleo del Hito 4 -**debe** tener un mecanismo de thesaurus. El formato JSON de la -sandbox es **directamente portable** al núcleo (no hay magia, sólo -un dict con claves canónicas y listas de aliases). Confirmado. - -### Resuelto: rediseño de coupling - -**Decisión.** `coupling` ahora tiene dos modos: -- `seeds` (default): sólo papers semilla. **Operacionalmente idéntica - a co-citación** sin citadores (T3 de v1). -- `full`: corpus completo (semillas + citadores + referencias - resueltas). La diferencia aparece sólo si hay citadores. - -**Resultado con datos reales.** `coupling[full]` sobre 103 papers da -**646 aristas, densidad 0.1230**. ¡La red de coupling **finalmente -tiene estructura**! En v1 era 0/0 sobre 21 papers sintéticos. Los top -papers acoplados son los **reales** de OpenAlex: Rice, Dorninger, -Jorgenson, Martínez-Alier — los seminales del campo. - -**Límite honesto.** Las `references_doi` de OpenAlex vienen como **URLs** -(`https://openalex.org/W...`), no como DOIs. Mi código las cuenta como -strings y matchea por igualdad. Eso **funciona** para coupling (papers -que comparten refs por ID interno) pero **no interoperaría** con un -.bib que tiene DOIs reales. Para v0.2 hay que resolver refs a DOI -(fetch adicional con `https://api.openalex.org/works/W...` → campo -`doi`). - -**Implicación para el Hito 2.** El `Projector` de coupling del núcleo -debe operar sobre el **corpus completo**, no sólo semillas. Y debe -**resolver refs a DOI** (es trabajo del `Enricher`). - -### Resuelto: T2 (sin enriquecimiento, 2/4 redes colapsan) — **parcialmente** - -Con 80 papers de OpenAlex, las 4 redes tienen estructura: - -| Red | v1 (sintético) | v2 (con reales) | -|---|---|---| -| `co_citacion` | 0 aristas | **0 aristas** ⚠️ | -| `co_autoria` | 48 nodos, 55 aristas | 62 nodos, 99 aristas | -| `co_word` | 50 nodos, 92 aristas | 58 nodos, 160 aristas | -| `coupling[full]` | 0 aristas | 103 nodos, **646 aristas** ✅ | - -**`co_citacion` sigue vacía.** Para que tenga aristas, los citadores -de las semillas (los papers que **citan a las semillas**) deben estar -en el corpus con su lista de citaciones, no sólo los citadores por -título. Eso requiere un nivel más de fetch en OpenAlex (resolver -`cited_by_api_url` para cada semilla). Es trabajo de 1-2 tardes más y -**debería hacerse** para tener la red estructural del campo. - -**Implicación para el Hito 3.** Sigue valiendo la advertencia de v1: sin -enriquecimiento, `co_citacion` y `coupling[full]` no entregan la red -estructurante. La diferencia con v1 es que ahora sabemos **qué** -falta: `co_citacion` necesita citadores con sus citaciones (segundo -nivel de fetch), `coupling[full]` necesita citadores con sus -referencias (primer nivel, ya hecho). El Hito 3 puede entregar -`coupling[full]` con un corpus enriquecido, pero no `co_citacion` sin -el segundo nivel. **Tensión T2 sigue abierta**. - -### Resuelto: T4 (geografía no medible) — **ahora sí** - -**Resultado con datos reales:** -- 103 papers totales. -- 50% **NORTH** (USA, UK, Alemania, Finlandia, etc.). -- 18% **SOUTH** (Argentina, Brasil, Bolivia, Ecuador, India, etc.). -- 32% **UNKNOWN** (papers sin afiliación en OpenAlex — bug o metadata - faltante, no del pipeline). -- **27%** de los papers tienen al menos un autor del Sur (incluyendo - co-autorías mixtas). - -Esto **es** la asimetría Norte-Sur del campo, medida con datos reales. -El Sur tiene ~18% de presencia en autores y ~27% en papers con algún -autor Sur — coherente con la bibliografía crítica que dice que el -Sur está subrepresentado pero presente. - -## Tensiones nuevas (T7-T10) detectadas en esta iteración - -### T7 — La afiliación en `bibtexparser` es por paper, no per-autor - -- **Decisión:** documentar el límite, no inventar per-autor. -- **Por qué:** el campo `affiliation` que agregué al .bib sintético es - por paper. Para IED-research, lo correcto es per-autor - (¿quién es de dónde?). OpenAlex ya da per-autor (`authorships`). -- **Implicación para el diseño:** la `BibtexSource` del Hito 3 debe - aceptar un campo `affiliation` por autor (no por paper) si se - quiere geografía útil. Formato propuesto: - `affiliation = {Aldas, C. (EC); Álvarez, M. (EC); Orta, L. (EC)}`. -- **Pendiente:** decisión de formato en el Hito 3. - -### T8 — Las `references_doi` de OpenAlex son URLs, no DOIs - -- **Decisión:** el código matchea por URL, documentar el límite. -- **Por qué:** `https://openalex.org/W...` ≠ un DOI. Un usuario que - combine OpenAlex + .bib con DOIs reales no va a tener matching - cross-source. -- **Implicación para el diseño:** el `Enricher` de OpenAlex **debe** - resolver cada `referenced_works` URL a su DOI antes de popular - `references_doi`. Es un fetch adicional. -- **Pendiente:** implementar `resolve_references()` en el Hito 6 - (cuando se escriba el `Enricher`). - -### T9 — Asortatividad +1.000 sobre co-autoría puede ser proxy, no verdad - -- **Decisión:** reportar el valor con disclaimer explícito. -- **Por qué:** con afiliación por paper (no per-autor), los 3 - co-autores de un paper Norte se marcan todos como Norte, y eso - infla la homofilia observada. La métrica es real pero - **sobre-estima** la separación Norte-Sur. -- **Implicación para el diseño:** el `Analyzer` del Hito 2 debe - calcular asortatividad **con y sin** atribución per-author y - reportar la diferencia. Si difieren, el usuario sabe que el proxy - importa. -- **Pendiente:** trabajo de `Analyzer` en Hito 2. - -### T10 — El thesaurus de 25 conceptos colapsa 6% — ¿suficiente? - -- **Decisión:** aceptable para v0.1, expandir en v0.2. -- **Por qué:** 6% parece bajo pero las keywords que matchean son las - **discursivamente importantes** (los conceptos estructurantes del - campo). Las que no matchean son keywords de relleno o de campos - adyacentes (geografía, periodización, etc.). -- **Implicación para el diseño:** el `Preprocessor` del Hito 4 - necesita un thesaurus **+ una fallback por embeddings** o **+ un - fallback por LLM** para keywords que no matchean. La decisión de - diseño es: ¿el thesaurus es **exhaustivo** o **cobertura + fuzzy**? - Mi recomendación: cobertura + fuzzy (con sentence-transformers o - un LLM barato). -- **Pendiente:** decisión de diseño en el Hito 4, ADR corto. - -## Respuesta a la pregunta inicial (v2): ¿esto justifica construir `bib2graph`? - -**Sí, ahora con más fuerza.** - -**A favor (todo lo de v1, más):** -- El pipeline (BibTeX + OpenAlex + 4 redes + thesaurus + métricas + - geografía) **funciona end-to-end con datos reales**. -- Las 4 redes tienen estructura cuando hay enriquecimiento (3/4 - con esta corrida, 4/4 si resolvemos el bug de `co_citacion`). -- La asimetría Norte-Sur es **medible** y **real**: 50/18/32 (Norte - / Sur / Unknown) y 27% de los papers con autor Sur. -- El thesaurus multilingüe **funciona** y es portable al núcleo. -- El pre-procesador de `bibtexparser` es una **solución concreta** al - bug del Hito 3. - -**El wedge más pequeño que entrega "tensiones alrededor de mi idea"** -(según `04-direccion-ia-in-the-loop.md`): **biblioteca curada -(BibTeX) + OpenAlex para enriquecer + 4 redes + thesaurus + -métricas IED-relevantes (asortatividad, composición geográfica)**. Eso -es lo que la sandbox valida, sin el resto del "IA in the loop". - -**En contra (lo que sigue abierto):** -- `co_citacion` requiere un segundo nivel de fetch (citadores con - citaciones) que no se hizo. -- Las afiliaciones per-author del .bib sintético son un proxy; - OpenAlex las trae per-autor pero la implementación actual las - aplana a "Paper affiliation". -- El thesaurus es chico (25 conceptos); escalarlo a un campo real - requiere embeddings o LLM. -- No se validó con un caso de uso de investigación **real** (estudio - de semiconductores, deuda ecológica de un país específico). Eso - queda para el Hito de validación. - -## Próximos pasos sugeridos (actualizados) - -1. **Resolver `co_citacion`**: fetch del segundo nivel (citadores con - citaciones). 1-2 tardes, valida la 4ª red. -2. **Escribir el ADR "Thesaurus multilingüe para IED"** (T6 + T10): - decidir exhaustivo vs. cobertura + fuzzy, formato portable. -3. **Decidir el encuadre del Hito 3** a la luz de T2 actualizado - (sigue valiendo que sin enriquecimiento no hay co-citación, pero - ahora sabemos exactamente **qué** falta). -4. **Diagnosticar el bug per-author affiliation** (T7) en el Hito 3. -5. **Considerar el `Enricher` como Hito 2.5**: si la co-citación es - estructural, no debería esperar al Hito 6. (Decisión política; - registrarla en un ADR.) -6. **Recién después**, empezar el Hito 1 (núcleo puro). La sandbox - no se mete con eso — sigue intacto el plan del ROADMAP para el - núcleo. - -## Lecciones que la iteración 2 confirmó - -- **"Sin red en CI"** (lección de AGENTS.md) sigue valiendo, pero la - sandbox demuestra que **con red en desarrollo, una tarde rinde - más** que 5 tardes de especular. El balance: CI sin red, desarrollo - 偶尔 con red. -- **Idempotencia** del merge (T1 de v1) fue clave para que la nueva - corrida con reales se sumara limpio a las semillas sin duplicar. -- **La asortatividad como métrica IED-relevante** estaba en T5 de v1 - como hipótesis. Con datos reales se confirma. Pero el disclaimer - de T9 también: es un proxy, hay que ser explícito. -- **El thesaurus auditable a mano** (T6 de v1) fue la decisión - correcta: en 30 minutos curé 25 conceptos y la red mejoró - objetivamente. La alternativa "embeddings desde el día uno" habría - requerido instalar más deps, descargar modelos, y - opacar el comportamiento. - ---- - -_Informe escrito a mano sobre la corrida del 2026-06-14. v1 = sintético -(21 papers), v2 = mixto semillas + OpenAlex reales (103 papers). Datos -cuantitativos en `informe_ied.md` (regenerable). T1, T5, T6 resueltos; -T2 parcialmente; T4 sí resuelto; T7-T10 son tensiones nuevas. Decisión -sobre el Hito 3 sigue abierta y se beneficia de esta evidencia._ diff --git a/exploracion/requirements-exploracion.txt b/exploracion/requirements-exploracion.txt deleted file mode 100644 index e7c59b7..0000000 --- a/exploracion/requirements-exploracion.txt +++ /dev/null @@ -1,17 +0,0 @@ -# Dependencias de la sandbox de exploración. -# Instalación: pip install -r requirements-exploracion.txt -# Estas libs son EXCLUSIVAS de exploracion/. El núcleo de bib2graph -# (pyproject.toml) NO las conoce. - -# Backbone de datos -pyalex>=0.15 # cliente Python de la API de OpenAlex -bibtexparser>=1.4 # parser de .bib (defensivo, no rompe con campos faltantes) - -# Datos y redes -pandas>=2.2 # manipulación tabular -pyarrow>=15 # parquet (alineado con el núcleo) -networkx>=3.2 # grafos (alineado con el núcleo) -python-louvain>=0.16 # detección de comunidades (louvain) - -# Viz opcional -matplotlib>=3.8 diff --git a/exploracion/scripts/01_search_openalex.py b/exploracion/scripts/01_search_openalex.py deleted file mode 100644 index 678a110..0000000 --- a/exploracion/scripts/01_search_openalex.py +++ /dev/null @@ -1,177 +0,0 @@ -"""01 — Buscar papers de IED en OpenAlex y volcarlos a CSV. - -Salida: ``datos/openalex_ied.csv`` con el schema común de ``_schema.py``. - -Uso: - python 01_search_openalex.py --limit 200 - python 01_search_openalex.py --dry-run - python 01_search_openalex.py --query "ecological debt" --limit 50 - -Notas operativas: -- OpenAlex requiere API key desde feb-2026. Se lee de ``OPENALEX_API_KEY`` - o ``~/.openalex/credentials``. Sin key, el script igual corre a velocidad - "polite pool" (más lento, no rompe). -- Sin red (offline), corre ``--dry-run`` y muestra la query que se haría. -- El abstract en OpenAlex viene como ``abstract_inverted_index``: un dict - ``{palabra: [posiciones]}`` que hay que reconstruir. Si no está, el campo - queda en None (testeo del parser defensivo). -- Las referencias en OpenAlex son URLs (``https://openalex.org/W...``). Se - guardan como OpenAlex IDs. Si tienen DOI en el work referenciado, se prefiere - el DOI; esto requiere un fetch adicional que se hace solo si ``--resolve-refs`` - está activo. -""" -from __future__ import annotations - -import argparse -import csv -import os -import sys -from pathlib import Path -from typing import Any - -from _schema import CORPUS_COLUMNS, new_row - -DATA_DIR = Path(__file__).resolve().parent.parent / "datos" -OUT_CSV = DATA_DIR / "openalex_ied.csv" - -DEFAULT_QUERY = ( - '"ecological unequal exchange" OR "ecological debt" OR "deuda ecológica" ' - 'OR "intercambio ecológicamente desigual" OR "ecological footprint" ' - 'AND (trade OR commerce OR "material flow")' -) - - -def reconstruct_abstract(inv_index: dict[str, list[int]] | None) -> str | None: - if not inv_index: - return None - out: list[str] = [""] * (max((p for ps in inv_index.values() for p in ps), default=0) + 1) - for word, positions in inv_index.items(): - for p in positions: - out[p] = word - return " ".join(out).strip() or None - - -def openalex_id_to_doi(oa_id: str) -> str | None: - if not oa_id: - return None - if "doi.org/" in oa_id: - return oa_id.split("doi.org/")[-1].lower() - return None - - -def author_to_author_id(au: dict[str, Any]) -> str: - raw = au.get("id") or au.get("orcid") or au.get("display_name") or "unknown" - return str(raw).rsplit("/", 1)[-1] if isinstance(raw, str) else str(raw) - - -def work_to_row(work: dict[str, Any], is_seed: bool = False) -> dict[str, object]: - row = new_row() - row["id"] = (work.get("id") or "").rsplit("/", 1)[-1] or None - row["doi"] = openalex_id_to_doi(work.get("doi") or "") - row["title"] = work.get("title") or work.get("display_name") - row["year"] = work.get("publication_year") - row["abstract"] = reconstruct_abstract(work.get("abstract_inverted_index")) - authorships = work.get("authorships") or [] - row["authors_raw"] = [a.get("author", {}).get("display_name", "") - for a in authorships if a.get("author")] - row["authors_id"] = [author_to_author_id(a.get("author", {})) - for a in authorships if a.get("author")] - affils: list[str] = [] - for a in authorships: - for inst in a.get("institutions") or []: - country = (inst.get("country_code") or "").upper() or "??" - affils.append(f"{inst.get('display_name', '?')} ({country})") - row["authors_affiliations"] = affils - kws = work.get("keywords") or [] - row["keywords_raw"] = [k.get("display_name", "") for k in kws if k.get("display_name")] - row["keywords_id"] = [k.get("id", "").rsplit("/", 1)[-1] for k in kws if k.get("id")] - row["references_doi"] = [openalex_id_to_doi(r) or r - for r in (work.get("referenced_works") or [])] - loc = (work.get("primary_location") or {}).get("source") or {} - row["source"] = loc.get("display_name") - row["language"] = work.get("language") - row["is_seed"] = is_seed - return row - - -def serialize_list(value: object) -> str: - if isinstance(value, list): - return "; ".join(str(x) for x in value) - return "" if value is None else str(value) - - -def write_csv(rows: list[dict[str, object]], path: Path) -> None: - path.parent.mkdir(parents=True, exist_ok=True) - with path.open("w", newline="", encoding="utf-8") as fh: - writer = csv.DictWriter(fh, fieldnames=CORPUS_COLUMNS) - writer.writeheader() - for row in rows: - writer.writerow({c: serialize_list(row.get(c)) for c in CORPUS_COLUMNS}) - - -def get_api_key() -> str | None: - key = os.environ.get("OPENALEX_API_KEY") - if key: - return key - cred_path = Path.home() / ".openalex" / "credentials" - if cred_path.exists(): - return cred_path.read_text(encoding="utf-8").strip() or None - return None - - -def search_openalex(query: str, limit: int, api_key: str | None) -> list[dict[str, Any]]: - try: - import pyalex - from pyalex import Works - except ImportError as exc: - raise SystemExit( - f"pyalex no instalado. Hacé `pip install pyalex` o corré --dry-run.\n{exc}" - ) from exc - - if api_key: - pyalex.config.api_key = api_key - pyalex.config.max_retries = 3 - pyalex.config.retry_backoff_factor = 0.5 - - print(f"[01] Query OpenAlex: {query!r}", file=sys.stderr) - print(f"[01] Limit: {limit}, key: {'sí' if api_key else 'no (polite pool)'}", file=sys.stderr) - - works: list[dict[str, Any]] = [] - paginator = Works().search(query).select( - ["id", "doi", "title", "display_name", "publication_year", "language", - "abstract_inverted_index", "authorships", "keywords", - "referenced_works", "primary_location", "type"] - ).paginate(per_page=min(limit, 100)) - for page in paginator: - for w in page: - works.append(w) - if len(works) >= limit: - return works - return works - - -def main() -> int: - parser = argparse.ArgumentParser(description=__doc__) - parser.add_argument("--query", default=DEFAULT_QUERY) - parser.add_argument("--limit", type=int, default=200) - parser.add_argument("--dry-run", action="store_true", - help="Muestra la query sin llamar a la API.") - parser.add_argument("--out", type=Path, default=OUT_CSV) - args = parser.parse_args() - - if args.dry_run: - print(f"[01] DRY RUN. Query: {args.query!r}") - print(f"[01] DRY RUN. Salida: {args.out}") - print("[01] DRY RUN. Nada se escribió.") - return 0 - - api_key = get_api_key() - works = search_openalex(args.query, args.limit, api_key) - rows = [work_to_row(w, is_seed=False) for w in works] - write_csv(rows, args.out) - print(f"[01] {len(rows)} papers -> {args.out}", file=sys.stderr) - return 0 - - -if __name__ == "__main__": - raise SystemExit(main()) diff --git a/exploracion/scripts/02_load_bibtex.py b/exploracion/scripts/02_load_bibtex.py deleted file mode 100644 index cfc11c4..0000000 --- a/exploracion/scripts/02_load_bibtex.py +++ /dev/null @@ -1,244 +0,0 @@ -"""02 — Cargar un .bib semilla y volcarlo a CSV con el schema común. - -Reglas de la sandbox: -- Acceso **defensivo** a campos (``entry.get('author', [])``, no - ``entry['author']``). En BibTeX los campos opcionales faltan seguido. -- El ``author`` se guarda como lista separada por `` and `` en ``authors_raw`` - y se intenta parsear a ``"Apellido, Nombre"`` en ``authors_id`` (canonización - muy liviana; lo serio queda para el ``Preprocessor`` del núcleo). -- Sin afiliaciones en BibTeX estándar: ``authors_affiliations`` queda vacío. - El parser no inventa afiliaciones (lección 4 de v0 en ``lecciones-v0.md``). -- ``is_seed=True`` para todo lo que viene de .bib (el .bib es siempre semilla). -- Si la entrada no tiene DOI, se le asigna un id sintético ``bib:`` - para que sea dedupeable por el merge de ``03_merge_corpus.py``. -""" -from __future__ import annotations - -import argparse -import csv -import re -import sys -from pathlib import Path -from typing import Any - -from _schema import CORPUS_COLUMNS, new_row - -OUT_CSV_DEFAULT = Path(__file__).resolve().parent.parent / "datos" / "semillas_ied.csv" - - -def parse_author(raw: str) -> tuple[str, str]: - """Devuelve (display_name, canonical_id) muy liviano. - - Para "Apellido, Nombre" se conserva. Para "Nombre Apellido" se reordena. - El id canónico es ``"apellido_nombre"`` lowercased y sin acentos; sirve - para que la co-autoría matchee aunque la firma venga con/sin tilde. - """ - raw = (raw or "").strip() - if not raw: - return "", "" - if "," in raw: - apellido, _, nombre = raw.partition(",") - else: - parts = raw.split() - apellido = parts[-1] if parts else "" - nombre = " ".join(parts[:-1]) - apellido = apellido.strip() - nombre = nombre.strip() - canon = re.sub(r"\s+", "_", f"{apellido}_{nombre}").lower() - canon = re.sub(r"[^\w]", "", canon, flags=re.UNICODE) - return f"{apellido}, {nombre}".strip(", "), canon - - -def _unescape_latex(value: str) -> str: - """Desescapa secuencias LaTeX básicas que aparecen en .bib de revistas latam. - - No es un desescapador completo; sólo lo que la literatura de IED usa: - acentos, eñes, comillas tipográficas. La normalización profunda (canonización - de keywords, thesaurus) es trabajo del ``Preprocessor`` del núcleo. - - Soporta dos formas: ``\\'o`` simple y ``{\\'o}`` con llaves agrupadoras - (típico de revistas latam que embeben comandos LaTeX en grupos). - """ - import re - char_map = { - "a": "á", "e": "é", "i": "í", "o": "ó", "u": "ú", - "A": "Á", "E": "É", "I": "Í", "O": "Ó", "U": "Ú", - "n": "ñ", "N": "Ñ", - } - pattern = re.compile(r"\{\\['`\"\^~]([aeiounAEIOUN])\}|\\['`\"\^~]([aeiounAEIOUN])") - def _replace(m: re.Match[str]) -> str: - letter = m.group(1) or m.group(2) - return char_map.get(letter, m.group(0)) - value = pattern.sub(_replace, value) - - replacements = { - '\\"a': "ä", '\\"e': "ë", '\\"i': "ï", '\\"o': "ö", '\\"u': "ü", - "\\`a": "à", "\\`e": "è", "\\`o": "ò", - "``": "“", "''": "”", "`": "‘", - } - for k, v in replacements.items(): - value = value.replace(k, v) - return value - - -def get_keywords(entry: dict[str, Any]) -> list[str]: - raw = entry.get("keywords") or entry.get("keyword") - if not raw: - return [] - if isinstance(raw, list): - return [_unescape_latex(str(k)).strip() for k in raw if str(k).strip()] - return [_unescape_latex(k).strip() for k in str(raw).split(",") if k.strip()] - - -def entry_to_row(entry_dict: dict[str, Any], entry_id: str) -> dict[str, object]: - row = new_row() - row["id"] = entry_dict.get("doi") or f"bib:{entry_id}" - row["doi"] = entry_dict.get("doi") - row["title"] = _unescape_latex(entry_dict.get("title") or "") - row["year"] = int(entry_dict["year"]) if entry_dict.get("year") else None - row["abstract"] = _unescape_latex(entry_dict.get("abstract") or "") - authors_raw = entry_dict.get("author") or entry_dict.get("authors") or [] - if isinstance(authors_raw, str): - authors_raw = [_unescape_latex(a).strip() for a in re.split(r"\s+and\s+", authors_raw) if a.strip()] - elif authors_raw: - authors_raw = [_unescape_latex(str(a)).strip() for a in authors_raw if str(a).strip()] - names, ids = zip(*[parse_author(a) for a in authors_raw]) if authors_raw else ([], []) - row["authors_raw"] = list(names) - row["authors_id"] = list(ids) - aff = entry_dict.get("affiliation") - if aff: - affil_text = _unescape_latex(aff) if isinstance(aff, str) else str(aff) - affil_text = affil_text.strip() - if affil_text: - row["authors_affiliations"] = [f"Paper affiliation: {affil_text}"] - else: - row["authors_affiliations"] = [] - else: - row["authors_affiliations"] = [] - row["keywords_raw"] = get_keywords(entry_dict) - row["keywords_id"] = [re.sub(r"\s+", "_", k.lower()) for k in row["keywords_raw"]] - row["references_doi"] = [] - source = entry_dict.get("journal") or entry_dict.get("booktitle") or entry_dict.get("publisher") - row["source"] = _unescape_latex(source) if source else None - row["language"] = entry_dict.get("language") - row["is_seed"] = True - return row - - -def serialize_list(value: object) -> str: - if isinstance(value, list): - return "; ".join(str(x) for x in value) - return "" if value is None else str(value) - - -def write_csv(rows: list[dict[str, object]], path: Path) -> None: - path.parent.mkdir(parents=True, exist_ok=True) - with path.open("w", newline="", encoding="utf-8") as fh: - writer = csv.DictWriter(fh, fieldnames=CORPUS_COLUMNS) - writer.writeheader() - for row in rows: - writer.writerow({c: serialize_list(row.get(c)) for c in CORPUS_COLUMNS}) - - -def _preprocess_bib(text: str) -> tuple[str, int]: - """Limpia el .bib antes de pasárselo a ``bibtexparser``. - - Bug documentado de ``bibtexparser`` 1.4.x que esta función mitiga - (ver ``informe_ied_lectura.md`` T1): - - **``keywords`` como último campo + comentario ``%`` antes del ``}``**: - el parser **se come la entry entera**. Específicamente, si una entry - termina con ``keywords = {...},`` y después viene una línea ``%`` - (incluso vacía, incluso ASCII puro) antes del ``}`` de cierre, el - parser pierde la entry. Reproducible aislado. La fix es eliminar las - líneas ``%`` que estén dentro de una entry, justo antes del ``}`` - de cierre. Los comentarios entre campos o entre entries no se tocan. - - Devuelve ``(texto_limpio, n_comentarios_eliminados)``. - """ - n_fixed = 0 - lines = text.splitlines(keepends=True) - out: list[str] = [] - in_entry = False - i = 0 - while i < len(lines): - line = lines[i] - stripped = line.lstrip() - if stripped.startswith("@"): - in_entry = True - out.append(line) - i += 1 - continue - if not in_entry: - out.append(line) - i += 1 - continue - if stripped.startswith("}"): - in_entry = False - out.append(line) - i += 1 - continue - if stripped.startswith("%"): - j = i - while j < len(lines) and lines[j].lstrip().startswith("%"): - j += 1 - if j < len(lines) and lines[j].lstrip().startswith("}"): - n_fixed += j - i - i = j - continue - out.extend(lines[i:j]) - i = j - continue - out.append(line) - i += 1 - return "".join(out), n_fixed - - -def load_bibtex(path: Path) -> list[dict[str, Any]]: - try: - import bibtexparser - from bibtexparser.bparser import BibTexParser - except ImportError as exc: - raise SystemExit( - f"bibtexparser no instalado. Hacé `pip install bibtexparser`.\n{exc}" - ) from exc - - raw = path.read_text(encoding="utf-8") - cleaned, n_fixed = _preprocess_bib(raw) - if n_fixed: - print(f"[02] Pre-procesador: {n_fixed} comentarios ``%`` antes de " - f"``}}`` eliminados (fix de bug bibtexparser T1).", file=sys.stderr) - - parser = BibTexParser(common_strings=True) - parser.ignore_nonstandard_types = False - db = bibtexparser.loads(cleaned, parser=parser) - return [dict(e) for e in db.entries] - - -def main() -> int: - parser = argparse.ArgumentParser(description=__doc__) - parser.add_argument("--bib", type=Path, required=True) - parser.add_argument("--out", type=Path, default=OUT_CSV_DEFAULT) - args = parser.parse_args() - - if not args.bib.exists(): - print(f"[02] ERROR: no existe {args.bib}", file=sys.stderr) - return 2 - - entries = load_bibtex(args.bib) - print(f"[02] {len(entries)} entradas leídas de {args.bib}", file=sys.stderr) - - rows = [entry_to_row(e, e.get("ID", f"n{i}")) for i, e in enumerate(entries)] - n_sin_doi = sum(1 for r in rows if not r.get("doi")) - n_sin_kw = sum(1 for r in rows if not r["keywords_raw"]) - n_sin_abs = sum(1 for r in rows if not r.get("abstract")) - print(f"[02] Defensivo: {n_sin_doi} sin DOI, {n_sin_kw} sin keywords, " - f"{n_sin_abs} sin abstract", file=sys.stderr) - - write_csv(rows, args.out) - print(f"[02] {len(rows)} filas -> {args.out}", file=sys.stderr) - return 0 - - -if __name__ == "__main__": - raise SystemExit(main()) diff --git a/exploracion/scripts/03_merge_corpus.py b/exploracion/scripts/03_merge_corpus.py deleted file mode 100644 index a8d437b..0000000 --- a/exploracion/scripts/03_merge_corpus.py +++ /dev/null @@ -1,180 +0,0 @@ -"""03 — Unir múltiples CSVs en un solo corpus, deduplicar y dumpear parquet. - -Decisiones de la sandbox: -- **Dedupe por DOI normalizado** (lowercase, sin prefijo ``https://``). Si dos - filas comparten DOI, se mergea: gana la que tiene más campos no vacíos, y - se hace OR lógico sobre ``is_seed`` (si alguna fuente la marcó como semilla, - queda como semilla). -- Si no hay DOI, se cae al ``id`` sintético (``bib:`` o ``W...`` de OpenAlex). -- La **lista** de campos se deserializa de CSV (``";"``-separado) a ``list[str]`` - antes de pasar a parquet, y se serializa al revés al leer. -- Salida: - - ``datos/corpus_ied.csv`` — para inspección humana. - - ``datos/corpus_ied.parquet`` — para los scripts siguientes (más rápido). -- Imprime un resumen de qué se mergeó y qué se descartó. -""" -from __future__ import annotations - -import argparse -import sys -from pathlib import Path - -from _schema import CORPUS_COLUMNS, new_row - -DATA_DIR = Path(__file__).resolve().parent.parent / "datos" - -_LIST_COLUMNS = {"authors_raw", "authors_id", "authors_affiliations", - "keywords_raw", "keywords_id", "references_doi"} - - -def normalize_doi(doi: str | None) -> str | None: - if not doi: - return None - d = doi.strip().lower() - for prefix in ("https://doi.org/", "http://doi.org/", "doi.org/", "doi:"): - if d.startswith(prefix): - d = d[len(prefix):] - return d or None - - -def read_csv(path: Path) -> list[dict[str, object]]: - import csv - rows: list[dict[str, object]] = [] - with path.open(encoding="utf-8") as fh: - reader = csv.DictReader(fh) - for raw in reader: - row = new_row() - for c in CORPUS_COLUMNS: - val = raw.get(c, "") - if c in _LIST_COLUMNS: - row[c] = [v.strip() for v in val.split(";") if v.strip()] - elif c == "year": - row[c] = int(val) if val and val.strip().isdigit() else None - elif c == "is_seed": - row[c] = val.lower() in {"true", "1", "yes", "sí", "si"} - else: - row[c] = val.strip() or None - rows.append(row) - return rows - - -def fillness(row: dict[str, object]) -> int: - return sum(1 for v in row.values() if v not in (None, "", [])) - - -def merge_rows(a: dict[str, object], b: dict[str, object]) -> dict[str, object]: - """Gana la fila con más campos llenos; mergea listas; OR sobre is_seed.""" - winner = a if fillness(a) >= fillness(b) else b - loser = b if winner is a else a - out = dict(winner) - for col in _LIST_COLUMNS: - merged = list(winner.get(col) or []) + [x for x in (loser.get(col) or []) - if x not in (winner.get(col) or [])] - out[col] = merged - out["is_seed"] = bool(winner.get("is_seed")) or bool(loser.get("is_seed")) - return out - - -def dedupe(rows: list[dict[str, object]]) -> tuple[list[dict[str, object]], dict[str, int]]: - by_doi: dict[str, dict[str, object]] = {} - by_id: dict[str, dict[str, object]] = {} - no_key: list[dict[str, object]] = [] - stats = {"by_doi": 0, "by_id": 0, "no_key": 0} - - for row in rows: - doi = normalize_doi(row.get("doi")) - rid = row.get("id") - if doi: - if doi in by_doi: - by_doi[doi] = merge_rows(by_doi[doi], row) - stats["by_doi"] += 1 - else: - by_doi[doi] = row - elif rid: - if rid in by_id: - by_id[rid] = merge_rows(by_id[rid], row) - stats["by_id"] += 1 - else: - by_id[rid] = row - else: - no_key.append(row) - stats["no_key"] += 1 - - return list(by_doi.values()) + list(by_id.values()) + no_key, stats - - -def write_csv(rows: list[dict[str, object]], path: Path) -> None: - import csv - path.parent.mkdir(parents=True, exist_ok=True) - with path.open("w", newline="", encoding="utf-8") as fh: - writer = csv.DictWriter(fh, fieldnames=CORPUS_COLUMNS) - writer.writeheader() - for row in rows: - serialized: dict[str, object] = {} - for c in CORPUS_COLUMNS: - v = row.get(c) - if isinstance(v, list): - serialized[c] = "; ".join(str(x) for x in v) - else: - serialized[c] = "" if v is None else str(v) - writer.writerow(serialized) - - -def write_parquet(rows: list[dict[str, object]], path: Path) -> None: - try: - import pyarrow as pa - import pyarrow.parquet as pq - except ImportError as exc: - raise SystemExit(f"pyarrow no instalado. `pip install pyarrow`.\n{exc}") from exc - - arrays: dict[str, list[object]] = {c: [] for c in CORPUS_COLUMNS} - for row in rows: - for c in CORPUS_COLUMNS: - v = row.get(c) - if c in _LIST_COLUMNS and v is None: - v = [] - arrays[c].append(v) - table = pa.table(arrays) - path.parent.mkdir(parents=True, exist_ok=True) - pq.write_table(table, path) - - -def main() -> int: - parser = argparse.ArgumentParser(description=__doc__) - parser.add_argument("--inputs", nargs="+", type=Path, required=True, - help="CSVs a unir (uno o más).") - parser.add_argument("--out-csv", type=Path, default=DATA_DIR / "corpus_ied.csv") - parser.add_argument("--out-parquet", type=Path, default=DATA_DIR / "corpus_ied.parquet") - args = parser.parse_args() - - all_rows: list[dict[str, object]] = [] - for src in args.inputs: - if not src.exists(): - print(f"[03] WARN: {src} no existe, lo salto.", file=sys.stderr) - continue - rows = read_csv(src) - print(f"[03] {len(rows):>4} filas de {src}", file=sys.stderr) - all_rows.extend(rows) - print(f"[03] Total sin dedup: {len(all_rows)}", file=sys.stderr) - - merged, stats = dedupe(all_rows) - print(f"[03] Dedup: {stats['by_doi']} merges por DOI, " - f"{stats['by_id']} por id, {stats['no_key']} sin clave.", file=sys.stderr) - print(f"[03] Total dedupeado: {len(merged)}", file=sys.stderr) - - n_seed = sum(1 for r in merged if r.get("is_seed")) - n_with_doi = sum(1 for r in merged if r.get("doi")) - n_with_kw = sum(1 for r in merged if r["keywords_raw"]) - n_with_abs = sum(1 for r in merged if r.get("abstract")) - print(f"[03] Composición: {n_seed} semillas, {n_with_doi} con DOI, " - f"{n_with_kw} con keywords, {n_with_abs} con abstract.", file=sys.stderr) - - write_csv(merged, args.out_csv) - write_parquet(merged, args.out_parquet) - print(f"[03] CSV -> {args.out_csv}", file=sys.stderr) - print(f"[03] Parquet -> {args.out_parquet}", file=sys.stderr) - return 0 - - -if __name__ == "__main__": - raise SystemExit(main()) diff --git a/exploracion/scripts/04_build_networks.py b/exploracion/scripts/04_build_networks.py deleted file mode 100644 index bf17821..0000000 --- a/exploracion/scripts/04_build_networks.py +++ /dev/null @@ -1,204 +0,0 @@ -"""04 — Construir las 4 redes bibliométricas y exportarlas a GraphML. - -Redes (orden de la tabla de ``docs/API.md`` §5): -- **co_citacion**: papers semilla que comparten referencias. - Peso = # de referencias compartidas. - Nodos = papers semilla; aristas = co-citación. -- **co_autoria**: autores que co-firman papers semilla. - Peso = # de papers co-firmados. - Nodos = autores; aristas = co-firma. -- **co_word**: keywords que co-ocurren en papers semilla. - Peso = # de papers que comparten esa keyword. - Nodos = keywords; aristas = co-ocurrencia. -- **coupling**: papers semilla que comparten referencias. - **Conceptualmente** igual a co-citación pero **la unidad - es el par de papers que citan lo mismo, no las - referencias citadas**. Acá lo implementamos como - "papers del corpus que comparten al menos una referencia - resuelta por DOI". Si no hay refs, queda vacío. - -Decisiones de la sandbox: -- Solo se usan **papers semilla** (``is_seed=True``) en co-citación, co-word - y coupling. Co-autoría usa todos los autores firmantes de semillas. -- Las listas en parquet (``authors_id``, ``keywords_id``, ``references_doi``) - son ``list[str]`` ya deserializadas (pyarrow + pyarrow.list_). -- El output es **GraphML** (interoperable con Gephi, VOSviewer, NetworkX). -- Cada red tiene atributos ``kind`` y ``seed_only`` (True/False) en metadata. -- Si la red queda vacía (ej: sin referencias), se escribe un GraphML mínimo - con 0 nodos y 0 aristas **y se reporta** en stderr. No se rompe el pipeline. -""" -from __future__ import annotations - -import argparse -import sys -from collections import Counter -from itertools import combinations -from pathlib import Path - -import networkx as nx - -DATA_DIR = Path(__file__).resolve().parent.parent / "datos" -REDES_DIR = DATA_DIR / "redes" - - -def load_corpus(path: Path) -> list[dict[str, object]]: - import pyarrow.parquet as pq - table = pq.read_table(path).to_pylist() - return table - - -def build_co_citacion(seeds: list[dict[str, object]]) -> nx.Graph: - """Nodos: papers semilla. Aristas: comparten >= 1 referencia (DOI).""" - g = nx.Graph() - for s in seeds: - g.add_node(s["id"], label=s.get("title") or s["id"], year=s.get("year")) - ref_index: dict[str, list[str]] = {} - for s in seeds: - for ref in s.get("references_doi") or []: - if not ref: - continue - ref_index.setdefault(ref, []).append(s["id"]) - for _ref, papers in ref_index.items(): - for a, b in combinations(sorted(set(papers)), 2): - if g.has_edge(a, b): - g[a][b]["weight"] += 1 - else: - g.add_edge(a, b, weight=1) - return g - - -def build_co_autoria(seeds: list[dict[str, object]]) -> nx.Graph: - """Nodos: autores. Aristas: co-firman >= 1 paper semilla.""" - g = nx.Graph() - for s in seeds: - authors = s.get("authors_id") or [] - for a in authors: - if not a: - continue - g.add_node(a, label=a) - for a, b in combinations(sorted(set(a for a in authors if a)), 2): - if g.has_edge(a, b): - g[a][b]["weight"] += 1 - else: - g.add_edge(a, b, weight=1) - return g - - -def build_co_word(seeds: list[dict[str, object]]) -> nx.Graph: - """Nodos: keywords. Aristas: co-ocurren en >= 1 paper semilla.""" - g = nx.Graph() - for s in seeds: - kws = s.get("keywords_id") or [] - for k in kws: - if not k: - continue - g.add_node(k, label=k) - for a, b in combinations(sorted(set(k for k in kws if k)), 2): - if g.has_edge(a, b): - g[a][b]["weight"] += 1 - else: - g.add_edge(a, b, weight=1) - return g - - -def build_coupling(papers: list[dict[str, object]], scope: str = "seeds") -> nx.Graph: - """Nodos: papers. Aristas: comparten >= 1 referencia por DOI. - - Acoplamento bibliográfico: dos papers están acoplados si comparten - al menos una referencia. Distinto de co-citación: la co-citación mira - papers que son citados **juntos por terceros** (los citadores); el - coupling mira papers que **comparten su lista de referencias**. - - Parámetro ``scope``: - - ``"seeds"`` (default, lo que hacía la v1): sólo papers semilla. - Operacionalmente equivalente a co-citación cuando no hay citadores - incorporados al corpus. - - ``"full"``: corpus completo (semillas + citadores + referencias - resueltas traídas por el Enricher, ``is_seed=False``). La diferencia - con ``"seeds"`` aparece sólo si el corpus tiene citadores. Con - datos sintéticos sin enriquecer, ambos dan lo mismo. - - Si los papers no declaran ``references_doi``, la red queda vacía. - """ - g = nx.Graph() - target = papers if scope == "full" else [p for p in papers if p.get("is_seed")] - for s in target: - g.add_node(s["id"], label=s.get("title") or s["id"], - year=s.get("year"), is_seed=bool(s.get("is_seed"))) - for a, b in combinations(target, 2): - refs_a = set(a.get("references_doi") or []) - refs_b = set(b.get("references_doi") or []) - shared = refs_a & refs_b - if shared: - g.add_edge(a["id"], b["id"], weight=len(shared)) - return g - - -def report(g: nx.Graph, kind: str, n_seeds: int) -> None: - n_e = g.number_of_edges() - n_n = g.number_of_nodes() - if n_n == 0: - print(f"[04] {kind:<12} VACÍA (0 nodos, 0 aristas)", file=sys.stderr) - else: - density = nx.density(g) - print(f"[04] {kind:<12} {n_n:>4} nodos, {n_e:>5} aristas, " - f"densidad {density:.4f} (seeds={n_seeds})", file=sys.stderr) - - -def write_graphml(g: nx.Graph, path: Path, kind: str, n_seeds: int) -> None: - g.graph["kind"] = kind - g.graph["seed_only"] = True - g.graph["n_seeds"] = n_seeds - path.parent.mkdir(parents=True, exist_ok=True) - nx.write_graphml(g, path) - - -def main() -> int: - parser = argparse.ArgumentParser(description=__doc__) - parser.add_argument("--corpus", type=Path, default=DATA_DIR / "corpus_ied.parquet") - parser.add_argument("--out-dir", type=Path, default=REDES_DIR) - parser.add_argument("--kinds", nargs="+", - default=["co_citacion", "co_autoria", "co_word", "coupling"]) - parser.add_argument("--coupling-scope", choices=["seeds", "full"], default="seeds", - help="Scope de la red coupling. 'seeds' (default) = solo " - "semillas; 'full' = corpus completo. Sólo se nota " - "la diferencia si hay citadores (is_seed=False) " - "en el corpus.") - args = parser.parse_args() - - if not args.corpus.exists(): - print(f"[04] ERROR: no existe {args.corpus}. Corré 02/03 primero.", file=sys.stderr) - return 2 - - rows = load_corpus(args.corpus) - seeds = [r for r in rows if r.get("is_seed")] - n_total = len(rows) - n_citadores = n_total - len(seeds) - print(f"[04] Corpus: {n_total} filas totales, {len(seeds)} semillas, " - f"{n_citadores} citadores (is_seed=False).", file=sys.stderr) - - builders = { - "co_citacion": build_co_citacion, - "co_autoria": build_co_autoria, - "co_word": build_co_word, - } - for kind in args.kinds: - if kind not in builders and kind != "coupling": - print(f"[04] WARN: kind desconocido {kind!r}, lo salto.", file=sys.stderr) - continue - if kind == "coupling": - g = build_coupling(rows, scope=args.coupling_scope) - label = f"coupling[{args.coupling_scope}]" - else: - g = builders[kind](seeds) - label = kind - report(g, label, len(seeds)) - fname = f"{kind}.graphml" if kind != "coupling" else f"coupling_{args.coupling_scope}.graphml" - out = args.out_dir / fname - write_graphml(g, out, kind, len(seeds)) - print(f"[04] {label} -> {out}", file=sys.stderr) - return 0 - - -if __name__ == "__main__": - raise SystemExit(main()) diff --git a/exploracion/scripts/05_metrics_report.py b/exploracion/scripts/05_metrics_report.py deleted file mode 100644 index 29403ab..0000000 --- a/exploracion/scripts/05_metrics_report.py +++ /dev/null @@ -1,335 +0,0 @@ -"""05 — Métricas de redes + informe narrado del caso IED. - -Para cada red calcula: -- Top-N nodos por **centralidad de grado** (degree centrality) y por - **centralidad de intermediación** (betweenness centrality). La segunda - es cara O(V*E) — se aplica sólo si la red tiene < 500 nodos. -- Distribución de componentes conexas (cuántos nodos están en el componente - gigante). -- **Asimetrías geográficas** del corpus: a partir de ``authors_affiliations`` - (que sí están pobladas cuando la fuente es OpenAlex, no cuando es .bib), - cuenta papers con al menos un autor en cada macro-región (Global North vs - Global South). Si el corpus no tiene afiliaciones, se reporta como - "no medible con este corpus" en vez de inventar. - -Salida: -- ``informe_ied.md`` con secciones por red, más una sección de "tensiones - detectadas" con la plantilla del README (``Decisión / Por qué / Implicación - para el diseño / Pendiente``). - -Las comunidades (louvain) se calculan si el paquete está instalado -(``python-louvain``), siguiendo la regla de ``lecciones-v0.md``: fallar fuerte -sólo cuando se pide; nunca en silencio. -""" -from __future__ import annotations - -import argparse -import re -import sys -from collections import Counter, defaultdict -from pathlib import Path - -import networkx as nx - -DATA_DIR = Path(__file__).resolve().parent.parent / "datos" -REDES_DIR = DATA_DIR / "redes" -INFORME = DATA_DIR.parent / "informe_ied.md" - -NORTH = {"US", "USA", "UNITED STATES", "GB", "UK", "UNITED KINGDOM", "DE", "GERMANY", - "FR", "FRANCE", "NL", "NETHERLANDS", "SE", "SWEDEN", "FI", "FINLAND", - "NO", "NORWAY", "DK", "DENMARK", "CA", "CANADA", "AU", "AUSTRALIA", - "JP", "JAPAN", "AT", "AUSTRIA", "CH", "SWITZERLAND", "IT", "ITALY", - "ES", "SPAIN", "BE", "BELGIUM"} -SOUTH = {"AR", "ARGENTINA", "BR", "BRAZIL", "BO", "BOLIVIA", "CL", "CHILE", - "CO", "COLOMBIA", "EC", "ECUADOR", "PE", "PERU", "MX", "MEXICO", - "VE", "VENEZUELA", "UY", "URUGUAY", "PY", "PARAGUAY", "IN", "INDIA", - "ZA", "SOUTH AFRICA", "CN", "CHINA", "ID", "INDONESIA", "NG", "NIGERIA", - "KE", "KENYA", "EG", "EGYPT"} - - -def extract_country(affil: str) -> str: - """Extrae código de país de un string de afiliación. - - Soporta dos formatos: - - OpenAlex-style: ``"University of X (US)"`` -> ``"US"`` - - Sandbox-style: ``"Paper affiliation: AR"`` -> ``"AR"`` - """ - s = affil.strip() - m = re.search(r"\(([A-Z]{2,})\)\s*$", s) - if m: - return m.group(1).upper() - if ":" in s: - tail = s.rsplit(":", 1)[1].strip() - if re.match(r"^[A-Z]{2,}$", tail): - return tail - return "" - - -def paper_geography(paper: dict[str, object]) -> set[str]: - """Devuelve {'NORTH', 'SOUTH', 'MIXED', 'UNKNOWN'}.""" - affils = paper.get("authors_affiliations") or [] - if not affils: - return {"UNKNOWN"} - has_n = has_s = False - for a in affils: - c = extract_country(str(a)) - if c in NORTH: - has_n = True - elif c in SOUTH: - has_s = True - if has_n and has_s: - return {"MIXED"} - if has_n: - return {"NORTH"} - if has_s: - return {"SOUTH"} - return {"UNKNOWN"} - - -def top_by_centrality(g: nx.Graph, kind: str, n: int = 10) -> list[tuple[str, float]]: - if g.number_of_nodes() == 0: - return [] - if kind == "degree": - scores = nx.degree_centrality(g) - elif kind == "betweenness": - if g.number_of_nodes() > 500: - return [] - scores = nx.betweenness_centrality(g, weight="weight") - else: - raise ValueError(kind) - return sorted(scores.items(), key=lambda kv: kv[1], reverse=True)[:n] - - -def components_summary(g: nx.Graph) -> tuple[int, int, float]: - if g.number_of_nodes() == 0: - return 0, 0, 0.0 - comps = list(nx.connected_components(g)) - n_comps = len(comps) - gcc = max(comps, key=len) - gcc_frac = len(gcc) / g.number_of_nodes() - return n_comps, len(gcc), gcc_frac - - -def try_louvain(g: nx.Graph) -> dict[str, int] | None: - try: - import community as community_louvain - except ImportError: - return None - if g.number_of_nodes() == 0: - return {} - partition = community_louvain.best_partition(g, weight="weight", random_state=42) - return partition - - -def load_graph(path: Path) -> nx.Graph | None: - if not path.exists(): - return None - return nx.read_graphml(path) - - -def load_coupling_graph(out_dir: Path) -> nx.Graph | None: - """Carga el grafo de coupling: prefiere la versión 'full' (con citadores) - si existe, si no la 'seeds'. El script 04 puede generar las dos - según ``--coupling-scope``; acá tomamos la más completa disponible.""" - for name in ("coupling_full.graphml", "coupling_seeds.graphml", "coupling.graphml"): - g = load_graph(out_dir / name) - if g is not None: - return g - return None - - -def report_network(g: nx.Graph, kind: str, papers: list[dict[str, object]] | None = None) -> str: - lines = [f"### Red: `{kind}`", ""] - if g is None or g.number_of_nodes() == 0: - lines += ["**Vacía** — sin estructura. Posibles causas reportadas en " - "la sección de tensiones.", ""] - return "\n".join(lines) - n_n, n_e = g.number_of_nodes(), g.number_of_edges() - density = nx.density(g) - n_comps, gcc_size, gcc_frac = components_summary(g) - - geo_attr: dict[str, str] = {} - if papers and kind == "co_autoria": - for p in papers: - countries = [extract_country(str(aff)) - for aff in (p.get("authors_affiliations") or [])] - countries = [c for c in countries if c] - if not countries: - continue - region = "NORTH" if countries[0] in NORTH else ( - "SOUTH" if countries[0] in SOUTH else "UNKNOWN") - for a in (p.get("authors_id") or []): - if a: - geo_attr[a] = region - for n in g.nodes: - if n in geo_attr: - g.nodes[n]["geo"] = geo_attr[n] - - lines += [ - f"- Nodos: **{n_n}** | Aristas: **{n_e}** | Densidad: **{density:.4f}**", - f"- Componentes conexas: **{n_comps}** | GCC: **{gcc_size}** nodos " - f"(**{gcc_frac:.0%}** del total)", - "", - ] - - if geo_attr and kind == "co_autoria": - nodes_with_geo = [n for n in g.nodes if n in geo_attr] - n_geo = len(nodes_with_geo) - n_no_geo = g.number_of_nodes() - n_geo - if n_geo > 0: - try: - ass = nx.attribute_assortativity_coefficient(g, "geo") - except Exception: - ass = None - try: - deg_ass = nx.degree_assortativity_coefficient(g, weight="weight") - except Exception: - deg_ass = None - lines.append(f"**Asortatividad (autoría con geografía):**") - lines.append(f" - Nodos con geografía asignada: **{n_geo}/{g.number_of_nodes()}** " - f"({n_geo / g.number_of_nodes():.0%}) — {n_no_geo} sin asignar " - f"(autores OpenAlex sin afiliación poblada).") - if ass is not None and not (isinstance(ass, float) and ass != ass): - lines.append(f" - Por región (NORTH/SOUTH/UNKNOWN): " - f"**{ass:+.3f}** " - f"({'positivo = homofilia (Norte con Norte)' if ass > 0 else 'negativo = heterofilia (Norte con Sur)'})") - else: - lines.append(" - Por región: _(no calculable — distribución degenerada)_") - if deg_ass is not None and not (isinstance(deg_ass, float) and deg_ass != deg_ass): - lines.append(f" - Por grado (degree assortativity, ponderada): " - f"**{deg_ass:+.3f}** " - f"({'autores prolíficos co-firman con prolíficos' if deg_ass > 0 else 'autores prolíficos co-firman con periferia'})") - lines.append("") - - lines.append("**Top 10 por centralidad de grado:**\n") - for node, score in top_by_centrality(g, "degree", 10): - label = g.nodes[node].get("label", node) - suffix = f" [{geo_attr.get(node, '')}]" if geo_attr and node in geo_attr else "" - lines.append(f" - `{label}`{suffix} — {score:.3f}") - lines.append("") - lines.append("**Top 10 por centralidad de intermediación** (betweenness):\n") - bt = top_by_centrality(g, "betweenness", 10) - if not bt: - lines.append(" - _(red > 500 nodos: salteado por costo)_") - else: - for node, score in bt: - label = g.nodes[node].get("label", node) - suffix = f" [{geo_attr.get(node, '')}]" if geo_attr and node in geo_attr else "" - lines.append(f" - `{label}`{suffix} — {score:.4f}") - lines.append("") - - partition = try_louvain(g) - if partition is not None and partition: - sizes = Counter(partition.values()) - n_comms = len(sizes) - lines.append(f"**Comunidades (louvain):** {n_comms}\n") - for cid, size in sorted(sizes.items(), key=lambda kv: -kv[1])[:5]: - members = [n for n, c in partition.items() if c == cid] - sample = ", ".join(f"`{g.nodes[m].get('label', m)}`" for m in members[:3]) - if geo_attr: - geo_counts = Counter(geo_attr.get(m, "?") for m in members) - geo_str = ", ".join(f"{k}:{v}" for k, v in sorted(geo_counts.items())) - lines.append(f" - Comunidad {cid} ({size} nodos): {sample}… — geo: {geo_str}") - else: - lines.append(f" - Comunidad {cid} ({size} nodos): {sample}…") - elif partition is None: - lines.append("**Comunidades:** _(python-louvain no instalado; `pip install python-louvain`)_") - lines.append("") - return "\n".join(lines) - - -def report_geography(papers: list[dict[str, object]]) -> str: - counts: Counter[str] = Counter() - for p in papers: - for g_name in paper_geography(p): - counts[g_name] += 1 - n = len(papers) - if n == 0: - return "### Geografía\n\n_Sin papers._\n" - lines = ["### Geografía del corpus", ""] - if all(c == "UNKNOWN" for c in counts) or not counts: - lines += [ - f"- {n} papers en el corpus, **sin afiliaciones pobladas**.", - "- Imposible medir asimetrías Norte-Sur **con este corpus**.", - "- El .bib sintético no tiene afiliaciones (campo raro en BibTeX).", - "- En datos reales de OpenAlex (script 01) este análisis sí es viable.", - "", - ] - return "\n".join(lines) - lines.append(f"- {n} papers totales.\n") - for region in ("NORTH", "SOUTH", "MIXED", "UNKNOWN"): - c = counts.get(region, 0) - if c: - lines.append(f" - **{region}**: {c} ({c / n:.0%})") - lines.append("") - n_s = counts.get("SOUTH", 0) - n_n = counts.get("NORTH", 0) - n_m = counts.get("MIXED", 0) - if n_s + n_n > 0 and n_s > 0: - ratio = (n_s + n_m) / (n_s + n_n + n_m) if (n_s + n_n + n_m) else 0 - lines.append( - f"- **Asimetría:** {ratio:.0%} de los papers tiene al menos un autor " - f"del Global South (incluyendo co-autorías mixtas). Útil para IED: " - f"indica penetración del Sur en el campo, no solo hegemonía del Norte." - ) - lines.append("") - return "\n".join(lines) - - -def main() -> int: - parser = argparse.ArgumentParser(description=__doc__) - parser.add_argument("--corpus", type=Path, default=DATA_DIR / "corpus_ied.parquet") - parser.add_argument("--out", type=Path, default=INFORME) - parser.add_argument("--kinds", nargs="+", - default=["co_citacion", "co_autoria", "co_word", "coupling"]) - args = parser.parse_args() - - if not args.corpus.exists(): - print(f"[05] ERROR: no existe {args.corpus}.", file=sys.stderr) - return 2 - - import pyarrow.parquet as pq - papers = pq.read_table(args.corpus).to_pylist() - - sections: list[str] = ["# Informe IED — sandbox `exploracion/`", "", - f"_Generado por `05_metrics_report.py` sobre " - f"`{args.corpus.name}` ({len(papers)} papers)._", ""] - sections += ["## Composición del corpus", "", - f"- {len(papers)} papers totales.", - f"- {sum(1 for p in papers if p.get('is_seed'))} semillas."] - - geo = defaultdict(int) - for p in papers: - for k in paper_geography(p): - geo[k] += 1 - if geo and not (len(geo) == 1 and "UNKNOWN" in geo): - sections += [f"- Distribución geográfica: " - + ", ".join(f"{k}={v}" for k, v in sorted(geo.items()))] - sections.append("") - - sections += ["## Redes", ""] - for kind in args.kinds: - if kind == "coupling": - g = load_coupling_graph(REDES_DIR) - else: - g = load_graph(REDES_DIR / f"{kind}.graphml") - sections.append(report_network(g, kind, papers=papers)) - - sections.append(report_geography(papers)) - - args.out.parent.mkdir(parents=True, exist_ok=True) - args.out.write_text("\n".join(sections), encoding="utf-8") - print(f"[05] Informe -> {args.out}", file=sys.stderr) - candidates = sorted(args.out.parent.glob("informe_ied_lectura_*.md"), - key=lambda p: p.stat().st_mtime, reverse=True) - candidates = [c for c in candidates if "auto" not in c.name] - if candidates: - print(f"[05] Lectura sustantiva (a mano, más reciente): {candidates[0]}", file=sys.stderr) - else: - print(f"[05] AVISO: no hay informe_ied_lectura_*.md — escribila a mano " - f"con tensiones y hallazgos cualitativos.", file=sys.stderr) - return 0 - - -if __name__ == "__main__": - raise SystemExit(main()) diff --git a/exploracion/scripts/06_apply_thesaurus.py b/exploracion/scripts/06_apply_thesaurus.py deleted file mode 100644 index 8627664..0000000 --- a/exploracion/scripts/06_apply_thesaurus.py +++ /dev/null @@ -1,122 +0,0 @@ -"""06 — Aplicar el thesaurus multilingüe a las keywords del corpus. - -Toma el ``corpus_ied.parquet`` producido por ``03_merge_corpus.py`` y, para -cada paper, mapea cada keyword (en cualquiera de los idiomas del thesaurus) -a su **concepto canónico**. Lo hace **en la columna** ``keywords_id`` (que -es la que consume ``04_build_networks.py`` para construir la red de co-word). - -Reglas: -- La búsqueda de aliases es **case-insensitive** y **normaliza acentos** - (``deuda ecol{\'o}gica`` se trata igual a ``deuda ecologica``). -- Si una keyword matchea un alias, se reemplaza por la clave canónica. -- Si no matchea, se queda como está (no se inventan matches). -- **Idempotente**: correr dos veces no rompe nada. - -El thesaurus vive en ``datos/thesaurus_ied.json`` y es **auditable a mano** -(ver su campo ``_meta.limitations``). -""" -from __future__ import annotations - -import argparse -import json -import sys -import unicodedata -from pathlib import Path - -DATA_DIR = Path(__file__).resolve().parent.parent / "datos" - - -def _norm(s: str) -> str: - """Lowercase + sin acentos + trim + colapsa espacios.""" - s = s.lower().strip() - s = "".join(c for c in unicodedata.normalize("NFD", s) if unicodedata.category(c) != "Mn") - return " ".join(s.split()) - - -def load_thesaurus(path: Path) -> dict[str, dict[str, list[str]]]: - with path.open(encoding="utf-8") as fh: - data = json.load(fh) - table: dict[str, str] = {} - for canonical, spec in data["concepts"].items(): - for lang_key, aliases in spec.items(): - if not lang_key.startswith("aliases_"): - continue - for alias in aliases: - table[_norm(alias)] = canonical - return table - - -def map_keyword(kw: str, table: dict[str, str]) -> str: - n = _norm(kw) - return table.get(n, n) - - -def apply_thesaurus_to_papers( - papers: list[dict[str, object]], table: dict[str, str] -) -> tuple[list[dict[str, object]], int, int]: - n_total = 0 - n_mapped = 0 - out: list[dict[str, object]] = [] - for paper in papers: - kws = paper.get("keywords_raw") or [] - new_canonicals: list[str] = [] - mapped_count = 0 - for kw in kws: - n_total += 1 - canonical = map_keyword(kw, table) - if canonical != _norm(kw): - mapped_count += 1 - new_canonicals.append(canonical) - seen = set() - deduped: list[str] = [] - for c in new_canonicals: - if c not in seen: - seen.add(c) - deduped.append(c) - new_paper = dict(paper) - new_paper["keywords_id"] = deduped - n_mapped += mapped_count - out.append(new_paper) - return out, n_total, n_mapped - - -def main() -> int: - parser = argparse.ArgumentParser(description=__doc__) - parser.add_argument("--in-parquet", type=Path, default=DATA_DIR / "corpus_ied.parquet") - parser.add_argument("--thesaurus", type=Path, default=DATA_DIR / "thesaurus_ied.json") - parser.add_argument("--out-parquet", type=Path, default=DATA_DIR / "corpus_ied.parquet") - args = parser.parse_args() - - if not args.in_parquet.exists(): - print(f"[06] ERROR: no existe {args.in_parquet}.", file=sys.stderr) - return 2 - if not args.thesaurus.exists(): - print(f"[06] ERROR: no existe {args.thesaurus}.", file=sys.stderr) - return 2 - - import pyarrow.parquet as pq - papers = pq.read_table(args.in_parquet).to_pylist() - table = load_thesaurus(args.thesaurus) - print(f"[06] Thesaurus: {len(table)} aliases cargados de {args.thesaurus.name}", - file=sys.stderr) - - new_papers, n_total, n_mapped = apply_thesaurus_to_papers(papers, table) - print(f"[06] Keywords: {n_mapped}/{n_total} mapeadas al canónico " - f"({n_mapped / n_total:.0%})", file=sys.stderr) - n_unique_canonical = len({k for p in new_papers for k in p["keywords_id"]}) - print(f"[06] Keywords canónicas únicas: {n_unique_canonical}", file=sys.stderr) - - arrays: dict[str, list[object]] = {} - cols = list(papers[0].keys()) if papers else [] - for c in cols: - arrays[c] = [p.get(c) for p in new_papers] - import pyarrow as pa - new_table = pa.table(arrays) - args.out_parquet.parent.mkdir(parents=True, exist_ok=True) - pq.write_table(new_table, args.out_parquet) - print(f"[06] Corpus actualizado -> {args.out_parquet}", file=sys.stderr) - return 0 - - -if __name__ == "__main__": - raise SystemExit(main()) diff --git a/exploracion/scripts/_schema.py b/exploracion/scripts/_schema.py deleted file mode 100644 index a8337f6..0000000 --- a/exploracion/scripts/_schema.py +++ /dev/null @@ -1,40 +0,0 @@ -"""Schema común de la sandbox de exploración. - -Lo único que exporta este módulo es ``CORPUS_COLUMNS`` y ``new_row()``. Los -scripts de la sandbox lo importan para no divergir en nombres de columnas. - -NO es el schema canónico de ``bib2graph`` (``docs/ARCHITECTURE.md`` §3) — es -una aproximación exploratoria que la sandbox usa para detectar qué necesita -el schema real. Los hallazgos se vuelcan en ``informe_ied.md``. - -Convención de tipos: las listas (autores, keywords, refs) se serializan como -``";"``-separado en CSV y como ``list[str]`` en parquet. El round-trip CSV -<-> parquet se hace explícito en cada script. -""" -from __future__ import annotations - -CORPUS_COLUMNS: list[str] = [ - "id", - "doi", - "title", - "year", - "abstract", - "authors_raw", - "authors_id", - "authors_affiliations", - "keywords_raw", - "keywords_id", - "references_doi", - "source", - "language", - "is_seed", -] - - -def new_row() -> dict[str, object]: - """Devuelve una fila vacía con todas las columnas en None/lista vacía.""" - return {c: (None if c not in _LIST_COLUMNS else []) for c in CORPUS_COLUMNS} - - -_LIST_COLUMNS = {"authors_raw", "authors_id", "authors_affiliations", - "keywords_raw", "keywords_id", "references_doi"} diff --git a/mkdocs.yml b/mkdocs.yml index b5f678a..8283735 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -135,11 +135,19 @@ nav: - Quickstart: getting-started/quickstart.md - Tutoriales: - tutoriales/index.md + - Tu primer mapa (5 min): tutoriales/claude-code.md + - De la pregunta al reporte de SOTA: tutoriales/sota-completo.md - Guías (how-to): - guias/index.md + - Ecuación de búsqueda: guias/ecuacion-busqueda.md + - Forrajeo (expandir el corpus): guias/forrajeo.md + - Curación PRISMA: guias/curacion-prisma.md + - Leer las 5 redes: guias/leer-redes.md + - Del corpus al reporte: guias/reporte.md - Referencia: - API de Python: reference/python-api.md - CLI b2g: reference/cli.md + - Glosario: reference/glosario.md - Contratos detallados: API.md - Explicación: - Arquitectura: ARCHITECTURE.md diff --git a/src/bib2graph/__init__.py b/src/bib2graph/__init__.py index d026060..720608a 100644 --- a/src/bib2graph/__init__.py +++ b/src/bib2graph/__init__.py @@ -104,13 +104,8 @@ "network_metrics", ] -# --------------------------------------------------------------------------- -# Carga perezosa de símbolos que importan duckdb (PEP 562) -# -# ``import bib2graph`` NO arrastra duckdb. Solo ``bib2graph.DuckDBBackend`` -# o ``bib2graph.DuckDBStore`` lo cargan bajo demanda. -# --------------------------------------------------------------------------- - +# Carga perezosa (PEP 562): ``import bib2graph`` NO arrastra duckdb. +# Solo ``bib2graph.DuckDBBackend`` / ``bib2graph.DuckDBStore`` lo cargan bajo demanda. _LAZY = { "DuckDBBackend": ("bib2graph.backends.duckdb", "DuckDBBackend"), "DuckDBStore": ("bib2graph.stores.duckdb", "DuckDBStore"), diff --git a/src/bib2graph/backends/duckdb.py b/src/bib2graph/backends/duckdb.py index 461dea9..561d5ec 100644 --- a/src/bib2graph/backends/duckdb.py +++ b/src/bib2graph/backends/duckdb.py @@ -47,10 +47,6 @@ from bib2graph.cycle import CycleState from bib2graph.schemas import CORPUS_SCHEMA, validate_table -# --------------------------------------------------------------------------- -# Error de bloqueo de archivo (ADR 0019) -# --------------------------------------------------------------------------- - class StoreLockedError(OSError): """El archivo ``.duckdb`` está bloqueado por otro escritor (ADR 0019). @@ -59,9 +55,7 @@ class StoreLockedError(OSError): """ -# --------------------------------------------------------------------------- # SQL DDL -# --------------------------------------------------------------------------- # ADR 0024: ``_seq BIGINT`` es una columna interna (no parte de CORPUS_SCHEMA) # que fija el orden de primera aparición para garantizar D3 sin DELETE+reinsert. @@ -104,10 +98,7 @@ class StoreLockedError(OSError): ) """ -# R3: si la tabla ya existía sin la columna ``round`` (bases creadas antes de R3), -# agregamos la columna en modo migración liviana (pre-1.0, sin datos reales en uso). -# DuckDB no soporta ADD COLUMN con NOT NULL constraint; se agrega como nullable -# con default 0 y se trata como entero en loop_round(). +# DuckDB no soporta ADD COLUMN con NOT NULL; se agrega nullable con DEFAULT 0. _DDL_LOOP_STATE_MIGRATE = """ ALTER TABLE loop_state_log ADD COLUMN round INTEGER DEFAULT 0 """ @@ -140,12 +131,7 @@ class StoreLockedError(OSError): ) """ -# #126 — tabla de pasos de filtro PRISMA para trazabilidad del manifest. -# Cada ejecución de ``b2g filter`` appendea una fila por criterio aplicado. -# ``name``/``criteria``/``count_before``/``count_after`` replican ``FilterStep``. -# ``recorded_at`` usa ``now()`` de DuckDB (patrón loop_state_log). -# No tiene PK UNIQUE: la idempotencia la maneja la capa de servicio que -# decide si re-registrar o actualizar (ver ``persist_filter_steps``). +# No tiene PK UNIQUE: la idempotencia la maneja la capa de servicio (persist_filter_steps). _DDL_FILTER_LOG = """ CREATE TABLE IF NOT EXISTS filter_log ( name VARCHAR NOT NULL, @@ -156,10 +142,6 @@ class StoreLockedError(OSError): ) """ -# #141 — tabla de EnricherRef para trazabilidad del manifest. -# Cada ejecución de enriquecimiento appendea/reemplaza sus refs de enriquecedor. -# ``params_json`` almacena el dict ``params`` de ``EnricherRef`` serializado como JSON. -# ``recorded_at`` usa ``now()`` de DuckDB (mismo patrón que ``filter_log``). _DDL_ENRICHER_LOG = """ CREATE TABLE IF NOT EXISTS enricher_log ( name VARCHAR NOT NULL, @@ -180,15 +162,9 @@ class StoreLockedError(OSError): UPDATE corpus SET _seq = rowid WHERE _seq IS NULL """ -# --------------------------------------------------------------------------- # SQL de UPSERT -# El merge campo a campo (D3) se expresa en SQL: -# - Escalares: COALESCE(excluded.col, corpus.col) -# - Listas: CASE WHEN … list_sort(list_distinct(list_concat(…))) END -# - provenance / curation_status: delegados a UDFs Python # ADR 0024: ``_seq`` se incluye en el INSERT pero NO en el DO UPDATE SET, # de modo que filas existentes conservan su ``_seq`` original (primera aparición). -# --------------------------------------------------------------------------- def _build_upsert_sql() -> str: @@ -215,7 +191,6 @@ def _build_upsert_sql() -> str: f" {c} = COALESCE(excluded.{c}, corpus.{c})" for c in scalar_cols ] - # D3 para listas: unión ordenada deduplicada; NULL si ambos son NULL list_updates = [ f" {c} = CASE\n" f" WHEN corpus.{c} IS NULL AND excluded.{c} IS NULL THEN NULL\n" @@ -227,7 +202,6 @@ def _build_upsert_sql() -> str: for c in list_cols ] - # UDFs para los campos especiales special_updates = [ " curation_status = _merge_curation_status_udf(\n" " corpus.curation_status, corpus.provenance,\n" @@ -242,7 +216,6 @@ def _build_upsert_sql() -> str: # ADR 0024: columnas del INSERT = CORPUS_SCHEMA + _seq (columna interna de orden) schema_cols = ", ".join(f.name for f in CORPUS_SCHEMA) insert_cols = f"{schema_cols}, _seq" - # Un placeholder extra para _seq al final placeholders = ", ".join(f"${i + 1}" for i in range(len(CORPUS_SCHEMA) + 1)) return ( @@ -284,7 +257,6 @@ def _build_bulk_update_existing_sql() -> str: scalar_sets = [f" {c} = COALESCE(src.{c}, corpus.{c})" for c in scalar_cols] - # D3 para listas: unión ordenada deduplicada; NULL si ambos son NULL list_sets = [ f" {c} = CASE\n" f" WHEN corpus.{c} IS NULL AND src.{c} IS NULL THEN NULL\n" @@ -296,7 +268,6 @@ def _build_bulk_update_existing_sql() -> str: for c in list_cols ] - # UDFs para los campos especiales de merge special_sets = [ " curation_status = _merge_curation_status_udf(\n" " corpus.curation_status, corpus.provenance,\n" @@ -367,9 +338,7 @@ def _build_simple_insert_sql() -> str: _BULK_INSERT_NEW_SQL = _build_bulk_insert_new_sql() _SIMPLE_INSERT_SQL = _build_simple_insert_sql() -# --------------------------------------------------------------------------- # Helpers de conversión Python ↔ DuckDB -# --------------------------------------------------------------------------- def _row_to_params(row: dict[str, object]) -> list[object]: @@ -439,11 +408,6 @@ def _dedup_merge_table(table: pa.Table) -> pa.Table: return pa.Table.from_pylist(deduped, schema=CORPUS_SCHEMA) -# --------------------------------------------------------------------------- -# DuckDBBackend -# --------------------------------------------------------------------------- - - class DuckDBBackend: """Backend de biblioteca viva persistida en DuckDB (ADR 0009, 0015). @@ -491,37 +455,26 @@ def __init__( if table is not None: self._upsert_table(table) - # ------------------------------------------------------------------ # Inicialización interna - # ------------------------------------------------------------------ def _setup(self) -> None: """Crea las tablas DDL, aplica migraciones y registra las UDFs Python.""" self._con.execute(_DDL_CORPUS) self._con.execute(_DDL_LOOP_STATE) - # R3: migración liviana — agrega columna round si falta (bases pre-R3). with contextlib.suppress(duckdb.CatalogException): self._con.execute(_DDL_LOOP_STATE_MIGRATE) - # ADR 0024: migración liviana — agrega columna _seq si falta (bases pre-ADR 0024). # CatalogException: columna ya existe. BinderException: variante alternativa DuckDB. with contextlib.suppress(duckdb.CatalogException, duckdb.BinderException): self._con.execute(_DDL_CORPUS_MIGRATE_SEQ) - # Backfill: asigna _seq = rowid a filas legacy sin _seq asignado. # Es inocuo cuando no hay NULLs (WHERE _seq IS NULL no toca nada). self._con.execute(_DDL_CORPUS_BACKFILL_SEQ) - # ADR 0036: migración liviana — renombra openalex_id → source_id si falta. - # Bases pre-ADR 0036 tienen la columna como openalex_id; se renombra. with contextlib.suppress(duckdb.CatalogException, duckdb.BinderException): self._con.execute( "ALTER TABLE corpus RENAME COLUMN openalex_id TO source_id" ) - # #54: tabla auxiliar para IDs backward observados pero no materializados. self._con.execute(_DDL_REFERENCED_BUT_NOT_FETCHED) - # ADR 0036 (opción C): tabla lateral de IDs externos por motor. self._con.execute(_DDL_EXTERNAL_IDS) - # #126: tabla de pasos de filtro PRISMA para trazabilidad del manifest. self._con.execute(_DDL_FILTER_LOG) - # #141: tabla de EnricherRef para trazabilidad del manifest. self._con.execute(_DDL_ENRICHER_LOG) self._register_udfs() @@ -600,23 +553,19 @@ def _upsert_table(self, table: pa.Table) -> None: """ if len(table) == 0: return - # Dedup-MERGE: fusiona ids duplicados en el lote ANTES del upsert SQL table = _dedup_merge_table(table) # ADR 0024: base para el _seq monótono de las filas nuevas en este lote result = self._con.execute( "SELECT COALESCE(MAX(_seq), 0) FROM corpus" ).fetchone() start: int = int(result[0]) if result else 0 - # _row_idx: columna auxiliar de orden para ROW_NUMBER() OVER (ORDER BY _row_idx) table_with_idx = table.append_column( "_row_idx", pa.array(range(len(table)), type=pa.int64()), ) self._con.register("_incoming_upsert", table_with_idx) try: - # Paso 1: actualizar filas existentes (UDFs solo para conflictos reales) self._con.execute(_BULK_UPDATE_EXISTING_SQL) - # Paso 2: insertar filas nuevas (vectorizado, sin UDF) self._con.execute(_BULK_INSERT_NEW_SQL, [start]) finally: self._con.unregister("_incoming_upsert") @@ -639,7 +588,6 @@ def _clone(self) -> DuckDBBackend: new_backend._setup() if len(current_table) > 0: new_backend._upsert_table(current_table) - # Copiar el loop_state_log (incluyendo round — R3) log_rows = self._con.execute( "SELECT state, round, recorded_at FROM loop_state_log ORDER BY recorded_at" ).fetchall() @@ -648,7 +596,6 @@ def _clone(self) -> DuckDBBackend: "INSERT INTO loop_state_log (state, round, recorded_at) VALUES (?, ?, ?)", [state_val, round_val, at_val], ) - # #54: copiar la tabla referenced_but_not_fetched (hermana de loop_state_log) ref_rows = self._con.execute( "SELECT ref_id, cycle_round, observed_at " "FROM referenced_but_not_fetched ORDER BY observed_at" @@ -659,7 +606,6 @@ def _clone(self) -> DuckDBBackend: "(ref_id, cycle_round, observed_at) VALUES (?, ?, ?)", [ref_id_val, cycle_round_val, observed_at_val], ) - # ADR 0036: copiar la tabla lateral external_ids ext_rows = self._con.execute( "SELECT paper_id, engine, id FROM external_ids" ).fetchall() @@ -669,7 +615,6 @@ def _clone(self) -> DuckDBBackend: "VALUES (?, ?, ?)", [paper_id_val, engine_val, id_val], ) - # #126: copiar la tabla de pasos de filtro PRISMA filter_rows = self._con.execute( "SELECT name, criteria, count_before, count_after, recorded_at " "FROM filter_log ORDER BY recorded_at" @@ -681,7 +626,6 @@ def _clone(self) -> DuckDBBackend: "VALUES (?, ?, ?, ?, ?)", [name_val, criteria_val, cb_val, ca_val, at_val], ) - # #141: copiar la tabla de EnricherRef enricher_rows = self._con.execute( "SELECT name, params_json, recorded_at " "FROM enricher_log ORDER BY recorded_at" @@ -694,16 +638,13 @@ def _clone(self) -> DuckDBBackend: ) return new_backend else: - # Para archivo en disco: compartimos la ruta; nueva instancia abre nueva conexión new_backend = DuckDBBackend.__new__(DuckDBBackend) new_backend._path = self._path new_backend._con = duckdb.connect(self._path) new_backend._setup() return new_backend - # ------------------------------------------------------------------ # TabularBackend protocol - # ------------------------------------------------------------------ def to_arrow(self) -> pa.Table: """Exporta el contenido completo como tabla Arrow canónica. @@ -795,8 +736,6 @@ def apply_curation( Returns: Nueva instancia con la curación aplicada. """ - # Leer solo las filas afectadas, aplicar la lógica Python verificada, - # y hacer upsert de vuelta current_table = _arrow_table_from_con(self._con) current_rows = current_table.to_pylist() updated_rows = _apply_curation_to_rows( @@ -804,7 +743,6 @@ def apply_curation( ) new_backend = self._clone() - # Sólo actualizar las filas que cambiaron id_set = set(ids) for row in updated_rows: if str(row.get("id")) in id_set: @@ -876,9 +814,7 @@ def __eq__(self, other: object) -> bool: return False return self.corpus_hash() == other.corpus_hash() - # ------------------------------------------------------------------ # Extensiones propias: CycleState (ADR 0016, R3) - # ------------------------------------------------------------------ def loop_state(self) -> CycleState | None: """Estado actual del lazo de investigación. @@ -938,9 +874,7 @@ def set_loop_state( [state.value, current_round], ) - # ------------------------------------------------------------------ # Extensiones propias: referenced_but_not_fetched (#54) - # ------------------------------------------------------------------ def add_referenced_refs(self, ref_ids: list[str], *, cycle_round: int) -> int: """Appendea IDs backward observados a ``referenced_but_not_fetched``. @@ -994,9 +928,7 @@ def referenced_refs(self) -> list[str]: ).fetchall() return [r[0] for r in rows] - # ------------------------------------------------------------------ # Extensiones propias: external_ids (ADR 0036 opción C) - # ------------------------------------------------------------------ def add_external_id(self, paper_id: str, engine: str, id: str) -> None: """Registra un ID externo para un paper dado un motor. @@ -1046,9 +978,7 @@ def all_external_ids(self) -> list[tuple[str, str, str]]: ).fetchall() return [(r[0], r[1], r[2]) for r in rows] - # ------------------------------------------------------------------ # Extensiones propias: filter_log (#126) - # ------------------------------------------------------------------ def persist_filter_steps( self, @@ -1111,9 +1041,7 @@ def load_filter_steps(self) -> list[dict[str, object]]: for r in rows ] - # ------------------------------------------------------------------ # Extensiones propias: enricher_log (#141) - # ------------------------------------------------------------------ def persist_enricher_refs( self, @@ -1169,10 +1097,6 @@ def load_enricher_refs(self) -> list[dict[str, Any]]: for r in rows ] - # ------------------------------------------------------------------ - # Extensión: query SQL libre - # ------------------------------------------------------------------ - def close(self) -> None: """Cierra la conexión DuckDB subyacente y libera el lock de archivo. @@ -1211,11 +1135,9 @@ def overwrite_corpus(self, table: pa.Table) -> None: self._con.execute("DELETE FROM corpus") if len(table) == 0: return - # Dedup-MERGE: fusiona ids duplicados en el lote ANTES del INSERT masivo table = _dedup_merge_table(table) # Tras DELETE la tabla está vacía: INSERT directo sin filtro NOT IN # (más eficiente que _BULK_INSERT_NEW_SQL para el caso de tabla limpia) - # _row_idx: columna auxiliar de orden para ROW_NUMBER() OVER (ORDER BY _row_idx) table_with_idx = table.append_column( "_row_idx", pa.array(range(len(table)), type=pa.int64()), diff --git a/src/bib2graph/backends/memory.py b/src/bib2graph/backends/memory.py index 378d119..04df27b 100644 --- a/src/bib2graph/backends/memory.py +++ b/src/bib2graph/backends/memory.py @@ -39,17 +39,13 @@ from bib2graph.constants import LIST_COLUMNS, Col, CurationStatus from bib2graph.schemas import CORPUS_SCHEMA, ProvenanceEvent -# --------------------------------------------------------------------------- # Re-exportar LIST_COLUMNS con el alias histórico (_LIST_COLS) para que # backends/duckdb.py y cualquier otro importador de la constante antigua # no rompa en la transición (se puede retirar en R2). -# --------------------------------------------------------------------------- _LIST_COLS: frozenset[str] = LIST_COLUMNS -# --------------------------------------------------------------------------- # Constantes internas (D3) -# --------------------------------------------------------------------------- _CURATION_PRIORITY: dict[str, int] = { CurationStatus.ACCEPTED: 2, @@ -57,9 +53,7 @@ CurationStatus.CANDIDATE: 0, } -# --------------------------------------------------------------------------- # Helpers internos — lógica pura movida desde corpus.py -# --------------------------------------------------------------------------- def compute_corpus_hash(table: pa.Table) -> str: @@ -342,9 +336,7 @@ def _apply_curation_to_rows( return updated -# --------------------------------------------------------------------------- # InMemoryBackend -# --------------------------------------------------------------------------- class InMemoryBackend: @@ -536,9 +528,7 @@ def __eq__(self, other: object) -> bool: return False return self.corpus_hash() == other.corpus_hash() - # ------------------------------------------------------------------ # Extensiones: referenced_but_not_fetched (#54) - # ------------------------------------------------------------------ def add_referenced_refs(self, ref_ids: list[str], *, cycle_round: int) -> int: """Appendea IDs backward observados a la tabla auxiliar en memoria. @@ -575,9 +565,7 @@ def referenced_refs(self) -> list[str]: """ return list(self._referenced_refs) - # ------------------------------------------------------------------ # Extensiones: external_ids (ADR 0036 opción C) - # ------------------------------------------------------------------ def add_external_id(self, paper_id: str, engine: str, id: str) -> None: """Registra un ID externo para un paper dado un motor. diff --git a/src/bib2graph/cli/__init__.py b/src/bib2graph/cli/__init__.py index 3c6ea98..3f4c323 100644 --- a/src/bib2graph/cli/__init__.py +++ b/src/bib2graph/cli/__init__.py @@ -7,12 +7,18 @@ b2g = "bib2graph.cli:main" bib2graph = "bib2graph.cli:main_bib2graph_alias" # deprecado, #165 -Subcomandos planos (17): - init, seed, chain, filter, build, enrich, monitor, export, - status, validate, accept, reject, networks, restore (shim #163), - resolve. - - inspect: absorbido por ``read show`` (#156); permanece como alias. +Superficie (ADR 0037/0038/0040): 10 verbos del ciclo + ``skill`` (meta) + +9 aliases deprecados. En total se registran 16 subcomandos planos + 4 grupos. + +Verbos del ciclo (10) — planos: init, seed, chain, build, export, status, + validate; grupos (abajo): read, curate, snapshot. +Meta (1): skill — distribución de la skill de Claude Code (ADR 0039), fuera + de los 10 del ciclo. +Aliases deprecados (9) — la ventana de retrocompat cierra en 0.11.0 (ADR 0037/0038): + accept→curate accept, reject→curate reject, filter→curate filter, + enrich→chain/build, inspect→read show (#156), monitor→chain --since, + networks→build --spec, resolve→seed --resolve, restore→snapshot restore. + (``gui`` fue RETIRADO de la librería por el ADR 0040; ya no se registra.) Grupos noun-verb (4): read [list|stats|show|top] — lecturas read-only del corpus (#156/#157). @@ -115,12 +121,11 @@ def b2g(ctx: click.Context, workspace: str | None) -> None: Si no hay ninguno, los comandos que necesitan la biblioteca emiten un error accionable (exit 1) que sugiere 'b2g init' o '--workspace'. - Subcomandos: init, seed, chain, filter, build, enrich, monitor, export, - status, validate, accept, reject, networks, restore (shim), - resolve, - read [list|stats|show|top], curate [dump|apply|accept|reject|filter], - snapshot [create|restore] (ADR 0038), - skill [add] (Epic #188). + Verbos del ciclo (ADR 0037): init, seed, chain, build, export, status, + validate, read [list|stats|show|top], curate [dump|apply|accept|reject|filter], + snapshot [create|restore]. Meta: skill [add] (Epic #188). + Aliases deprecados (cierran en 0.11.0, ADR 0038): accept, reject, filter, + enrich, monitor, inspect, networks, resolve, restore. Ejemplo: b2g init mi-investigacion @@ -132,8 +137,6 @@ def b2g(ctx: click.Context, workspace: str | None) -> None: ctx.obj["workspace"] = workspace -# Registrar subcomandos planos + grupos noun-verb read (#156), curate (#155), -# snapshot (#163, ADR 0038), skill (Epic #188) b2g.add_command(init_cmd) b2g.add_command(seed_cmd) b2g.add_command(chain_cmd) diff --git a/src/bib2graph/cli/_errors.py b/src/bib2graph/cli/_errors.py index 2a5c36e..635d957 100644 --- a/src/bib2graph/cli/_errors.py +++ b/src/bib2graph/cli/_errors.py @@ -64,11 +64,6 @@ F = TypeVar("F", bound=Callable[..., Any]) -# --------------------------------------------------------------------------- -# Decorador de captura -# --------------------------------------------------------------------------- - - # Importación perezosa del envelope para evitar importación circular def _emit_error_envelope( command: str, @@ -122,7 +117,6 @@ def handle_errors(command: str) -> Callable[[F], F]: def decorator(func: F) -> F: @wraps(func) def wrapper(*args: Any, **kwargs: Any) -> Any: - # Determinar modo JSON desde el flag local (json_output) o env var B2G_JSON. _local_flag = bool(kwargs.get("json_output", False)) json_mode: bool = _resolve_json_mode(_local_flag) @@ -134,8 +128,6 @@ def wrapper(*args: Any, **kwargs: Any) -> Any: ) sys.exit(exc.exit_code) except OSError as exc: - # Captura OSError y su subclase StoreLockedError (exit 5). - # R5: rama muerta eliminada — el if/else previo hacía lo mismo. _emit_error_envelope(command, 5, "STORE_ERROR", str(exc), json_mode) sys.exit(5) except ImportError as exc: @@ -146,8 +138,6 @@ def wrapper(*args: Any, **kwargs: Any) -> Any: _emit_error_envelope(command, 3, "DEPENDENCY_ERROR", msg, json_mode) sys.exit(3) except httpx.HTTPError as exc: - # Captura por tipo: HTTPStatusError, ConnectError, TimeoutException, - # RemoteProtocolError, TransportError y toda la jerarquía httpx. msg = ( f"Error de red ({type(exc).__name__}): {exc}. " "Verificá tu conexión a internet y reintentá." diff --git a/src/bib2graph/cli/_ingest.py b/src/bib2graph/cli/_ingest.py index 3886aca..d1434c6 100644 --- a/src/bib2graph/cli/_ingest.py +++ b/src/bib2graph/cli/_ingest.py @@ -1,14 +1,14 @@ -"""cli._ingest — Helper de ingesta automática: normalize + dedup. +"""cli._ingest — Re-exportación de la pipeline de ingesta automática. -Aplica la pipeline de preprocesamiento automático al corpus completo en el -momento de la ingesta (seed / seed_from_bib / restore / chain), sobre el -corpus YA MERGEADO con el existente. El thesaurus queda como paso explícito -(``b2g build --thesaurus``). +La implementación canónica vive en ``preprocessors.pipeline`` (issue #175). +Este módulo la re-exporta para que los imports existentes del CLI y de los +tests — ``from bib2graph.cli._ingest import normalize_and_dedup`` — sigan +funcionando sin cambios. -Orden determinista: +Orden determinista de la pipeline: 1. ``Preprocessor().normalize`` — canonicaliza ``authors_id`` y ``language``. - 2. ``deduplicate_authors(threshold=0.92)`` — colapsa variantes de autores. - 3. ``deduplicate_keywords(threshold=0.90)`` — colapsa variantes de keywords. + 2. ``deduplicate_authors(threshold=THRESHOLD_AUTHORS)`` — colapsa variantes. + 3. ``deduplicate_keywords(threshold=THRESHOLD_KEYWORDS)`` — colapsa variantes. El dedup opera sobre el corpus COMPLETO (existing + incoming ya mergeados), garantizando deduplicación cross-biblioteca (no solo intra-lote). @@ -21,51 +21,7 @@ from __future__ import annotations -from datetime import UTC, datetime +# Re-exportar desde el módulo neutral para backward compat con imports existentes. +from bib2graph.preprocessors.pipeline import normalize_and_dedup -from bib2graph.corpus import Corpus -from bib2graph.preprocessors.dedup import deduplicate_authors, deduplicate_keywords -from bib2graph.preprocessors.preprocessor import Preprocessor - -# Umbrales fijos del auto-preproc (ADR 0031). -_THRESHOLD_AUTHORS: float = 0.92 -_THRESHOLD_KEYWORDS: float = 0.90 - - -def normalize_and_dedup( - corpus: Corpus, - *, - applied_at: datetime | None = None, -) -> Corpus: - """Aplica normalize + dedup_authors + dedup_keywords al corpus. - - Punto de entrada único para la ingesta automática. Se llama DESPUÉS de - ``Corpus.merge`` (corpus ya completo = existing + incoming), garantizando - deduplicación cross-biblioteca: el dedup ve toda la biblioteca acumulada, - no solo el lote entrante. - - Idempotente en contenido: re-correr sobre el mismo corpus produce el - mismo resultado (las tres operaciones son idempotentes). - - El thesaurus NO se aplica aquí; es un paso explícito del usuario - (``b2g build --thesaurus``). - - Args: - corpus: Corpus de entrada (no muta; semántica de valor). - Debe ser el corpus COMPLETO ya mergeado (existing + incoming). - applied_at: Timestamp de la operación para el ``PreprocRef``. La - frontera CLI inyecta un único ``datetime.now(UTC)`` por - invocación (R2). Si ``None``, se usa ``datetime.now(UTC)`` - (para uso como librería independiente). - - Returns: - Nuevo Corpus normalizado y deduplicado. - """ - ts = applied_at if applied_at is not None else datetime.now(UTC) - preprocessor = Preprocessor() - - result = preprocessor.normalize(corpus, applied_at=ts) - result = deduplicate_authors(result, threshold=_THRESHOLD_AUTHORS) - result = deduplicate_keywords(result, threshold=_THRESHOLD_KEYWORDS) - - return result +__all__ = ["normalize_and_dedup"] diff --git a/src/bib2graph/cli/_options.py b/src/bib2graph/cli/_options.py index 78897ee..cd1af86 100644 --- a/src/bib2graph/cli/_options.py +++ b/src/bib2graph/cli/_options.py @@ -29,10 +29,6 @@ F = TypeVar("F", bound=Callable[..., Any]) -# --------------------------------------------------------------------------- -# Helpers de modo JSON -# --------------------------------------------------------------------------- - def _env_truthy(name: str) -> bool: """Devuelve True si la variable de entorno ``name`` está seteada y es truthy. @@ -95,10 +91,6 @@ def json_option(func: F) -> F: )(func) -# --------------------------------------------------------------------------- -# Helper de --since -# --------------------------------------------------------------------------- - _RELATIVE_RE = re.compile(r"^(\d+)(d|m|y)$", re.IGNORECASE) _DAYS_PER_UNIT: dict[str, int] = { @@ -135,13 +127,11 @@ def parse_since(value: str, *, now: date | None = None) -> date: value = value.strip() - # Intento ISO primero try: return date.fromisoformat(value) except ValueError: pass - # Intento relativo m = _RELATIVE_RE.match(value) if m: n = int(m.group(1)) diff --git a/src/bib2graph/cli/_store.py b/src/bib2graph/cli/_store.py index 0133d6c..451690d 100644 --- a/src/bib2graph/cli/_store.py +++ b/src/bib2graph/cli/_store.py @@ -14,6 +14,11 @@ para no crear silenciosamente un store vacío ante un typo en la ruta (Nota 06, catálogo de secundarios). ``open_store`` (escritura) mantiene el comportamiento de crear el archivo si no existe. + +Fuente única (issue #175): + ``open_store`` se re-exporta desde ``service.store`` para que la capa de + servicios y el CLI usen la misma implementación sin violar el layering + (ADR 0028). """ from __future__ import annotations @@ -23,6 +28,11 @@ from bib2graph.cli._errors import StoreError, UsageError +# Re-exportar open_store desde la capa neutral (service.store) para: +# 1. Mantener backward compat con todos los imports de ``cli._store.open_store``. +# 2. Garantizar fuente única con ``service.snapshot`` (issue #175). +from bib2graph.service.store import open_store as open_store + def resolve_library_path(ctx_obj: dict[str, Any]) -> Path: """Resuelve la ruta al archivo .duckdb desde el contexto Click (ADR 0029). @@ -81,39 +91,6 @@ def resolve_workspace(ctx_obj: dict[str, Any]) -> Any: raise UsageError(str(exc)) from exc -def open_store(path: str | Path) -> Any: - """Abre (o crea) el DuckDBStore en ``path``. - - Captura ``StoreLockedError`` (subclase de ``OSError``) y lo re-lanza - como ``StoreError`` (exit 5) para el decorador ``@handle_errors``. - - Uso: comandos de ESCRITURA (seed, chain, filter, build, accept, reject, - snapshot, export). Los comandos de SOLO LECTURA deben usar - ``open_store_readonly`` para no auto-crear el store ante un typo. - - Args: - path: Ruta al archivo ``.duckdb``. - - Returns: - ``DuckDBStore`` abierto y listo para usar. - - Raises: - StoreError: Si el archivo está bloqueado o no se puede abrir. - """ - from bib2graph.backends.duckdb import StoreLockedError - from bib2graph.stores.duckdb import DuckDBStore - - try: - return DuckDBStore(path) - except StoreLockedError as exc: - raise StoreError(str(exc)) from exc - except OSError as exc: - raise StoreError( - f"No se puede abrir el store '{path}': {exc}. " - "Verificá que el archivo no esté bloqueado por otro proceso." - ) from exc - - def open_store_readonly(path: str | Path) -> Any: """Abre el DuckDBStore en ``path`` para SOLO LECTURA. diff --git a/src/bib2graph/cli/commands/accept.py b/src/bib2graph/cli/commands/accept.py index f8ed674..54000e8 100644 --- a/src/bib2graph/cli/commands/accept.py +++ b/src/bib2graph/cli/commands/accept.py @@ -28,10 +28,6 @@ from bib2graph.cli._options import json_mode, json_option from bib2graph.cli._store import resolve_library_path -# --------------------------------------------------------------------------- -# Función núcleo (testeable, sin Click) — shim que inyecta now y delega -# --------------------------------------------------------------------------- - def run_accept( store_path: str | Path, @@ -62,11 +58,6 @@ def run_accept( return accept_papers(store_path, ids, by=by, decided_at=now) -# --------------------------------------------------------------------------- -# Comando Click -# --------------------------------------------------------------------------- - - @click.command("accept") @click.option( "--ids", diff --git a/src/bib2graph/cli/commands/build.py b/src/bib2graph/cli/commands/build.py index ee4f81a..7f7c964 100644 --- a/src/bib2graph/cli/commands/build.py +++ b/src/bib2graph/cli/commands/build.py @@ -55,11 +55,6 @@ from bib2graph.networks.spec import NetworkArtifact -# --------------------------------------------------------------------------- -# Helper: mapeo del vocabulario CLI de --scope al vocabulario interno de corpus.scoped() -# --------------------------------------------------------------------------- - - def _map_scope(scope: str) -> str: """Mapea el vocab de ``--scope`` (CLI) al vocab interno de ``corpus.scoped()``. @@ -77,11 +72,7 @@ def _map_scope(scope: str) -> str: return scope -# --------------------------------------------------------------------------- # Helper compartido: carga de specs YAML + construcción de artefactos -# --------------------------------------------------------------------------- - - def _build_from_spec_file( corpus: Corpus, spec_path: str | Path, @@ -120,11 +111,7 @@ def _build_from_spec_file( ) from exc -# --------------------------------------------------------------------------- # Helper compartido: escritura de artefactos por red -# --------------------------------------------------------------------------- - - def _write_artifacts( artifacts: list[NetworkArtifact], corpus: Corpus, @@ -156,14 +143,11 @@ def _write_artifacts( kind_dir = artifacts_dir / kind kind_dir.mkdir(parents=True, exist_ok=True) - # Exportar GraphML: fusionar métricas + comunidades como atributo de nodo. - # art.communities es un dict {nodo: int} o None si no se calcularon. node_attrs: dict[str, object] = {**art.metrics} if art.communities: node_attrs["community"] = art.communities exporter.export(art.graph, node_attrs, kind_dir) - # Escribir metrics.json metrics_path = kind_dir / "metrics.json" # Serializar métricas (pueden tener tipos no-JSON como nx.Graph) safe_metrics = { @@ -189,7 +173,6 @@ def _write_artifacts( encoding="utf-8", ) - # Escribir clusters.csv para redes de paper con comunidades (issue #31). # cluster_table devuelve [] si el kind no es de paper o no hay comunidades. clusters_path: str | None = None clusters = cluster_table(corpus.to_arrow(), art) @@ -213,7 +196,6 @@ def _write_artifacts( ) _writer.writeheader() for _row in clusters: - # Serializar listas como cadena separada por "|" _writer.writerow( { **_row, @@ -238,11 +220,7 @@ def _write_artifacts( return networks_info -# --------------------------------------------------------------------------- # Helper: aplicar thesaurus al corpus y persistir (ADR 0011, #164) -# --------------------------------------------------------------------------- - - def _apply_thesaurus_and_persist( corpus: Corpus, thesaurus_path: str | Path, @@ -305,11 +283,7 @@ def _apply_thesaurus_and_persist( return updated, stats -# --------------------------------------------------------------------------- # Función núcleo (testeable, sin Click) -# --------------------------------------------------------------------------- - - def run_build( store_path: str | Path, *, @@ -432,7 +406,6 @@ def run_build( # clusters.csv cuadre con los nodos del grafo (sin drift). corpus = corpus_full.scoped(corpus_scope) - # Caso de 0 nodos: no es error, pero sí merece un warning accionable. build_warnings: list[str] = [] if len(corpus) == 0: msg = ( @@ -444,11 +417,9 @@ def run_build( artifacts_dir.mkdir(parents=True, exist_ok=True) (artifacts_dir / ".corpus_hash").write_text("", encoding="utf-8") store.backend.set_loop_state(new_state, cycle_round=new_round) - # scope_display para early-return (corpus vacío): mismo cálculo que el path normal. _scope_display_empty = ( scope_cli_token if scope_cli_token is not None else corpus_scope ) - # Maturity en early-return: curated desde corpus_full (el filtrado está vacío). from bib2graph.service.maturity import compute_maturity as _compute_maturity _maturity_empty = _compute_maturity( @@ -471,16 +442,11 @@ def run_build( } # Diagnóstico pre-build (ADR 0037 §(e), fuente única con status-time). - # Indexado por kind para lookup O(1) en el loop post-build. preview_by_kind = {str(e["kind"]): e for e in predict_build_preview(corpus)} - # Construir artefactos según el modo. if spec_path is not None: - # Modo declarativo: YAML → specs → Networks.build por red. - # _build_from_spec_file levanta DataError / DependencyError. artifacts = _build_from_spec_file(corpus, spec_path) else: - # Modo quick: Networks.quick con min_weight propagado a cada spec. try: artifacts = Networks.quick(corpus, min_weight=min_weight) except ImportError as exc: @@ -491,9 +457,7 @@ def run_build( networks_info = _write_artifacts(artifacts, corpus, artifacts_dir) - # Diagnóstico de redes vacías en build-time. # Reusa los reason/fix_command del preview (fuente única — ADR 0037 §(e)). - # Si el preview predijo no-vacía pero salió vacía, sospechamos min_weight. empty_networks: list[dict[str, object]] = [] for art in artifacts: kind_str = str(art.spec.kind) @@ -517,11 +481,9 @@ def run_build( else None ) elif spec_path is None and min_weight > 1: - # Modo quick: el --min-weight del CLI filtró todas las aristas. reason = f"0 aristas con peso ≥ {min_weight}; bajá --min-weight" fix_cmd = f"b2g build --min-weight {min_weight - 1}" elif spec_path is not None and art.spec.min_weight > 1: - # Modo spec: el min_weight del propio YAML filtró todas las aristas. # El --min-weight de la CLI NO se usa en modo spec → no sugerir bajarlo. reason = ( f"0 aristas con peso ≥ {art.spec.min_weight} " @@ -529,7 +491,6 @@ def run_build( ) fix_cmd = None else: - # Caso inesperado: red vacía sin causa clara identificable. reason = "Red vacía (sin datos suficientes)" fix_cmd = None @@ -588,11 +549,7 @@ def run_build( } -# --------------------------------------------------------------------------- # Comando Click -# --------------------------------------------------------------------------- - - @click.command("build") @click.option( "--out-dir", @@ -705,7 +662,6 @@ def build_cmd( if effective_out_dir is None: effective_out_dir = ws.networks_dir - # Resolver scope: --corpus-scope deprecado tiene prioridad con aviso. corpus_scope_dep_msg: str | None = None if corpus_scope_deprecated is not None: corpus_scope_dep_msg = emit_deprecation( @@ -716,9 +672,7 @@ def build_cmd( internal_scope = corpus_scope_deprecated cli_token: str = corpus_scope_deprecated else: - # El vocab nuevo (all|accepted|seeds) necesita mapeo para seeds→seeds_only. internal_scope = _map_scope(scope) - # scope es el token tal como lo tipió el usuario ("seeds"/"accepted"/"all"). cli_token = scope # FIX 1a — footgun: --min-weight se ignora en modo spec. @@ -742,7 +696,6 @@ def build_cmd( ) if json_mode(json_output): - # Fusionar warnings de corpus con el aviso de deprecación de --corpus-scope. all_warnings: list[str] = list(data.get("warnings") or []) if corpus_scope_dep_msg is not None: all_warnings.append(corpus_scope_dep_msg) @@ -758,7 +711,6 @@ def build_cmd( # Warnings van a stderr en modo humano (ADR 0021 §C; patrón de status.py). for w in data.get("warnings", []): print(f"ADVERTENCIA: {w}", file=sys.stderr) - # Diagnósticos de redes vacías también a stderr (no son warnings de corpus). for en in data.get("empty_networks", []): fix = f" Sugerencia: {en['fix_command']}" if en.get("fix_command") else "" print( diff --git a/src/bib2graph/cli/commands/chain.py b/src/bib2graph/cli/commands/chain.py index bbe04e8..a3ceb89 100644 --- a/src/bib2graph/cli/commands/chain.py +++ b/src/bib2graph/cli/commands/chain.py @@ -19,11 +19,8 @@ from bib2graph.cli._options import json_mode, json_option from bib2graph.cli._store import open_store, resolve_library_path -# --------------------------------------------------------------------------- -# Función núcleo (testeable, sin Click) -# --------------------------------------------------------------------------- - +# Función núcleo (testeable, sin Click) def run_chain( store_path: str | Path, *, @@ -76,7 +73,6 @@ def run_chain( max_candidates=max_candidates, ) - # Validación de --since: backward + since no tiene sentido. if since is not None and direction == "backward": raise UsageError( "--since no es compatible con --direction backward. " @@ -195,8 +191,6 @@ def run_chain( store.backend.persist_enricher_refs(merged_deduped.manifest.enrichers) # #54: persistir IDs backward observados en la tabla auxiliar. - # El backend del store (DuckDBBackend) ya tiene add_referenced_refs; - # el InMemoryBackend lo implementa también para tests. if ranked.observed_refs: store.backend.add_referenced_refs( ranked.observed_refs, cycle_round=new_round @@ -249,9 +243,6 @@ def _run_chain_preview( """ from bib2graph.foraging import Forager - # Para preview backward/both, el source nunca se usa (cero red). - # Para preview forward con cited_by_id, tampoco. - # Usamos None como source (el Forager solo llama al source en chain(), no en preview()). store = open_store(store_path) try: corpus = store.load() @@ -272,7 +263,6 @@ def _run_chain_preview( finally: store.close() - # Mensaje accionable cuando el forward no es estimable localmente. warnings: list[str] = [] if growth.forward_requires_fetch: warnings.append( @@ -294,11 +284,7 @@ def _run_chain_preview( } -# --------------------------------------------------------------------------- # Comando Click -# --------------------------------------------------------------------------- - - @click.command("chain") @click.option( "--direction", diff --git a/src/bib2graph/cli/commands/curate.py b/src/bib2graph/cli/commands/curate.py index 566e9e6..cdeb5bf 100644 --- a/src/bib2graph/cli/commands/curate.py +++ b/src/bib2graph/cli/commands/curate.py @@ -75,11 +75,7 @@ ] -# --------------------------------------------------------------------------- # Grupo raíz -# --------------------------------------------------------------------------- - - @click.group("curate", invoke_without_command=True) @click.pass_context def curate_grp(ctx: click.Context) -> None: @@ -102,11 +98,7 @@ def curate_grp(ctx: click.Context) -> None: click.echo(ctx.get_help()) -# --------------------------------------------------------------------------- # curate dump -# --------------------------------------------------------------------------- - - @curate_grp.command("dump") @click.option( "--out", @@ -170,11 +162,7 @@ def dump_cmd( emit_human(f"Exportados {data['papers_exported']} papers a: {data['csv_path']}") -# --------------------------------------------------------------------------- # curate apply -# --------------------------------------------------------------------------- - - @curate_grp.command("apply") @click.argument("csv_file", type=click.Path()) @click.option( @@ -233,11 +221,7 @@ def apply_cmd( ) -# --------------------------------------------------------------------------- # curate accept -# --------------------------------------------------------------------------- - - @curate_grp.command("accept") @click.option( "--ids", @@ -283,11 +267,7 @@ def curate_accept_cmd( emit_human(f"Aceptados {data['accepted_count']} papers.") -# --------------------------------------------------------------------------- # curate reject -# --------------------------------------------------------------------------- - - @curate_grp.command("reject") @click.option( "--ids", @@ -333,11 +313,7 @@ def curate_reject_cmd( emit_human(f"Rechazados {data['rejected_count']} papers.") -# --------------------------------------------------------------------------- # curate filter -# --------------------------------------------------------------------------- - - @curate_grp.command("filter") @click.option("--year-gte", type=int, default=None, help="Incluir años >= este valor.") @click.option("--year-lte", type=int, default=None, help="Incluir años <= este valor.") @@ -410,8 +386,5 @@ def curate_filter_cmd( emit_human(f"Total en corpus: {data['total_papers']}") -# --------------------------------------------------------------------------- # Alias curate_cmd → curate_grp (compat con registros existentes) -# --------------------------------------------------------------------------- - curate_cmd = curate_grp diff --git a/src/bib2graph/cli/commands/enrich.py b/src/bib2graph/cli/commands/enrich.py index 77fec7f..29e5577 100644 --- a/src/bib2graph/cli/commands/enrich.py +++ b/src/bib2graph/cli/commands/enrich.py @@ -28,10 +28,6 @@ from bib2graph.cli._options import json_mode, json_option from bib2graph.cli._store import open_store, resolve_library_path -# --------------------------------------------------------------------------- -# Función núcleo (testeable, sin Click) -# --------------------------------------------------------------------------- - def run_enrich( store_path: str | Path, @@ -96,11 +92,6 @@ def run_enrich( } -# --------------------------------------------------------------------------- -# Comando Click -# --------------------------------------------------------------------------- - - @click.command("enrich") @click.option( "--email", diff --git a/src/bib2graph/cli/commands/export.py b/src/bib2graph/cli/commands/export.py index d814aee..f5f570c 100644 --- a/src/bib2graph/cli/commands/export.py +++ b/src/bib2graph/cli/commands/export.py @@ -22,10 +22,6 @@ from bib2graph.cli._options import json_mode, json_option from bib2graph.cli._store import resolve_workspace -# --------------------------------------------------------------------------- -# Función núcleo (testeable, sin Click) -# --------------------------------------------------------------------------- - def run_export( store_path: str | Path, @@ -70,7 +66,6 @@ def run_export( "Ejecutá primero ``b2g build``." ) - # Buscar subdirectorios de redes kind_dirs = [d for d in nets_dir.iterdir() if d.is_dir()] if not kind_dirs: raise DataError( @@ -123,11 +118,6 @@ def run_export( } -# --------------------------------------------------------------------------- -# Comando Click -# --------------------------------------------------------------------------- - - @click.command("export") @click.option( "--format", diff --git a/src/bib2graph/cli/commands/filter.py b/src/bib2graph/cli/commands/filter.py index a76999b..816d814 100644 --- a/src/bib2graph/cli/commands/filter.py +++ b/src/bib2graph/cli/commands/filter.py @@ -27,10 +27,6 @@ from bib2graph.cli._options import json_mode, json_option from bib2graph.cli._store import resolve_library_path -# --------------------------------------------------------------------------- -# Función núcleo (testeable, sin Click) — shim que delega en service.curate -# --------------------------------------------------------------------------- - def run_filter( store_path: str | Path, @@ -80,11 +76,6 @@ def run_filter( ) -# --------------------------------------------------------------------------- -# Comando Click -# --------------------------------------------------------------------------- - - @click.command("filter") @click.option("--year-gte", type=int, default=None, help="Incluir años >= este valor.") @click.option("--year-lte", type=int, default=None, help="Incluir años <= este valor.") diff --git a/src/bib2graph/cli/commands/init.py b/src/bib2graph/cli/commands/init.py index 56d7f0a..88ea3dc 100644 --- a/src/bib2graph/cli/commands/init.py +++ b/src/bib2graph/cli/commands/init.py @@ -27,10 +27,6 @@ from bib2graph.cli._errors import UsageError, handle_errors from bib2graph.cli._options import json_mode, json_option -# --------------------------------------------------------------------------- -# Función núcleo (testeable, sin Click) -# --------------------------------------------------------------------------- - def run_init(path: Path, name: str) -> dict[str, Any]: """Crea un workspace nuevo en ``path`` con el nombre ``name``. @@ -62,11 +58,6 @@ def run_init(path: Path, name: str) -> dict[str, Any]: } -# --------------------------------------------------------------------------- -# Comando Click -# --------------------------------------------------------------------------- - - @click.command("init") @click.argument("target", default=".") @click.option( @@ -98,12 +89,9 @@ def init_cmd( """ target_path = Path(target) - # Si el target es un nombre simple (no una ruta que ya existe ni "."), - # se crea como subdirectorio del cwd. if not target_path.is_absolute() and not target_path.exists() and target != ".": target_path = Path.cwd() / target_path - # Nombre de la investigación: --name explícito o nombre del directorio resolved_name = name if name else target_path.resolve().name data = run_init(target_path, resolved_name) diff --git a/src/bib2graph/cli/commands/inspect.py b/src/bib2graph/cli/commands/inspect.py index a29a570..4a4b290 100644 --- a/src/bib2graph/cli/commands/inspect.py +++ b/src/bib2graph/cli/commands/inspect.py @@ -22,10 +22,6 @@ from bib2graph.cli._store import open_store, resolve_library_path from bib2graph.constants import Col -# --------------------------------------------------------------------------- -# Función núcleo (testeable, sin Click) -# --------------------------------------------------------------------------- - def run_inspect( store_path: str | Path, @@ -53,7 +49,6 @@ def run_inspect( corpus = store.load() if paper_id is not None: - # Buscar el paper table = corpus.to_arrow() rows = table.to_pylist() matching = [r for r in rows if str(r.get(Col.ID)) == paper_id] @@ -80,7 +75,6 @@ def run_inspect( "provenance": provenance, } - # Inspección del manifest manifest = corpus.manifest equations = [ { @@ -112,11 +106,6 @@ def run_inspect( } -# --------------------------------------------------------------------------- -# Comando Click -# --------------------------------------------------------------------------- - - @click.command("inspect") @click.option( "--id", @@ -137,7 +126,6 @@ def inspect_cmd( Sin --id: muestra el manifest y conteos. Con --id: muestra datos + provenance de ese paper. """ - # Forma canónica depende de si se pasa --id o no. new_cmd = "b2g read show" if paper_id else "b2g status" dep_msg = emit_deprecation("b2g inspect", new_cmd) store_path = resolve_library_path(ctx.obj) diff --git a/src/bib2graph/cli/commands/monitor.py b/src/bib2graph/cli/commands/monitor.py index 2256737..b234146 100644 --- a/src/bib2graph/cli/commands/monitor.py +++ b/src/bib2graph/cli/commands/monitor.py @@ -29,10 +29,6 @@ from bib2graph.cli._options import json_mode, json_option from bib2graph.cli._store import resolve_library_path -# --------------------------------------------------------------------------- -# Función núcleo (testeable, sin Click) -# --------------------------------------------------------------------------- - def run_monitor( store_path: str | Path, @@ -76,11 +72,6 @@ def run_monitor( } -# --------------------------------------------------------------------------- -# Comando Click -# --------------------------------------------------------------------------- - - @click.command("monitor") @click.option( "--email", diff --git a/src/bib2graph/cli/commands/networks.py b/src/bib2graph/cli/commands/networks.py index a1c51d0..6e8b0f8 100644 --- a/src/bib2graph/cli/commands/networks.py +++ b/src/bib2graph/cli/commands/networks.py @@ -42,10 +42,6 @@ from bib2graph.cli._store import open_store, resolve_workspace from bib2graph.cli.commands.build import _build_from_spec_file, _write_artifacts -# --------------------------------------------------------------------------- -# Función núcleo (testeable, sin Click) -# --------------------------------------------------------------------------- - def run_networks( store_path: str | Path, @@ -86,8 +82,6 @@ def run_networks( else: artifacts_dir = Path(out_dir) - # Delegar carga YAML + proyección al helper compartido con build --spec. - # Levanta DataError (YAML inválido) o DependencyError (louvain faltante). artifacts = _build_from_spec_file(corpus, spec_path) networks_info = _write_artifacts(artifacts, corpus, artifacts_dir) @@ -99,11 +93,6 @@ def run_networks( } -# --------------------------------------------------------------------------- -# Comando Click -# --------------------------------------------------------------------------- - - @click.command("networks") @click.option( "--spec", diff --git a/src/bib2graph/cli/commands/read.py b/src/bib2graph/cli/commands/read.py index 693db53..ab99f48 100644 --- a/src/bib2graph/cli/commands/read.py +++ b/src/bib2graph/cli/commands/read.py @@ -41,9 +41,7 @@ from bib2graph.cli._store import resolve_workspace from bib2graph.constants import NetworkKind -# --------------------------------------------------------------------------- # Grupo raíz -# --------------------------------------------------------------------------- @click.group("read", invoke_without_command=True) @@ -69,9 +67,7 @@ def read_grp(ctx: click.Context) -> None: click.echo(ctx.get_help()) -# --------------------------------------------------------------------------- # read list -# --------------------------------------------------------------------------- @read_grp.command("list") @@ -157,9 +153,7 @@ def list_cmd( ) -# --------------------------------------------------------------------------- # read stats -# --------------------------------------------------------------------------- @read_grp.command("stats") @@ -203,9 +197,7 @@ def stats_cmd( emit_human(f" {group['key']}: {group['count']}") -# --------------------------------------------------------------------------- # read show -# --------------------------------------------------------------------------- @read_grp.command("show") @@ -260,9 +252,7 @@ def show_cmd( ) -# --------------------------------------------------------------------------- # read top -# --------------------------------------------------------------------------- _NETWORK_KIND_CHOICES: list[str] = [nk.value for nk in NetworkKind] diff --git a/src/bib2graph/cli/commands/reject.py b/src/bib2graph/cli/commands/reject.py index 6aa84ed..aad4d02 100644 --- a/src/bib2graph/cli/commands/reject.py +++ b/src/bib2graph/cli/commands/reject.py @@ -28,10 +28,6 @@ from bib2graph.cli._options import json_mode, json_option from bib2graph.cli._store import resolve_library_path -# --------------------------------------------------------------------------- -# Función núcleo (testeable, sin Click) — shim que inyecta now y delega -# --------------------------------------------------------------------------- - def run_reject( store_path: str | Path, @@ -62,11 +58,6 @@ def run_reject( return reject_papers(store_path, ids, by=by, decided_at=now) -# --------------------------------------------------------------------------- -# Comando Click -# --------------------------------------------------------------------------- - - @click.command("reject") @click.option( "--ids", diff --git a/src/bib2graph/cli/commands/resolve.py b/src/bib2graph/cli/commands/resolve.py index 1c32e24..ec5f29e 100644 --- a/src/bib2graph/cli/commands/resolve.py +++ b/src/bib2graph/cli/commands/resolve.py @@ -30,10 +30,6 @@ from bib2graph.cli._options import json_mode, json_option from bib2graph.cli._store import resolve_library_path -# --------------------------------------------------------------------------- -# Función núcleo (testeable, sin Click) -# --------------------------------------------------------------------------- - def run_resolve( store_path: str | Path, @@ -65,11 +61,6 @@ def run_resolve( return resolve_dois(store_path, email=email, transport=transport) -# --------------------------------------------------------------------------- -# Comando Click -# --------------------------------------------------------------------------- - - @click.command("resolve") @click.option( "--email", diff --git a/src/bib2graph/cli/commands/restore.py b/src/bib2graph/cli/commands/restore.py index 49227d0..166e2f7 100644 --- a/src/bib2graph/cli/commands/restore.py +++ b/src/bib2graph/cli/commands/restore.py @@ -38,18 +38,12 @@ from bib2graph.cli._options import json_mode, json_option from bib2graph.cli._store import resolve_library_path -# Fuente única: service.snapshot.run_restore (ADR 0038). # Re-exportado para backward compat con tests que importan desde este módulo. from bib2graph.service.snapshot import run_restore __all__ = ["restore_cmd", "run_restore"] -# --------------------------------------------------------------------------- -# Comando Click (shim delgado — no se testea directamente) -# --------------------------------------------------------------------------- - - @click.command("restore") @click.option( "--from-corpus", diff --git a/src/bib2graph/cli/commands/seed.py b/src/bib2graph/cli/commands/seed.py index 029c863..a80c0c8 100644 --- a/src/bib2graph/cli/commands/seed.py +++ b/src/bib2graph/cli/commands/seed.py @@ -40,9 +40,7 @@ from bib2graph.cli._options import json_mode, json_option from bib2graph.cli._store import open_store, resolve_library_path -# --------------------------------------------------------------------------- # Función núcleo: siembra desde OpenAlex (testeable, sin Click) -# --------------------------------------------------------------------------- def run_seed( @@ -98,7 +96,6 @@ def run_seed( existing = store.load() # R3 — reseed: si ya había un estado previo, es un re-sembrado. - # apply_transition lleva la ronda al valor correcto. current_state = store.backend.loop_state() current_round = store.backend.loop_round() if current_state is not None: @@ -107,10 +104,8 @@ def run_seed( current_state, "reseed", current_round ) else: - # Primera siembra new_state, new_round = apply_transition(None, "seed", current_round) - # Construir kwargs opcionales para OpenAlexSource source_kwargs: dict[str, Any] = {"email": email, "transport": transport} if max_results is not None: source_kwargs["max_results"] = max_results @@ -133,7 +128,6 @@ def run_seed( # decorador @handle_errors las captura por tipo y emite exit 4. # Merge primero, dedup después sobre el corpus COMPLETO (fix bug cross-biblioteca). - # Orden: existing + incoming → merged completo → normalize_and_dedup → persist_replace. # El reloj se fija UNA vez por invocación (R2). ingest_at = datetime.now(UTC) merged = existing.merge(result.corpus) @@ -163,9 +157,7 @@ def run_seed( } -# --------------------------------------------------------------------------- # Función núcleo: siembra desde BibTeX (testeable, sin Click) -# --------------------------------------------------------------------------- def run_seed_from_bib( @@ -256,7 +248,6 @@ def run_seed_from_bib( raise DataError(str(exc)) from exc # Merge primero, dedup después sobre el corpus COMPLETO (fix bug cross-biblioteca). - # Orden: existing + incoming → merged completo → normalize_and_dedup → persist_replace. # El reloj se fija UNA vez por invocación (R2). ingest_at = datetime.now(UTC) merged = existing.merge(corpus) @@ -307,9 +298,7 @@ def run_seed_from_bib( return seed_result -# --------------------------------------------------------------------------- -# Comando Click (no se testea directamente) -# --------------------------------------------------------------------------- +# Comando Click @click.command("seed") @@ -433,7 +422,6 @@ def seed_cmd( b2g seed --spec equation.yaml b2g seed --from-bib semillas.bib """ - # --- Validar exclusividad de modos --- modes_given = sum( [equation is not None, spec_path is not None, bib_path is not None] ) @@ -455,9 +443,7 @@ def seed_cmd( "Usá exactamente uno por invocación." ) - # --- Validar: --from-bib no acepta flags de OpenAlex (excepto --email y --resolve) --- # --email se permite con --from-bib cuando se usa junto a --resolve (cierra GAP-2 / #112). - # --resolve solo aplica a --from-bib. if bib_path is not None: openalex_flags_usados: list[str] = [] if native: @@ -482,7 +468,6 @@ def seed_cmd( "Usá: b2g seed --from-bib --resolve --email " ) else: - # --resolve solo aplica al modo --from-bib if do_resolve: raise UsageError( "--resolve solo es válido con --from-bib. " @@ -491,7 +476,6 @@ def seed_cmd( store_path = resolve_library_path(ctx.obj) - # --- Modo --from-bib (BibTeX local, sin red) --- if bib_path is not None: data = run_seed_from_bib(store_path, bib_path, resolve=do_resolve, email=email) if json_mode(json_output): @@ -513,7 +497,6 @@ def seed_cmd( ) return - # --- Modo --spec (YAML declarativo) --- if spec_path is not None: from bib2graph.sources.equation import load_equation_spec @@ -551,7 +534,6 @@ def seed_cmd( emit_human(f"Total en corpus: {data['total_papers']}") return - # --- Modo --equation (directo, comportamiento original) --- data = run_seed( store_path, equation, # type: ignore[arg-type] # equation is not None here diff --git a/src/bib2graph/cli/commands/skill.py b/src/bib2graph/cli/commands/skill.py index f02207c..b0b2f22 100644 --- a/src/bib2graph/cli/commands/skill.py +++ b/src/bib2graph/cli/commands/skill.py @@ -42,9 +42,7 @@ from bib2graph.cli._errors import UsageError, handle_errors from bib2graph.cli._options import json_mode, json_option -# --------------------------------------------------------------------------- # Helpers internos -# --------------------------------------------------------------------------- def _locate_skill_source() -> Path: @@ -107,9 +105,6 @@ def _trees_identical(a: Path, b: Path) -> bool: # Resumen "a grandes rasgos" de cómo opera bib2graph, para que un agente de # CUALQUIER proveedor (no solo Claude Code) sepa qué es esto y vaya al SKILL.md. -# (La integración real depende del cliente; esto la hace auto-descubrible: la -# salida del CLI dice dónde está el artículo y pide leerlo. Ver #193 para la -# distribución agnóstica al proveedor de 0.11.0.) _HOW_IT_WORKS = ( "bib2graph entrevista al investigador y corre el ciclo de forrajeo " "seed→chain→build→read (one-shot o profundizando), priorizando candidatos " @@ -197,9 +192,7 @@ def run_skill_add( return _build_result(dest, scope, installed=True, already_present=False) -# --------------------------------------------------------------------------- # Grupo raíz -# --------------------------------------------------------------------------- @click.group("skill", invoke_without_command=True) @@ -221,9 +214,7 @@ def skill_grp(ctx: click.Context) -> None: click.echo(ctx.get_help()) -# --------------------------------------------------------------------------- # skill add -# --------------------------------------------------------------------------- @skill_grp.command("add") diff --git a/src/bib2graph/cli/commands/snapshot.py b/src/bib2graph/cli/commands/snapshot.py index 3647cdb..000d2ad 100644 --- a/src/bib2graph/cli/commands/snapshot.py +++ b/src/bib2graph/cli/commands/snapshot.py @@ -55,9 +55,7 @@ ] -# --------------------------------------------------------------------------- # Grupo raíz -# --------------------------------------------------------------------------- @click.group("snapshot", invoke_without_command=True) @@ -79,9 +77,7 @@ def snapshot_grp(ctx: click.Context) -> None: click.echo(ctx.get_help()) -# --------------------------------------------------------------------------- # snapshot create -# --------------------------------------------------------------------------- @snapshot_grp.command("create") @@ -128,9 +124,7 @@ def create_cmd( emit_human(f"Total papers: {data['total_papers']}") -# --------------------------------------------------------------------------- # snapshot restore -# --------------------------------------------------------------------------- @snapshot_grp.command("restore") @@ -186,8 +180,5 @@ def restore_sub_cmd( emit_human(f"Estado del lazo: {data['state']}") -# --------------------------------------------------------------------------- # Alias snapshot_cmd → snapshot_grp (compat con registros y tests existentes) -# --------------------------------------------------------------------------- - snapshot_cmd = snapshot_grp diff --git a/src/bib2graph/cli/commands/status.py b/src/bib2graph/cli/commands/status.py index 3d4f8a5..7820e69 100644 --- a/src/bib2graph/cli/commands/status.py +++ b/src/bib2graph/cli/commands/status.py @@ -31,9 +31,7 @@ from bib2graph.cycle import CURATION_ACTIONS, available_transitions, next_best_action from bib2graph.networks.facade import predict_build_preview -# --------------------------------------------------------------------------- # Función núcleo (testeable, sin Click) -# --------------------------------------------------------------------------- def run_status(store_path: str | Path) -> dict[str, Any]: @@ -75,7 +73,6 @@ def run_status(store_path: str | Path) -> dict[str, Any]: state_str = loop_state.value if loop_state is not None else None current_round = store.backend.loop_round() - # Conteos por curation_status via query SQL from bib2graph.constants import Col counts_table = store.backend.query( @@ -94,7 +91,6 @@ def run_status(store_path: str | Path) -> dict[str, Any]: transitions = available_transitions(loop_state) # Curación transversal: siempre disponible, nunca transiciona el lazo. - # Antes de R3, ``transitions_available`` nunca listaba accept/reject → bug cerrado. curation = list(CURATION_ACTIONS) # #54: conteo de IDs backward observados pero no materializados. @@ -109,7 +105,6 @@ def run_status(store_path: str | Path) -> dict[str, Any]: # next_best_action: derivado puramente del FSM (cycle.py). action = next_best_action(loop_state) - # build_preview: predice vacío/no-vacío por red sin proyectar el grafo. build_prev = predict_build_preview(corpus) # readiness: si el próximo paso va a DAR FRUTO (no solo si está permitido). @@ -168,9 +163,7 @@ def run_status(store_path: str | Path) -> dict[str, Any]: } -# --------------------------------------------------------------------------- # Comando Click -# --------------------------------------------------------------------------- @click.command("status") @@ -197,7 +190,6 @@ def status_cmd( data = run_status(store_path) - # Agregar info del workspace (campo aditivo, schema="1" se mantiene) data["workspace"] = { "root": str(ws.root) if ws.root is not None else None, "source": ws.source, @@ -254,7 +246,6 @@ def status_cmd( ref_count = data.get("referenced_not_fetched", 0) if ref_count > 0: emit_human(f"Referenciados sin materializar: {ref_count}") - # ADR 0037 §(e) — campos aditivos emit_human(f"Próximo mejor paso: b2g {data['next_best_action']}") readiness = data["readiness"] ready_str = ( diff --git a/src/bib2graph/cli/commands/validate.py b/src/bib2graph/cli/commands/validate.py index 90944ed..5f6b63e 100644 --- a/src/bib2graph/cli/commands/validate.py +++ b/src/bib2graph/cli/commands/validate.py @@ -18,10 +18,6 @@ from bib2graph.cli._store import open_store_readonly, resolve_library_path from bib2graph.constants import Col, CurationStatus -# --------------------------------------------------------------------------- -# Función núcleo (testeable, sin Click) -# --------------------------------------------------------------------------- - def run_validate(store_path: str | Path) -> dict[str, Any]: """Valida el schema del store y la consistencia del corpus. @@ -60,7 +56,6 @@ def run_validate(store_path: str | Path) -> dict[str, Any]: f"Error al leer el store: {exc}. El archivo puede estar corrupto." ) from exc - # Validación con validate_table (lanza SchemaError si falla) try: validate_table(table) except SchemaError as exc: @@ -68,7 +63,6 @@ def run_validate(store_path: str | Path) -> dict[str, Any]: f"Schema del corpus inválido: {exc}. Verificá la integridad del store." ) from exc - # Verificaciones de consistencia issues = [] rows = table.to_pylist() @@ -106,11 +100,6 @@ def run_validate(store_path: str | Path) -> dict[str, Any]: } -# --------------------------------------------------------------------------- -# Comando Click -# --------------------------------------------------------------------------- - - @click.command("validate") @json_option @click.pass_context diff --git a/src/bib2graph/constants.py b/src/bib2graph/constants.py index 13b2090..136e2ac 100644 --- a/src/bib2graph/constants.py +++ b/src/bib2graph/constants.py @@ -11,10 +11,6 @@ from enum import StrEnum -# --------------------------------------------------------------------------- -# Col — nombres canónicos de columna del Corpus (23 columnas según CORPUS_SCHEMA) -# --------------------------------------------------------------------------- - class Col(StrEnum): """Nombres canónicos de columna del schema Arrow del Corpus. @@ -69,11 +65,6 @@ class Col(StrEnum): CITED_BY_ID = "cited_by_id" -# --------------------------------------------------------------------------- -# CurationStatus — valores canónicos de curation_status -# --------------------------------------------------------------------------- - - class CurationStatus(StrEnum): """Valores canónicos del campo ``curation_status``. @@ -86,11 +77,6 @@ class CurationStatus(StrEnum): REJECTED = "rejected" -# --------------------------------------------------------------------------- -# NetworkKind — tipos de red bibliométrica -# --------------------------------------------------------------------------- - - class NetworkKind(StrEnum): """Tipos de red bibliométrica disponibles. @@ -105,9 +91,23 @@ class NetworkKind(StrEnum): KEYWORD_COOCCURRENCE = "keyword_cooccurrence" -# --------------------------------------------------------------------------- -# LIST_COLUMNS — columnas de tipo list[string] (centraliza _LIST_COLS y _LIST_COL_NAMES) -# --------------------------------------------------------------------------- +def doi_to_url(doi: str | None) -> str | None: + """Deriva la URL canónica ``https://doi.org/`` a partir de un DOI. + + Criterio compartido por ``networks/decorate.py`` y ``service/reads.py`` + para evitar drift en la regla de derivación. + + Args: + doi: String del DOI (sin prefijo URL), o ``None``. + + Returns: + ``"https://doi.org/"`` si ``doi`` es un string no vacío; + ``None`` en cualquier otro caso (None, vacío). + """ + if isinstance(doi, str) and doi: + return f"https://doi.org/{doi}" + return None + LIST_COLUMNS: frozenset[str] = frozenset( { diff --git a/src/bib2graph/corpus.py b/src/bib2graph/corpus.py index 9c5a92e..cf67833 100644 --- a/src/bib2graph/corpus.py +++ b/src/bib2graph/corpus.py @@ -31,19 +31,11 @@ validate_table, ) -# --------------------------------------------------------------------------- # Re-exporta compute_corpus_hash con el nombre histórico que usan los tests # del Hito 1 (``from bib2graph.corpus import _compute_corpus_hash``). -# --------------------------------------------------------------------------- - _compute_corpus_hash = compute_corpus_hash -# --------------------------------------------------------------------------- -# Versión de la librería (D5) -# --------------------------------------------------------------------------- - - def _lib_version() -> str: """Devuelve la versión instalada de bib2graph. @@ -59,11 +51,7 @@ def _lib_version() -> str: return "unknown" -# --------------------------------------------------------------------------- -# Identidad canónica de un paper (D1) — accesible al backend y a Corpus -# --------------------------------------------------------------------------- - - +# Identidad canónica: doi > source_id > título+año (D1, ADR 0036) def _compute_id( doi: str | None, source_id: str | None, @@ -135,11 +123,6 @@ def _rows_with_ids(rows: list[dict[str, object]]) -> list[dict[str, object]]: return result -# --------------------------------------------------------------------------- -# Submodelos del Manifest (API.md §1.3) -# --------------------------------------------------------------------------- - - class EquationRef(BaseModel): """Referencia a una ecuación de búsqueda ejecutada.""" @@ -179,11 +162,6 @@ class EnricherRef(BaseModel): params: dict[str, str] = Field(default_factory=dict) -# --------------------------------------------------------------------------- -# Manifest (API.md §1.3, D5) -# --------------------------------------------------------------------------- - - class Manifest(BaseModel): """Metadatos sellados del Corpus. @@ -196,7 +174,6 @@ class Manifest(BaseModel): lib_version: str created_at: datetime - # Opcionales con default (D5) openalex_version: str | None = None equations: list[EquationRef] = Field(default_factory=list) chaining: ChainingParams | None = None @@ -205,11 +182,6 @@ class Manifest(BaseModel): enrichers: list[EnricherRef] = Field(default_factory=list) -# --------------------------------------------------------------------------- -# Corpus (API.md §1.2) -# --------------------------------------------------------------------------- - - class Corpus: """Wrapper de semántica de valor sobre un ``TabularBackend`` + un Manifest. @@ -235,10 +207,6 @@ def __init__(self, backend: TabularBackend, manifest: Manifest) -> None: self._backend = backend self._manifest = manifest - # ------------------------------------------------------------------ - # Propiedades de acceso - # ------------------------------------------------------------------ - @property def table(self) -> pa.Table: """Tabla Arrow del contenido actual (delegada al backend).""" @@ -249,10 +217,6 @@ def manifest(self) -> Manifest: """Metadatos del Corpus (solo lectura).""" return self._manifest - # ------------------------------------------------------------------ - # Constructor canónico - # ------------------------------------------------------------------ - @classmethod def from_arrow( cls, @@ -288,10 +252,6 @@ def from_arrow( ) return cls(resolved_backend, manifest) - # ------------------------------------------------------------------ - # Exportación - # ------------------------------------------------------------------ - def to_arrow(self) -> pa.Table: """Devuelve la tabla Arrow del contenido actual. @@ -300,10 +260,6 @@ def to_arrow(self) -> pa.Table: """ return self._backend.to_arrow() - # ------------------------------------------------------------------ - # Vistas filtradas (delegadas al backend) - # ------------------------------------------------------------------ - def seeds(self) -> pa.Table: """Vista de los papers semilla (``is_seed == True``). @@ -328,10 +284,6 @@ def accepted(self) -> pa.Table: """ return self._backend.filter_view("accepted") - # ------------------------------------------------------------------ - # Vista de scope por estado de curación (issue #56) - # ------------------------------------------------------------------ - def scoped(self, scope: str) -> Corpus: """Devuelve un Corpus nuevo con el subconjunto de filas según el scope. @@ -377,10 +329,6 @@ def scoped(self, scope: str) -> Corpus: new_backend = InMemoryBackend(filtered) return Corpus(new_backend, self._manifest) - # ------------------------------------------------------------------ - # Mutación (semántica de valor: devuelven Corpus nuevo) - # ------------------------------------------------------------------ - def add_paper(self, row: dict[str, object]) -> Corpus: """Agrega un paper validando la fila con ``PaperRow``. @@ -621,11 +569,6 @@ def __eq__(self, other: object) -> bool: return self._backend.corpus_hash() == other._backend.corpus_hash() -# --------------------------------------------------------------------------- -# CorpusSnapshot (API.md §1.3) -# --------------------------------------------------------------------------- - - class CorpusSnapshot: """Carpeta con corpus.parquet + manifest.json: export sellado. diff --git a/src/bib2graph/cycle.py b/src/bib2graph/cycle.py index 09558af..7000460 100644 --- a/src/bib2graph/cycle.py +++ b/src/bib2graph/cycle.py @@ -41,10 +41,6 @@ from enum import StrEnum -# --------------------------------------------------------------------------- -# CycleState -# --------------------------------------------------------------------------- - class CycleState(StrEnum): """Estados del lazo de investigación (ADR 0016 enmendado). @@ -65,10 +61,6 @@ class CycleState(StrEnum): MONITORED = "MONITORED" -# --------------------------------------------------------------------------- -# Tabla de transiciones de la cadena principal -# --------------------------------------------------------------------------- - # Acción → estado destino en la cadena principal (permisiva: no bloquea saltos, # pero la acción nombrada lleva al estado que le corresponde en el ciclo). _CHAIN_TRANSITIONS: dict[str, CycleState] = { @@ -80,10 +72,6 @@ class CycleState(StrEnum): "seed": CycleState.SEEDED, } -# --------------------------------------------------------------------------- -# Función de transición pura -# --------------------------------------------------------------------------- - def apply_transition( current_state: CycleState | None, @@ -139,10 +127,6 @@ def apply_transition( ) -# --------------------------------------------------------------------------- -# Helper: transiciones disponibles desde un estado dado -# --------------------------------------------------------------------------- - # Curación transversal: siempre disponible, nunca transiciona el lazo. # Se documenta aquí como constante de dominio y se expone en ``status``. CURATION_ACTIONS: list[str] = ["accept", "reject"] @@ -223,10 +207,6 @@ def available_transitions(state: CycleState | None) -> list[str]: return list(_AVAILABLE_TRANSITIONS.get(state, ["seed"])) -# --------------------------------------------------------------------------- -# next_best_action — ADR 0037 §(e) -# --------------------------------------------------------------------------- - # Mapa determinista estado → único próximo comando recomendado. # Refleja el camino canónico del ciclo de investigación (Nota 05 §3): # init → seed → chain → build → read → (monitorear → chain). diff --git a/src/bib2graph/enrichers/openalex.py b/src/bib2graph/enrichers/openalex.py index 7794dda..bd38895 100644 --- a/src/bib2graph/enrichers/openalex.py +++ b/src/bib2graph/enrichers/openalex.py @@ -107,9 +107,7 @@ def enrich(self, corpus: Corpus) -> Corpus: return corpus - # ------------------------------------------------------------------ # Pasada 1: references_id → references_doi (pública para absorción en chain) - # ------------------------------------------------------------------ def enrich_references_doi(self, corpus: Corpus) -> Corpus: """Rellena ``references_doi`` alineado a ``references_id``. @@ -141,7 +139,6 @@ def _enrich_references_doi(self, corpus: Corpus) -> Corpus: table = corpus.to_arrow() rows = table.to_pylist() - # Recolectar todos los references_id únicos all_ref_ids: set[str] = set() for row in rows: refs = row.get(Col.REFERENCES_ID) or [] @@ -150,10 +147,8 @@ def _enrich_references_doi(self, corpus: Corpus) -> Corpus: if not all_ref_ids: return self._with_refs_doi_ref(corpus, resolved=0, total=0) - # Resolver IDs a DOIs doi_map = self._source.fetch_dois_for(list(all_ref_ids)) - # Rellenar references_doi alineado a references_id enriched_rows: list[dict[str, Any]] = [] for row in rows: row_copy = dict(row) @@ -174,9 +169,7 @@ def _enrich_references_doi(self, corpus: Corpus) -> Corpus: new_corpus, resolved=resolved, total=len(all_ref_ids) ) - # ------------------------------------------------------------------ # Pasada 2: cited_by_id para semillas aceptadas (Hito 8b, pública para build) - # ------------------------------------------------------------------ def enrich_cited_by(self, corpus: Corpus) -> Corpus: """Puebla ``cited_by_id`` de las semillas aceptadas. @@ -226,7 +219,6 @@ def _enrich_cited_by(self, corpus: Corpus) -> Corpus: table = corpus.to_arrow() rows = table.to_pylist() - # 1. Identificar semillas aceptadas con source_id (motor OpenAlex). # Bug #111: normalizar URL→corto para que el lookup no falle en silencio # si el id viene como URL completa (https://openalex.org/W...). from bib2graph.sources.openalex import _oa_id_short @@ -248,13 +240,10 @@ def _enrich_cited_by(self, corpus: Corpus) -> Corpus: target_set: set[str] = set(target_ids) - # 2. Batching: fetch_citing_batch loteó en ≤50, paginó con presupuesto - # por semilla y devuelve ya atribuido y acotado: {seed_id: [citer_id]} citing_dict = self._source.fetch_citing_batch( target_ids, max_per_paper=self._max_citing_per_paper ) - # 3. Reconstruir filas con cited_by_id actualizado (unión con existentes). # total_new cuenta citantes efectivamente agregados post-tope. enriched_rows: list[dict[str, Any]] = [] total_new = 0 @@ -265,7 +254,6 @@ def _enrich_cited_by(self, corpus: Corpus) -> Corpus: if oa_id and oa_id in target_set: existing: list[str] = list(row_copy.get(Col.CITED_BY_ID) or []) existing_set = set(existing) - # Citantes devueltos por el source (ya acotados por max_per_paper) source_citers: list[str] = citing_dict.get(str(oa_id)) or [] # Unión determinista; re-aplicar tope para idempotencia robusta merged = sorted(existing_set | set(source_citers)) @@ -287,9 +275,7 @@ def _enrich_cited_by(self, corpus: Corpus) -> Corpus: total=len(target_ids), ) - # ------------------------------------------------------------------ # Helper: registrar EnricherRef en el Manifest (idempotente por nombre) - # ------------------------------------------------------------------ def _with_refs_doi_ref( self, corpus: Corpus, *, resolved: int, total: int @@ -351,9 +337,7 @@ def _with_cited_by_ref( new_manifest = corpus.manifest.model_copy(update={"enrichers": updated}) return corpus.with_manifest(new_manifest) - # ------------------------------------------------------------------ # Alias de compatibilidad: _with_enricher_ref (Hito 8a) - # ------------------------------------------------------------------ def _with_enricher_ref( self, corpus: Corpus, *, resolved: int, total: int diff --git a/src/bib2graph/exporters/csv.py b/src/bib2graph/exporters/csv.py index 51be5d0..dc28b28 100644 --- a/src/bib2graph/exporters/csv.py +++ b/src/bib2graph/exporters/csv.py @@ -68,12 +68,10 @@ def _write_nodos( out_path: Path, ) -> None: """Escribe nodos.csv con id, label, atributos de nodo y métricas (D5).""" - # Recoger nombres de columnas de atributos de nodo node_attr_keys: set[str] = set() for _, attrs in g.nodes(data=True): node_attr_keys.update(attrs.keys()) - # Recoger nombres de columnas de métricas (solo los anidados {nodo: val}) metric_keys: list[str] = [] metric_dicts: dict[str, dict[Any, Any]] = {} for k, v in results.items(): @@ -81,7 +79,6 @@ def _write_nodos( metric_keys.append(k) metric_dicts[k] = v - # Columnas: id, label, atributos de nodo (ordenados), métricas (ordenadas) attr_cols = sorted(node_attr_keys - {"label"}) # 'label' la manejamos aparte metric_cols = sorted(metric_keys) header = ["id", "label", *attr_cols, *metric_cols] diff --git a/src/bib2graph/exporters/graphml.py b/src/bib2graph/exporters/graphml.py index 3e886c4..5764181 100644 --- a/src/bib2graph/exporters/graphml.py +++ b/src/bib2graph/exporters/graphml.py @@ -49,7 +49,6 @@ def export( # Copiar el grafo para no mutar el original export_g: _Graph = g.copy() - # Fusionar métricas de nodo desde results (D5) for metric_name, metric_value in results.items(): if isinstance(metric_value, dict): for node, val in metric_value.items(): diff --git a/src/bib2graph/filters/prisma.py b/src/bib2graph/filters/prisma.py index 4f4c66e..9e6dd40 100644 --- a/src/bib2graph/filters/prisma.py +++ b/src/bib2graph/filters/prisma.py @@ -28,7 +28,6 @@ from bib2graph.constants import Col, CurationStatus from bib2graph.corpus import Corpus, FilterStep -# Campos soportados y operadores válidos por campo _FIELD_OPS: dict[str, set[str]] = { "year": {"gte", "lte"}, "type": {"in", "not_in"}, @@ -69,14 +68,13 @@ def _passes(row: dict[str, object], criterion: FilterCriterion) -> bool: if field == "year": year_raw = row.get(Col.YEAR) if year_raw is None: - return False # sin año → no pasa + return False y = int(str(year_raw)) int_value = int(str(value)) if op == "gte": return y >= int_value if op == "lte": return y <= int_value - # R5: operador no válido para este campo → error accionable. raise ValueError( f"Operador '{op}' no soportado para el campo 'year'. " f"Operadores válidos: {_FIELD_OPS['year']}." @@ -94,7 +92,6 @@ def _passes(row: dict[str, object], criterion: FilterCriterion) -> bool: return any(v in area_list for v in vals) if op == "not_in": return not any(v in area_list for v in vals) - # R5: operador no válido para este campo → error accionable. raise ValueError( f"Operador '{op}' no soportado para el campo 'type'. " f"Operadores válidos: {_FIELD_OPS['type']}." @@ -114,7 +111,6 @@ def _passes(row: dict[str, object], criterion: FilterCriterion) -> bool: return lang_str in vals_lang if op == "not_in": return lang_str not in vals_lang - # R5: operador no válido para este campo → error accionable. raise ValueError( f"Operador '{op}' no soportado para el campo 'language'. " f"Operadores válidos: {_FIELD_OPS['language']}." @@ -126,13 +122,11 @@ def _passes(row: dict[str, object], criterion: FilterCriterion) -> bool: min_val = int(str(value)) if op == "gte": return n >= min_val - # R5: operador desconocido para el campo → error accionable. raise ValueError( f"Operador '{op}' no soportado para el campo 'min_citations'. " f"Operadores válidos: {_FIELD_OPS.get(field, set())}." ) - # R5: campo desconocido → error accionable (antes era no-op silencioso). raise ValueError( f"Campo de filtro desconocido: '{field}'. " f"Campos soportados: {list(_FIELD_OPS.keys())}." @@ -244,7 +238,6 @@ def apply_filters( current, step = apply_filter(current, criterion, decided_at=decided_at) steps.append(step) - # Sellar el Manifest.filters con todos los pasos new_manifest = current.manifest.model_copy(update={"filters": steps}) final_corpus = current.with_manifest(new_manifest) return final_corpus, steps diff --git a/src/bib2graph/foraging/base.py b/src/bib2graph/foraging/base.py index 3da6b36..d67c27a 100644 --- a/src/bib2graph/foraging/base.py +++ b/src/bib2graph/foraging/base.py @@ -16,7 +16,6 @@ from bib2graph.corpus import Corpus -# Alias público para el tipo de dirección de chaining Direction = Literal["backward", "forward", "both"] diff --git a/src/bib2graph/foraging/forager.py b/src/bib2graph/foraging/forager.py index 92b78b7..a0c8f98 100644 --- a/src/bib2graph/foraging/forager.py +++ b/src/bib2graph/foraging/forager.py @@ -106,7 +106,6 @@ def _estimate_forward_from_cited_by_detail( donde ``total_uncapped`` es el conteo antes de aplicar cualquier cap. (El cap lo aplica el llamador; aquí siempre devuelve el total completo.) """ - # ids ya presentes en el corpus corpus_ids: set[str] = set() for row in corpus_rows: id_val = row.get(Col.ID) @@ -116,7 +115,6 @@ def _estimate_forward_from_cited_by_detail( if source_id_val: corpus_ids.add(str(source_id_val)) - # Recolectar IDs únicos de cited_by_id que no estén ya en el corpus candidate_ids: set[str] = set() has_cited_by_data = False for row in corpus_rows: @@ -324,7 +322,6 @@ def chain( if cand_id not in fwd_candidate_rows: fwd_candidate_rows[cand_id] = fwd_rows[cand_id] - # Ranking estable (desc scent, asc id) — incluye backward + forward ranking = rank_candidates(combined_scent, max_candidates=self._max_candidates) # observed_refs: IDs backward presentes en el ranking (respeta el cap), @@ -335,7 +332,6 @@ def chain( for cand_id, _ in ranking if cand_id in bwd_observed and cand_id in ranked_ids_set - # excluir IDs que también aparecen como forward (ya en corpus) and cand_id not in fwd_candidate_rows ] @@ -353,7 +349,6 @@ def chain( else: candidates_corpus = _make_empty_corpus() - # Poblar el manifest con chaining params from bib2graph.corpus import ChainingParams new_manifest = candidates_corpus.manifest.model_copy( @@ -373,9 +368,7 @@ def chain( observed_refs=observed_refs, ) - # ------------------------------------------------------------------ # Helpers internos - # ------------------------------------------------------------------ def _fetch_forward( self, @@ -429,8 +422,6 @@ def _fetch_forward( if not seed_ids: return {}, {} - # corpus_ids: ids y source_ids de todos los papers del corpus - # (para excluir candidatos ya presentes y calcular el score). # Se incluye source_id porque los IDs de motor (W… de OpenAlex) aparecen # en references_id y deben cruzar contra source_id W… del corpus. corpus_ids: set[str] = set() @@ -484,7 +475,7 @@ def _fetch_forward( citer_to_seeds: dict[str, list[str]] = {} for seed_id, citer_ids in citing_dict.items(): for citer_id in citer_ids: - if citer_id not in corpus_ids: # excluir ya presentes + if citer_id not in corpus_ids: citer_to_seeds.setdefault(citer_id, []).append(seed_id) if not citer_to_seeds: @@ -500,7 +491,6 @@ def _fetch_forward( scent_map[citer_id] = score work = works_map.get(citer_id) if work is not None: - # Metadata real disponible: construir fila canónica completa. row = _work_to_row( work, equation_id="chaining:forward", diff --git a/src/bib2graph/foraging/scent.py b/src/bib2graph/foraging/scent.py index f41095d..8be848c 100644 --- a/src/bib2graph/foraging/scent.py +++ b/src/bib2graph/foraging/scent.py @@ -89,7 +89,6 @@ def compute_backward_scent( Dict ``{candidate_id: score}`` donde score = nº de corpus-papers que listan al candidato en ``references_id``. """ - # ids ya presentes en el corpus (para excluir candidatos duplicados). # Se incluye tanto Col.ID como Col.SOURCE_ID: las references_id de OpenAlex # son IDs de motor (W…) y deben cruzar contra el source_id W… del corpus. corpus_ids: set[str] = set() @@ -101,7 +100,6 @@ def compute_backward_scent( if source_id_val: corpus_ids.add(str(source_id_val)) - # Primitivo del proyector: {ref_id → [paper_ids del corpus que lo citan]} # Usamos Col.ID como id_col para registrar qué corpus-paper hace la cita. ref_to_papers = collect_item_to_papers(corpus_rows, Col.ID, Col.REFERENCES_ID) @@ -150,9 +148,8 @@ def compute_forward_scent( Dict ``{citing_id: score}`` donde score = nº de corpus-papers citados directamente por el candidato Y. """ - # corpus_ids: ids y source_ids del corpus - # — sirven para (a) excluir candidatos ya presentes y - # (b) intersectar con Y.references_id para el score de citación directa. + # Sirven para (a) excluir candidatos ya presentes y + # (b) intersectar con Y.references_id para el score de citación directa. # Se incluye tanto Col.ID como Col.SOURCE_ID: las references_id de OpenAlex # son IDs de motor (W…) y deben cruzar contra el source_id W… del corpus. corpus_ids: set[str] = set() @@ -171,13 +168,12 @@ def compute_forward_scent( continue citing_id_str = str(citing_id) if citing_id_str in corpus_ids: - continue # ya en el corpus, no es candidato nuevo + continue refs = row.get(Col.REFERENCES_ID) if not refs or not isinstance(refs, list): continue - # Citación directa: cuántos corpus-papers aparecen en Y.references_id direct = sum( 1 for ref in refs if ref and isinstance(ref, str) and str(ref) in corpus_ids ) diff --git a/src/bib2graph/networks/analyzer.py b/src/bib2graph/networks/analyzer.py index b5ec866..ee7ac11 100644 --- a/src/bib2graph/networks/analyzer.py +++ b/src/bib2graph/networks/analyzer.py @@ -30,11 +30,6 @@ _Graph = nx.Graph -# --------------------------------------------------------------------------- -# QualityThresholds (D6) -# --------------------------------------------------------------------------- - - class QualityThresholds(BaseModel): """Umbrales configurables para el informe de calidad de co-citación. @@ -54,11 +49,6 @@ class QualityThresholds(BaseModel): min_recurrent_authors: int = 10 -# --------------------------------------------------------------------------- -# network_metrics -# --------------------------------------------------------------------------- - - def network_metrics(g: _Graph) -> dict[str, object]: """Densidad, nº de componentes y clustering promedio del grafo. @@ -76,11 +66,6 @@ def network_metrics(g: _Graph) -> dict[str, object]: } -# --------------------------------------------------------------------------- -# centrality -# --------------------------------------------------------------------------- - - def centrality(g: _Graph) -> dict[str, dict[Any, float]]: """Centralidad de grado e intermediación por nodo. @@ -97,11 +82,6 @@ def centrality(g: _Graph) -> dict[str, dict[Any, float]]: } -# --------------------------------------------------------------------------- -# detect_communities -# --------------------------------------------------------------------------- - - def detect_communities( g: _Graph, method: str = "louvain", @@ -175,11 +155,6 @@ def detect_communities( ) -# --------------------------------------------------------------------------- -# assortativity -# --------------------------------------------------------------------------- - - def assortativity( g: _Graph, *, @@ -228,11 +203,6 @@ def assortativity( return result -# --------------------------------------------------------------------------- -# community_composition -# --------------------------------------------------------------------------- - - def community_composition( g: _Graph, communities: dict[Any, int], @@ -249,7 +219,6 @@ def community_composition( Dict comunidad → Dict categoría → fracción (0.0 a 1.0). La suma de fracciones por comunidad es 1.0 si todos los nodos tienen el atributo. """ - # Agrupar nodos por comunidad → lista de valores del atributo community_values: dict[int, list[str]] = {} for node, comm_id in communities.items(): val = g.nodes[node].get(attribute) @@ -259,14 +228,13 @@ def community_composition( community_values[comm_id] = [] community_values[comm_id].append(str(val)) - # Recoger todas las categorías presentes all_categories: set[str] = set() for vals in community_values.values(): all_categories.update(vals) - sorted_categories = sorted(all_categories) # orden determinista + sorted_categories = sorted(all_categories) result: dict[int, dict[str, float]] = {} - for comm_id in sorted(community_values): # orden determinista + for comm_id in sorted(community_values): vals = community_values[comm_id] total = len(vals) composition: dict[str, float] = {} @@ -277,11 +245,6 @@ def community_composition( return result -# --------------------------------------------------------------------------- -# cocitation_quality_report -# --------------------------------------------------------------------------- - - def cocitation_quality_report( corpus: Corpus, *, @@ -312,17 +275,12 @@ def cocitation_quality_report( rows = table.to_pylist() total = len(rows) - # Criterio 1: volumen documental vol_pasa = total >= thresholds.min_volume - # Criterio 2: fracción con DOI con_doi = sum(1 for r in rows if r.get(Col.DOI)) doi_pct = con_doi / total if total > 0 else 0.0 doi_pasa = doi_pct >= thresholds.min_doi_refs_pct - # Criterio 3: diversidad geográfica (countries vía institutions_id) - # Se usa el prefijo de cada id de institución como proxy de país - # (ej. "ROR:AR..." → AR). En la práctica, institutions_id son ROR ids. # Para el report usamos el conjunto de valores únicos en institutions_id # que sean distintos entre sí (la diversidad real requiere un lookup externo; # aquí contamos cuántos ids distintos hay, bajo el supuesto de que cada inst @@ -343,7 +301,6 @@ def cocitation_quality_report( unique_insts.add(str(inst)) geo_pasa = len(unique_insts) >= thresholds.min_countries - # Criterio 4: autores recurrentes (aparecen en ≥2 papers) author_count: dict[str, int] = {} for r in rows: authors = r.get(Col.AUTHORS_ID) diff --git a/src/bib2graph/networks/clusters.py b/src/bib2graph/networks/clusters.py index 783419a..e49200c 100644 --- a/src/bib2graph/networks/clusters.py +++ b/src/bib2graph/networks/clusters.py @@ -32,7 +32,6 @@ {NetworkKind.BIBLIOGRAPHIC_COUPLING, NetworkKind.COCITATION} ) -# Cuántos autores/keywords mostrar en top_authors / top_keywords _TOP_N: int = 5 @@ -73,21 +72,17 @@ def cluster_table( Returns: Lista de dicts ordenada por ``cluster``. Vacía si no aplica. """ - # Sólo aplica a redes de paper if artifact.spec.kind not in _PAPER_KINDS: return [] - # Sin comunidades → sin tabla if artifact.communities is None: return [] communities: dict[Any, int] = artifact.communities - # --- Construir índice Col.ID → metadatos --- # Lección B6: index por Col.ID, no por Col.SOURCE_ID paper_index = _build_paper_index(table) - # --- Agrupar nodos por comunidad --- by_cluster: dict[int, list[Any]] = {} for node, comm_id in communities.items(): cid = int(comm_id) @@ -95,7 +90,6 @@ def cluster_table( by_cluster[cid] = [] by_cluster[cid].append(node) - # --- Construir fila de resumen por cluster --- rows: list[dict[str, Any]] = [] for comm_id in sorted(by_cluster): nodes = by_cluster[comm_id] @@ -112,7 +106,6 @@ def cluster_table( key = str(node) info = paper_index.get(key) if info is None: - # Nodo sin match en el corpus: suma al size, no aporta datos continue if info.get("is_seed"): diff --git a/src/bib2graph/networks/decorate.py b/src/bib2graph/networks/decorate.py index 63912a5..5b93291 100644 --- a/src/bib2graph/networks/decorate.py +++ b/src/bib2graph/networks/decorate.py @@ -30,6 +30,8 @@ - ``year``: int o ausente si None. - ``is_seed``: bool. - ``curation_status``: string. + - ``doi``: string o ausente si no hay DOI en el corpus. + - ``url``: ``"https://doi.org/"`` o ausente si no hay DOI. Atributo de comunidad (si se provee ``communities``): - ``community``: int. @@ -42,7 +44,7 @@ import networkx as nx import pyarrow as pa -from bib2graph.constants import Col, NetworkKind +from bib2graph.constants import Col, NetworkKind, doi_to_url if TYPE_CHECKING: from bib2graph.networks.spec import NetworkArtifact @@ -52,24 +54,18 @@ else: _Graph = nx.Graph -# Límite de caracteres para el label de paper (título largo truncado) LABEL_MAX_CHARS: int = 60 -# Kinds de red cuyo nodo es un paper (Col.ID) _PAPER_KINDS: frozenset[str] = frozenset( {NetworkKind.BIBLIOGRAPHIC_COUPLING, NetworkKind.COCITATION} ) -# --------------------------------------------------------------------------- -# Índices internos: construidos una sola vez por llamada a decorate_graph -# --------------------------------------------------------------------------- - - def _build_paper_index(table: pa.Table) -> dict[str, dict[str, object]]: - """Construye un índice ``{paper_id → {label, year, is_seed, curation_status}}``. + """Construye un índice ``{paper_id → {label, year, is_seed, curation_status, doi}}``. El label de paper es ``"título (año)"`` truncado a ``LABEL_MAX_CHARS`` chars. + ``doi`` es el DOI del paper (string) o ``None`` si no está disponible. Args: table: Tabla Arrow canónica del Corpus. @@ -82,15 +78,15 @@ def _build_paper_index(table: pa.Table) -> dict[str, dict[str, object]]: years = table.column(Col.YEAR).to_pylist() is_seeds = table.column(Col.IS_SEED).to_pylist() statuses = table.column(Col.CURATION_STATUS).to_pylist() + dois = table.column(Col.DOI).to_pylist() index: dict[str, dict[str, object]] = {} - for pid, title, year, is_seed, status in zip( - ids, titles, years, is_seeds, statuses, strict=False + for pid, title, year, is_seed, status, doi in zip( + ids, titles, years, is_seeds, statuses, dois, strict=False ): if pid is None: continue key = str(pid) - # Construir label if title: label = str(title) if year is not None: @@ -98,13 +94,14 @@ def _build_paper_index(table: pa.Table) -> dict[str, dict[str, object]]: if len(label) > LABEL_MAX_CHARS: label = label[:LABEL_MAX_CHARS] + "..." else: - label = key # fallback al id crudo si no hay título + label = key index[key] = { "label": label, "year": int(year) if year is not None else None, "is_seed": bool(is_seed) if is_seed is not None else False, "curation_status": str(status) if status is not None else None, + "doi": str(doi) if doi is not None else None, } return index @@ -134,7 +131,6 @@ def _build_author_index(table: pa.Table) -> dict[str, str]: continue key = str(author_id) if key not in index: - # Usar el nombre raw correlativo si existe name = raw_list[i] if i < len(raw_list) and raw_list[i] else key index[key] = str(name) return index @@ -169,9 +165,7 @@ def _build_institution_index(table: pa.Table) -> dict[str, str]: return index -# --------------------------------------------------------------------------- # API pública -# --------------------------------------------------------------------------- def decorate_graph( @@ -194,6 +188,8 @@ def decorate_graph( - ``year``: int o ausente si None en el corpus. - ``is_seed``: bool. - ``curation_status``: string. + - ``doi``: string o ausente si el paper no tiene DOI en el corpus. + - ``url``: ``"https://doi.org/"`` o ausente si no hay DOI. Atributo de comunidad (si se provee ``communities``): - ``community``: int. @@ -211,7 +207,6 @@ def decorate_graph( # Centralidad de grado (una sola llamada, determinista) deg_centrality: dict[Any, float] = nx.degree_centrality(graph) - # Construir índices según kind if kind in _PAPER_KINDS: paper_index = _build_paper_index(table) for node in graph.nodes(): @@ -219,7 +214,6 @@ def decorate_graph( info = paper_index.get(key, {}) graph.nodes[node]["label"] = str(info.get("label", key)) graph.nodes[node]["degree_centrality"] = deg_centrality.get(node, 0.0) - # Atributos extra de paper: solo si están disponibles year = info.get("year") if isinstance(year, int): graph.nodes[node]["year"] = year @@ -229,6 +223,12 @@ def decorate_graph( curation = info.get("curation_status") if curation is not None: graph.nodes[node]["curation_status"] = str(curation) + doi_val = info.get("doi") + doi_str = doi_val if isinstance(doi_val, str) else None + url = doi_to_url(doi_str) + if url is not None: + graph.nodes[node]["doi"] = doi_str + graph.nodes[node]["url"] = url elif kind == NetworkKind.AUTHOR_COLLAB: author_index = _build_author_index(table) @@ -256,7 +256,6 @@ def decorate_graph( graph.nodes[node]["label"] = str(node) graph.nodes[node]["degree_centrality"] = deg_centrality.get(node, 0.0) - # Comunidades (opcional, todos los kinds) if communities is not None: for node, comm_id in communities.items(): if graph.has_node(node): diff --git a/src/bib2graph/networks/facade.py b/src/bib2graph/networks/facade.py index 10286db..e883986 100644 --- a/src/bib2graph/networks/facade.py +++ b/src/bib2graph/networks/facade.py @@ -47,8 +47,6 @@ logger = logging.getLogger(__name__) -# Tipos de red base en Networks.quick (sin co-citación; esta se añade condicionalmente) -# Derivado de NetworkKind — fuente única (R1, ADR 0023) _QUICK_KINDS: list[str] = [ NetworkKind.BIBLIOGRAPHIC_COUPLING, NetworkKind.AUTHOR_COLLAB, @@ -188,7 +186,6 @@ def _inject_scalar_attribute( if attribute not in table.schema.names: return False - # Construir índice rápido: paper_id → valor del atributo ids = table.column(Col.ID).to_pylist() values = table.column(attribute).to_pylist() @@ -249,10 +246,6 @@ def _build_artifact(corpus: Corpus, spec: NetworkSpec) -> NetworkArtifact: communities: dict[Any, int] | None = None if spec.clustering is not None and g.number_of_nodes() > 0: - # R5: el ``except Exception`` que enmascaraba fallos reales fue eliminado. - # Solo se captura ``ImportError`` (dependencia faltante → fallar fuerte, - # lección 7, AGENTS.md). Cualquier otro error se propaga limpio. - # ``ValueError`` (método desconocido) y errores de graph también se propagan. try: # R2: derivar random_state del content-hash para Louvain reproducible random_state: int | None = None @@ -283,8 +276,6 @@ def _build_artifact(corpus: Corpus, spec: NetworkSpec) -> NetworkArtifact: # sin necesitar conocer el corpus. decorate(artifact, table) - # D3 — asortatividad/composición: solo cuando spec.assortativity_attribute - # está configurado y el grafo tiene nodos. if spec.assortativity_attribute is not None and g.number_of_nodes() > 0: attr = spec.assortativity_attribute @@ -310,7 +301,6 @@ def _build_artifact(corpus: Corpus, spec: NetworkSpec) -> NetworkArtifact: else: assort_result = assortativity(g, attribute=attr, by_degree=True) - # Si hay comunidades, agregar composición por comunidad. if communities is not None: assort_result["community_composition"] = community_composition( g, communities, attr @@ -321,10 +311,7 @@ def _build_artifact(corpus: Corpus, spec: NetworkSpec) -> NetworkArtifact: return artifact -# --------------------------------------------------------------------------- -# Helpers de predicados para predict_build_preview (misma lógica que los -# proyectores — fuente única preview ↔ build, ADR 0037 §(e)) -# --------------------------------------------------------------------------- +# Helpers de predicados para predict_build_preview (fuente única preview ↔ build, ADR 0037 §(e)) def _count_rows_with_col( @@ -464,7 +451,7 @@ def predict_build_preview(corpus: Corpus) -> list[dict[str, object]]: preview: list[dict[str, object]] = [] - # --- bibliographic_coupling: references_id, scope=full --- + # bibliographic_coupling: references_id, scope=full # No-vacía sii algún references_id aparece en ≥2 papers distintos. # (dos papers con refs disjuntas producen 0 aristas → caso trampa Nota 20) n_refs_any = _count_rows_with_col(rows, Col.REFERENCES_ID) @@ -488,7 +475,7 @@ def predict_build_preview(corpus: Corpus) -> list[dict[str, object]]: } ) - # --- author_collab: authors_id, scope=full --- + # author_collab: authors_id, scope=full # No-vacía sii algún paper tiene ≥2 autores DISTINTOS no-None. # ([A1, A1] → tras dedup 1 único → 0 aristas, aunque len=2) n_authors_any = _count_rows_with_col(rows, Col.AUTHORS_ID) @@ -512,7 +499,7 @@ def predict_build_preview(corpus: Corpus) -> list[dict[str, object]]: } ) - # --- institution_collab: institutions_id, scope=full --- + # institution_collab: institutions_id, scope=full # No-vacía sii algún paper tiene ≥2 instituciones DISTINTAS no-None. n_inst_any = _count_rows_with_col(rows, Col.INSTITUTIONS_ID) ic_empty = not _has_paper_with_multi_distinct(rows, Col.INSTITUTIONS_ID) @@ -535,7 +522,7 @@ def predict_build_preview(corpus: Corpus) -> list[dict[str, object]]: } ) - # --- keyword_cooccurrence: keywords_id, scope=full --- + # keyword_cooccurrence: keywords_id, scope=full # No-vacía sii algún paper tiene ≥2 keywords DISTINTAS no-None. # Fix preferencial: si hay keywords_raw pero no keywords_id, thesaurus puede # generar keywords_id sin red; si no hay keywords_raw, se necesita seed --resolve. @@ -568,7 +555,7 @@ def predict_build_preview(corpus: Corpus) -> list[dict[str, object]]: } ) - # --- cocitation: cited_by_id, scope=seeds_only --- + # cocitation: cited_by_id, scope=seeds_only # No-vacía sii algún cited_by_id aparece en ≥2 seeds distintas. # (dos seeds con citantes disjuntos producen 0 aristas) n_cited_any = _count_rows_with_col(rows, Col.CITED_BY_ID, seeds_only=True) diff --git a/src/bib2graph/networks/projectors.py b/src/bib2graph/networks/projectors.py index fe2afe4..4ab8a32 100644 --- a/src/bib2graph/networks/projectors.py +++ b/src/bib2graph/networks/projectors.py @@ -26,7 +26,6 @@ else: _Graph = nx.Graph -# Constante pública (UPPER_SNAKE, lección AGENTS.md) MIN_WEIGHT_DEFAULT: int = 1 @@ -91,7 +90,6 @@ def _build_cooccurrence_graph( Returns: Grafo no dirigido con atributo ``weight``. """ - # Conteo de co-ocurrencias: par (ordenado) → conteo pair_count: dict[tuple[str, str], int] = defaultdict(int) for row in rows: @@ -104,7 +102,7 @@ def _build_cooccurrence_graph( pair_count[(a, b)] += 1 g: _Graph = nx.Graph() - for (a, b), weight in sorted(pair_count.items()): # orden determinista + for (a, b), weight in sorted(pair_count.items()): if weight >= min_weight: g.add_edge(a, b, weight=weight) @@ -167,18 +165,16 @@ def _build_shared_refs_graph( Returns: Grafo no dirigido con atributo ``weight``. """ - # Reusar el primitivo público: ítem → lista de paper_ids que lo contienen. item_to_papers = collect_item_to_papers(rows, id_col, list_col) pair_count: dict[tuple[str, str], int] = defaultdict(int) for papers in item_to_papers.values(): - # Ordenar para determinismo sorted_papers = sorted(set(papers)) for a, b in combinations(sorted_papers, 2): pair_count[(a, b)] += 1 g: _Graph = nx.Graph() - for (a, b), weight in sorted(pair_count.items()): # orden determinista + for (a, b), weight in sorted(pair_count.items()): if weight >= min_weight: g.add_edge(a, b, weight=weight) diff --git a/src/bib2graph/networks/spec.py b/src/bib2graph/networks/spec.py index af3ec61..6bdf423 100644 --- a/src/bib2graph/networks/spec.py +++ b/src/bib2graph/networks/spec.py @@ -142,7 +142,6 @@ def load_specs(path: str | Path) -> list[NetworkSpec]: try: specs.append(NetworkSpec(**entry)) except ValidationError as exc: - # Extraer el primer error para dar un mensaje accionable first_error = exc.errors()[0] field = ".".join(str(loc) for loc in first_error["loc"]) or "" msg = first_error["msg"] diff --git a/src/bib2graph/preprocessors/__init__.py b/src/bib2graph/preprocessors/__init__.py index 27de2e0..b355cc8 100644 --- a/src/bib2graph/preprocessors/__init__.py +++ b/src/bib2graph/preprocessors/__init__.py @@ -1,7 +1,7 @@ """preprocessors — normalización, thesaurus multilingüe y dedup fuzzy. Exporta ``Preprocessor`` y las funciones puras de normalización, thesaurus -y deduplicación fuzzy. +y deduplicación fuzzy, más la pipeline de ingesta automática. Las funciones de dedup (``deduplicate_authors``, ``deduplicate_keywords``) requieren el extra ``[dedup]`` (``uv sync --extra dedup``). El import del @@ -13,6 +13,18 @@ from __future__ import annotations from bib2graph.preprocessors.dedup import deduplicate_authors, deduplicate_keywords +from bib2graph.preprocessors.pipeline import ( + THRESHOLD_AUTHORS, + THRESHOLD_KEYWORDS, + normalize_and_dedup, +) from bib2graph.preprocessors.preprocessor import Preprocessor -__all__ = ["Preprocessor", "deduplicate_authors", "deduplicate_keywords"] +__all__ = [ + "THRESHOLD_AUTHORS", + "THRESHOLD_KEYWORDS", + "Preprocessor", + "deduplicate_authors", + "deduplicate_keywords", + "normalize_and_dedup", +] diff --git a/src/bib2graph/preprocessors/dedup.py b/src/bib2graph/preprocessors/dedup.py index 8ff5192..e6f8c2d 100644 --- a/src/bib2graph/preprocessors/dedup.py +++ b/src/bib2graph/preprocessors/dedup.py @@ -90,7 +90,6 @@ def union(a: str, b: str) -> None: if score >= threshold_100: union(va, vb) - # Agrupar por raíz groups: dict[str, set[str]] = {} for v in variants: root = find(v) @@ -209,19 +208,17 @@ def _deduplicate_col( rows = corpus.to_arrow().to_pylist() - # 1. Frecuencia de cada variante en el corpus freq = _compute_freq(rows, col) if not freq: # Sin variantes: corpus sin cambios return corpus, 0 - # 2. Variantes ordenadas (determinismo) + # ordenadas para determinismo byte a byte variants_sorted = sorted(freq.keys()) - # 3. Clusters por componentes conexos clusters = _build_clusters(variants_sorted, threshold) - # 4. Mapa variante → canónico + conteo de clusters no triviales + # solo los clusters con > 1 variante incrementan n_collapsed n_collapsed = 0 remap: dict[str, str] = {} for cluster in clusters: @@ -231,14 +228,11 @@ def _deduplicate_col( for v in cluster: remap[v] = canonical - # 5. Remapeo de filas remapped_rows = _remap_rows(rows, col, remap) - # 6. Construir Corpus nuevo new_table = pa.Table.from_pylist(remapped_rows, schema=CORPUS_SCHEMA) new_corpus = _Corpus.from_arrow(new_table) - # 7. Registrar PreprocRef en el Manifest rf_version = _rapidfuzz_version() preproc_ref = PreprocRef( name=preproc_name, diff --git a/src/bib2graph/preprocessors/pipeline.py b/src/bib2graph/preprocessors/pipeline.py new file mode 100644 index 0000000..0294e40 --- /dev/null +++ b/src/bib2graph/preprocessors/pipeline.py @@ -0,0 +1,74 @@ +"""preprocessors.pipeline — Punto de entrada único de la pipeline de preprocesamiento automático. + +Orquesta normalize + dedup_authors + dedup_keywords sobre el corpus completo +ya mergeado. Módulo neutral: sin I/O, sin Click, sin red. + +Callers: + - ``cli._ingest`` (ingesta: seed / chain / seed_from_bib) + - ``service.snapshot`` (restore) + +Ambas rutas importan ``normalize_and_dedup`` y los umbrales **desde aquí**, +garantizando que no pueden diverger (issue #175, ADR 0031). + +Fuente única: + ``THRESHOLD_AUTHORS`` y ``THRESHOLD_KEYWORDS`` son la fuente canónica. No + dupliques estos valores en ningún otro módulo; importalos desde acá. +""" + +from __future__ import annotations + +from datetime import UTC, datetime +from typing import TYPE_CHECKING + +if TYPE_CHECKING: + from bib2graph.corpus import Corpus + +#: Umbral de similitud para deduplicar variantes de autores. +#: ``rapidfuzz.fuzz.token_sort_ratio`` >= ``THRESHOLD_AUTHORS * 100`` → colapso. +THRESHOLD_AUTHORS: float = 0.92 + +#: Umbral de similitud para deduplicar variantes de keywords. +#: ``rapidfuzz.fuzz.token_sort_ratio`` >= ``THRESHOLD_KEYWORDS * 100`` → colapso. +THRESHOLD_KEYWORDS: float = 0.90 + + +def normalize_and_dedup( + corpus: Corpus, + *, + applied_at: datetime | None = None, +) -> Corpus: + """Aplica normalize + dedup_authors + dedup_keywords al corpus. + + Punto de entrada único para la ingesta automática. Se llama DESPUÉS de + ``Corpus.merge`` (corpus ya completo = existing + incoming), garantizando + deduplicación cross-biblioteca: el dedup ve toda la biblioteca acumulada, + no solo el lote entrante. + + Idempotente en contenido: re-correr sobre el mismo corpus produce el + mismo resultado (las tres operaciones son idempotentes). + + El thesaurus NO se aplica aquí; es un paso explícito del usuario + (``b2g build --thesaurus``). + + Args: + corpus: Corpus de entrada (no muta; semántica de valor). + Debe ser el corpus COMPLETO ya mergeado (existing + incoming). + applied_at: Timestamp de la operación para el ``PreprocRef``. La + frontera CLI inyecta un único ``datetime.now(UTC)`` por + invocación (R2). Si ``None``, se usa ``datetime.now(UTC)`` + (para uso como librería independiente). + + Returns: + Nuevo Corpus normalizado y deduplicado. + """ + from bib2graph.preprocessors.dedup import deduplicate_authors, deduplicate_keywords + from bib2graph.preprocessors.preprocessor import Preprocessor + + ts = applied_at if applied_at is not None else datetime.now(UTC) + preprocessor = Preprocessor() + + result = preprocessor.normalize(corpus, applied_at=ts) + result = deduplicate_authors(result, threshold=THRESHOLD_AUTHORS) + result = deduplicate_keywords(result, threshold=THRESHOLD_KEYWORDS) + + return result diff --git a/src/bib2graph/preprocessors/preprocessor.py b/src/bib2graph/preprocessors/preprocessor.py index d256c0a..15c349f 100644 --- a/src/bib2graph/preprocessors/preprocessor.py +++ b/src/bib2graph/preprocessors/preprocessor.py @@ -105,7 +105,6 @@ def apply_thesaurus( new_table = pa.Table.from_pylist(processed, schema=CORPUS_SCHEMA) new_corpus = Corpus.from_arrow(new_table) - # Params del registro: fuente del thesaurus y nº de aliases params: dict[str, str] = { "n_aliases": str(len(lookup)), "applied_at": ts.isoformat(), diff --git a/src/bib2graph/schemas.py b/src/bib2graph/schemas.py index 0854a82..f06d025 100644 --- a/src/bib2graph/schemas.py +++ b/src/bib2graph/schemas.py @@ -21,10 +21,6 @@ SCHEMA_VERSION = "1" -# --------------------------------------------------------------------------- -# ProvenanceEvent — fuente única del evento de procedencia (R1, ADR 0023) -# --------------------------------------------------------------------------- - class ProvenanceEvent(BaseModel): """Evento de procedencia de un paper en el Corpus. @@ -129,10 +125,6 @@ def dump_list(cls, events: list[ProvenanceEvent]) -> str: return json.dumps([e.to_dict() for e in events], ensure_ascii=False) -# --------------------------------------------------------------------------- -# Schema Arrow canónico — 23 columnas según API.md §1.1 -# --------------------------------------------------------------------------- - _LIST_STR = pa.list_(pa.string()) CORPUS_SCHEMA: pa.Schema = pa.schema( @@ -170,17 +162,11 @@ def dump_list(cls, events: list[ProvenanceEvent]) -> str: ] ) -# Columnas obligatoriamente no-nulas (nullable=False en el schema) _NON_NULLABLE_COLS: frozenset[str] = frozenset( {Col.ID, Col.TITLE, Col.IS_SEED, Col.CURATION_STATUS} ) -# --------------------------------------------------------------------------- -# Excepción de contrato -# --------------------------------------------------------------------------- - - class SchemaError(Exception): """Violación del schema canónico Arrow del Corpus. @@ -189,11 +175,6 @@ class SchemaError(Exception): """ -# --------------------------------------------------------------------------- -# Validación de tabla Arrow -# --------------------------------------------------------------------------- - - def validate_table(table: pa.Table) -> None: """Valida que ``table`` cumpla el schema canónico del Corpus. @@ -210,7 +191,6 @@ def validate_table(table: pa.Table) -> None: expected_fields = {f.name: f for f in CORPUS_SCHEMA} actual_fields = {f.name: f for f in table.schema} - # 1. Columnas presentes missing = set(expected_fields) - set(actual_fields) if missing: # Ordenar para mensajes deterministas @@ -220,7 +200,6 @@ def validate_table(table: pa.Table) -> None: f"El schema canónico exige {sorted(missing)}." ) - # 2. Tipos Arrow for name, expected_field in expected_fields.items(): actual_field = actual_fields[name] if not actual_field.type.equals(expected_field.type): @@ -230,7 +209,6 @@ def validate_table(table: pa.Table) -> None: f"se recibió {actual_field.type!s}." ) - # 3. No-nulos en columnas obligatorias for col_name in _NON_NULLABLE_COLS: if col_name in actual_fields: chunk = table.column(col_name) @@ -242,10 +220,6 @@ def validate_table(table: pa.Table) -> None: ) -# --------------------------------------------------------------------------- -# Modelo Pydantic v2 para validación de fila individual (add_paper) -# --------------------------------------------------------------------------- - _VALID_CURATION: frozenset[str] = frozenset( {CurationStatus.CANDIDATE, CurationStatus.ACCEPTED, CurationStatus.REJECTED} ) @@ -262,7 +236,6 @@ class PaperRow(BaseModel): ``tests/unit/test_schemas.py``). """ - # Obligatorios (no-nullable en Arrow) — mismo orden que CORPUS_SCHEMA id: str source_id: str | None = None doi: str | None = None @@ -298,11 +271,6 @@ def _curation_valida(cls, v: str) -> str: return v -# --------------------------------------------------------------------------- -# Paridad PaperRow ⇄ CORPUS_SCHEMA (verificada por test; R1 ADR 0023) -# --------------------------------------------------------------------------- - - def assert_schema_parity() -> None: """Verifica que ``PaperRow`` y ``CORPUS_SCHEMA`` tengan los mismos campos. diff --git a/src/bib2graph/service/__init__.py b/src/bib2graph/service/__init__.py index 5e3a981..4e153e3 100644 --- a/src/bib2graph/service/__init__.py +++ b/src/bib2graph/service/__init__.py @@ -14,6 +14,9 @@ (#156, sub-issue de la superficie CLI 0.10.0). - ``get_top`` — nodos centrales + pares de co-citación con título resuelto (#157, sub-issue de la superficie CLI 0.10.0). + - ``resolve_doi``, ``resolve_url`` — resolución inversa id→DOI/URL sin red + (#212, opción 1); criterio de derivación compartido con + ``networks/decorate.py`` vía ``doi_to_url`` de ``constants.py``. - ``accept_papers``, ``reject_papers``, ``curate_paper`` — escrituras del Hito G3 (ADR 0028). - ``resolve_dois`` — resolución DOI→source_id (ADR 0035). @@ -45,6 +48,8 @@ get_workspace, list_papers, list_rounds, + resolve_doi, + resolve_url, ) from bib2graph.service.resolve import resolve_dois @@ -71,5 +76,7 @@ "list_papers", "list_rounds", "reject_papers", + "resolve_doi", "resolve_dois", + "resolve_url", ] diff --git a/src/bib2graph/service/curate.py b/src/bib2graph/service/curate.py index 40fd2bb..fdd1b1b 100644 --- a/src/bib2graph/service/curate.py +++ b/src/bib2graph/service/curate.py @@ -31,9 +31,7 @@ from bib2graph.constants import Col, CurationStatus from bib2graph.service.errors import DataError, StoreError -# --------------------------------------------------------------------------- # Constantes CSV — fuente canónica (exportadas desde cli/ para compat) -# --------------------------------------------------------------------------- CURATE_CSV_FILENAME = "curacion.csv" @@ -71,11 +69,6 @@ VALID_SCOPES: frozenset[str] = frozenset({"candidates", "seeds", "all"}) -# --------------------------------------------------------------------------- -# Helper interno — abrir store para escritura -# --------------------------------------------------------------------------- - - def _open_writable(path: Path) -> Any: """Abre el store para escritura; falla accionable si está bloqueado. @@ -102,9 +95,7 @@ def _open_writable(path: Path) -> Any: ) from exc -# --------------------------------------------------------------------------- # Helpers internos — transformación de filas para el CSV -# --------------------------------------------------------------------------- def _authors_display(row: dict[str, Any]) -> str: @@ -209,7 +200,6 @@ def _filter_table_by_scope(table: Any, scope: str) -> Any: mask = table.column(Col.IS_SEED) return table.filter(mask) else: - # candidates: status == candidate AND NOT is_seed status_col = table.column(Col.CURATION_STATUS) is_candidate = pc.equal(status_col, CurationStatus.CANDIDATE) # type: ignore[attr-defined] is_seed_col = table.column(Col.IS_SEED) @@ -218,11 +208,6 @@ def _filter_table_by_scope(table: Any, scope: str) -> Any: return table.filter(mask) -# --------------------------------------------------------------------------- -# run_curate_dump -# --------------------------------------------------------------------------- - - def run_curate_dump( store_path: str | Path, *, @@ -289,11 +274,6 @@ def run_curate_dump( } -# --------------------------------------------------------------------------- -# run_curate_from_csv -# --------------------------------------------------------------------------- - - def run_curate_from_csv( store_path: str | Path, csv_path: str | Path, @@ -339,7 +319,7 @@ def run_curate_from_csv( ) rows: list[dict[str, str]] = [] - with open(csv_path, newline="", encoding="utf-8") as f: + with open(csv_path, newline="", encoding="utf-8-sig") as f: reader = csv.DictReader(f) fieldnames = set(reader.fieldnames or []) @@ -408,11 +388,6 @@ def run_curate_from_csv( } -# --------------------------------------------------------------------------- -# filter_corpus -# --------------------------------------------------------------------------- - - def filter_corpus( store_path: str | Path, *, @@ -515,11 +490,6 @@ def filter_corpus( } -# --------------------------------------------------------------------------- -# accept_papers -# --------------------------------------------------------------------------- - - def accept_papers( store_path: str | Path, ids: list[str], @@ -575,11 +545,6 @@ def accept_papers( } -# --------------------------------------------------------------------------- -# reject_papers -# --------------------------------------------------------------------------- - - def reject_papers( store_path: str | Path, ids: list[str], @@ -633,10 +598,6 @@ def reject_papers( } -# --------------------------------------------------------------------------- -# curate_paper — wrapper de un solo paper -# --------------------------------------------------------------------------- - _VALID_DECISIONS_STRICT = frozenset({"accepted", "rejected"}) diff --git a/src/bib2graph/service/envelope.py b/src/bib2graph/service/envelope.py index eefa750..5b71d91 100644 --- a/src/bib2graph/service/envelope.py +++ b/src/bib2graph/service/envelope.py @@ -23,7 +23,6 @@ from typing import Any -# Versión del contrato del envelope JSON. ENVELOPE_SCHEMA_VERSION = "1" diff --git a/src/bib2graph/service/errors.py b/src/bib2graph/service/errors.py index f1cee33..31f3643 100644 --- a/src/bib2graph/service/errors.py +++ b/src/bib2graph/service/errors.py @@ -21,10 +21,6 @@ import httpx -# --------------------------------------------------------------------------- -# Jerarquía de excepciones tipadas -# --------------------------------------------------------------------------- - class B2GError(Exception): """Base de todos los errores accionables de bib2graph.""" @@ -72,11 +68,6 @@ class StoreError(B2GError): code = "STORE_ERROR" -# --------------------------------------------------------------------------- -# Helper neutral de mapeo error→código (sin I/O) -# --------------------------------------------------------------------------- - - def code_for(exc: BaseException) -> int: """Devuelve el exit code correspondiente a una excepción. diff --git a/src/bib2graph/service/maturity.py b/src/bib2graph/service/maturity.py index 94e06b3..10bd041 100644 --- a/src/bib2graph/service/maturity.py +++ b/src/bib2graph/service/maturity.py @@ -74,7 +74,6 @@ def compute_maturity( table = corpus.to_arrow() - # Derivar curated: ≥1 paper con curation_status ∈ {accepted, rejected} curation_col = table.column(Col.CURATION_STATUS) accepted_mask = pc.equal(curation_col, CurationStatus.ACCEPTED) # type: ignore[attr-defined] rejected_mask = pc.equal(curation_col, CurationStatus.REJECTED) # type: ignore[attr-defined] diff --git a/src/bib2graph/service/reads.py b/src/bib2graph/service/reads.py index aeb434e..a80d30c 100644 --- a/src/bib2graph/service/reads.py +++ b/src/bib2graph/service/reads.py @@ -43,16 +43,14 @@ from pathlib import Path from typing import TYPE_CHECKING, Any -from bib2graph.constants import Col, NetworkKind +from bib2graph.constants import Col, NetworkKind, doi_to_url from bib2graph.service.errors import DataError, StoreError if TYPE_CHECKING: from bib2graph.workspace import Workspace -# --------------------------------------------------------------------------- # Helpers internos -# --------------------------------------------------------------------------- def _open_readonly(path: Path) -> Any: @@ -86,11 +84,6 @@ def _open_readonly(path: Path) -> Any: ) from exc -# --------------------------------------------------------------------------- -# 1. get_workspace -# --------------------------------------------------------------------------- - - def get_workspace(ws: Workspace) -> dict[str, Any]: """Lee el estado actual del workspace: nombre, loop_state, ronda y conteos. @@ -131,7 +124,6 @@ def get_workspace(ws: Workspace) -> dict[str, Any]: total = sum(counts.values()) - # Staleness de la cache de redes corpus = store.load() live_hash = compute_corpus_hash(corpus.to_arrow()) networks_cache_stale = ws.is_networks_cache_stale(live_hash) @@ -156,11 +148,6 @@ def get_workspace(ws: Workspace) -> dict[str, Any]: } -# --------------------------------------------------------------------------- -# 2. list_rounds -# --------------------------------------------------------------------------- - - def list_rounds(ws: Workspace) -> list[dict[str, Any]]: """Lista los snapshots sellados del workspace más la entrada "live". @@ -183,7 +170,6 @@ def list_rounds(ws: Workspace) -> list[dict[str, Any]]: # Snapshots sellados (helper read-only del Workspace; ronda = snapshot, B-G2-1) rounds: list[dict[str, Any]] = ws.list_snapshots() - # Entrada sintética para el corpus vivo store = _open_readonly(ws.library_path) loop_state = store.backend.loop_state() current_round = store.backend.loop_round() @@ -201,11 +187,6 @@ def list_rounds(ws: Workspace) -> list[dict[str, Any]]: return rounds -# --------------------------------------------------------------------------- -# 3. get_paper -# --------------------------------------------------------------------------- - - def get_paper(ws: Workspace, ident: str) -> dict[str, Any]: """Devuelve la fila completa del corpus para un paper. @@ -264,7 +245,6 @@ def get_paper(ws: Workspace, ident: str) -> dict[str, Any]: row = matching[0] - # Parsear provenance provenance_raw = row.get(Col.PROVENANCE) provenance: list[Any] = [] if provenance_raw: @@ -291,11 +271,6 @@ def get_paper(ws: Workspace, ident: str) -> dict[str, Any]: } -# --------------------------------------------------------------------------- -# 4. get_scent -# --------------------------------------------------------------------------- - - def get_scent(ws: Workspace, paper_id: str) -> dict[str, Any]: """Devuelve el score de acoplamiento real de un paper con el corpus. @@ -330,7 +305,6 @@ def get_scent(ws: Workspace, paper_id: str) -> dict[str, Any]: table = corpus.to_arrow() rows = table.to_pylist() - # Verificar que el paper exista matching = [r for r in rows if str(r.get(Col.ID)) == paper_id] if not matching: raise DataError( @@ -340,18 +314,14 @@ def get_scent(ws: Workspace, paper_id: str) -> dict[str, Any]: paper_row = matching[0] - # Índice inverso: referencia → [papers del corpus que la citan] ref_to_papers = collect_item_to_papers(rows, Col.ID, Col.REFERENCES_ID) - # Índice título por id para resolución legible id_to_title: dict[str, str | None] = { str(r.get(Col.ID)): str(r.get(Col.TITLE)) if r.get(Col.TITLE) else None for r in rows if r.get(Col.ID) } - # Coupling: papers del corpus que comparten al menos una referencia con paper_id. - # Construimos un mapa {paper_id_vecino → peso (refs compartidas)}. paper_refs: list[str] = list(paper_row.get(Col.REFERENCES_ID) or []) coupling_weights: dict[str, int] = {} for ref in paper_refs: @@ -372,10 +342,8 @@ def get_scent(ws: Workspace, paper_id: str) -> dict[str, Any]: for pid, w in sorted(coupling_weights.items(), key=lambda kv: (-kv[1], kv[0])) ] - # Score = nº de corpus-papers con los que comparte al menos 1 referencia score = len(coupling_weights) - # References resueltas: references_id del paper que están en el corpus corpus_ids: set[str] = set(id_to_title.keys()) references = [ {"paper_id": ref_id, "title": id_to_title.get(ref_id)} @@ -383,7 +351,6 @@ def get_scent(ws: Workspace, paper_id: str) -> dict[str, Any]: if ref_id is not None and str(ref_id) in corpus_ids ] - # Cited_by resueltos: cited_by_id del paper que están en el corpus paper_cited_by: list[str] = list(paper_row.get(Col.CITED_BY_ID) or []) cited_by = [ {"paper_id": cid, "title": id_to_title.get(cid)} @@ -400,10 +367,6 @@ def get_scent(ws: Workspace, paper_id: str) -> dict[str, Any]: } -# --------------------------------------------------------------------------- -# 5. get_network -# --------------------------------------------------------------------------- - _VALID_KINDS: frozenset[str] = frozenset( { NetworkKind.BIBLIOGRAPHIC_COUPLING, @@ -476,22 +439,18 @@ def get_network(ws: Workspace, kind: str) -> dict[str, Any]: "label": attrs.get("label", str(node)), "degree_centrality": attrs.get("degree_centrality", 0.0), } - # Atributos opcionales de paper (solo para redes de paper) for optional_attr in ("community", "year", "is_seed", "curation_status"): if optional_attr in attrs: node_dict[optional_attr] = attrs[optional_attr] nodes.append(node_dict) - # Aristas edges = [ {"source": str(u), "target": str(v), "weight": data.get("weight", 1)} for u, v, data in graph.edges(data=True) ] - # Métricas base_metrics = network_metrics(graph) - # Número de comunidades distintas n_communities: int = 0 if artifact.communities: n_communities = len(set(artifact.communities.values())) @@ -512,11 +471,6 @@ def get_network(ws: Workspace, kind: str) -> dict[str, Any]: } -# --------------------------------------------------------------------------- -# 6. compare_rounds -# --------------------------------------------------------------------------- - - def compare_rounds(ws: Workspace, round_a: str, round_b: str) -> dict[str, Any]: """Compara dos snapshots sellados y devuelve el diff de papers y métricas. @@ -594,8 +548,6 @@ def _load_ids_and_metrics( } ] - # Métricas de redes por kind si ambos snapshots tienen metrics.json - # (solo para snapshots reales, no para "live") def _read_network_metrics(snapshot_id: str, kind: str) -> dict[str, Any] | None: # DIFERIDO (B-G2-3): hoy los snapshots NO materializan redes por kind # (corpus.snapshot() solo escribe corpus.parquet + manifest.json), así @@ -645,11 +597,6 @@ def _read_network_metrics(snapshot_id: str, kind: str) -> dict[str, Any] | None: } -# --------------------------------------------------------------------------- -# 7. list_papers (sub-issue #156 — grupo read) -# --------------------------------------------------------------------------- - - def list_papers( ws: Workspace, *, @@ -691,21 +638,17 @@ def list_papers( result: list[dict[str, Any]] = [] for row in rows: - # Filtro por query: substring CI sobre el título if query is not None: title_val = str(row.get(Col.TITLE) or "") if query.lower() not in title_val.lower(): continue - # Filtro por status (curation_status exacto) if status is not None and str(row.get(Col.CURATION_STATUS)) != status: continue - # Filtro por is_seed if is_seed is not None and bool(row.get(Col.IS_SEED)) != is_seed: continue - # Filtro por año exacto if year is not None: row_year = row.get(Col.YEAR) if row_year is None or int(row_year) != year: @@ -724,13 +667,8 @@ def list_papers( return {"papers": result, "count": len(result)} -# --------------------------------------------------------------------------- -# 8. corpus_stats (sub-issue #156 — grupo read) -# --------------------------------------------------------------------------- - _VALID_GROUP_BY: frozenset[str] = frozenset({"status", "year", "is_seed"}) -# Mapeo de alias CLI → nombre de columna SQL _GROUP_BY_COL: dict[str, str] = { "status": Col.CURATION_STATUS.value, "year": Col.YEAR.value, @@ -791,11 +729,6 @@ def corpus_stats( } -# --------------------------------------------------------------------------- -# 9. get_top (sub-issue #157 — read top) -# --------------------------------------------------------------------------- - - def get_top( ws: Workspace, *, @@ -854,7 +787,6 @@ def get_top( if n <= 0: raise DataError(f"top N debe ser un entero positivo; se recibió {n}.") - # Cargar corpus una vez para el índice id→título y para predict_build_preview store = _open_readonly(ws.library_path) corpus = store.load() table = corpus.to_arrow() @@ -864,9 +796,7 @@ def get_top( if r.get(Col.ID) } - # ------------------------------------------------------------------- # Bloque "central": top N nodos por degree_centrality en --kind - # ------------------------------------------------------------------- central_net = get_network(ws, kind) sorted_nodes = sorted( central_net["nodes"], @@ -889,9 +819,7 @@ def get_top( entry["community"] = node["community"] central.append(entry) - # ------------------------------------------------------------------- # Bloque "cocitation": top N pares por peso (SIEMPRE red cocitation) - # ------------------------------------------------------------------- coc_net = ( central_net if kind == NetworkKind.COCITATION @@ -951,3 +879,67 @@ def get_top( ) return result + + +# --------------------------------------------------------------------------- +# 10. resolve_doi / resolve_url (issue #212 — opción 1) +# --------------------------------------------------------------------------- + + +def resolve_doi(ws: Workspace, paper_id: str) -> str | None: + """Devuelve el DOI del paper identificado por ``paper_id``, o ``None``. + + Busca ``paper_id`` en ``Col.ID`` del corpus y devuelve el valor de + ``Col.DOI`` para esa fila. Devuelve ``None`` tanto si el id no existe + como si el paper no tiene DOI; no lanza ``DataError``. + + No toca la red: opera sobre el corpus ya cargado del workspace. + Criterio de derivación compartido con ``networks/decorate.py`` vía + ``doi_to_url`` en ``constants.py`` (fuente única, sin drift). + + Args: + ws: Workspace resuelto (ADR 0029). + paper_id: Valor de ``Col.ID`` del paper a resolver. + + Returns: + String DOI (sin prefijo URL) si el paper existe y tiene DOI; + ``None`` en cualquier otro caso. + + Raises: + StoreError: Si el store no existe o está bloqueado. + """ + store = _open_readonly(ws.library_path) + corpus = store.load() + table = corpus.to_arrow() + + ids = table.column(Col.ID).to_pylist() + dois = table.column(Col.DOI).to_pylist() + + for pid, doi in zip(ids, dois, strict=False): + if pid is not None and str(pid) == paper_id: + return str(doi) if doi else None + return None + + +def resolve_url(ws: Workspace, paper_id: str) -> str | None: + """Devuelve la URL canónica del paper identificado por ``paper_id``, o ``None``. + + Deriva ``https://doi.org/`` usando el mismo criterio que + ``networks/decorate.py``: solo cuando hay un DOI string no vacío. + Ambas funciones comparten ``doi_to_url`` de ``constants.py`` como + fuente única, sin drift. + + No toca la red: opera sobre el corpus ya cargado del workspace. + + Args: + ws: Workspace resuelto (ADR 0029). + paper_id: Valor de ``Col.ID`` del paper a resolver. + + Returns: + ``"https://doi.org/"`` si el paper existe y tiene DOI; + ``None`` en cualquier otro caso. + + Raises: + StoreError: Si el store no existe o está bloqueado. + """ + return doi_to_url(resolve_doi(ws, paper_id)) diff --git a/src/bib2graph/service/resolve.py b/src/bib2graph/service/resolve.py index 13de975..2fbd856 100644 --- a/src/bib2graph/service/resolve.py +++ b/src/bib2graph/service/resolve.py @@ -29,9 +29,7 @@ from bib2graph.constants import Col from bib2graph.service.errors import NetworkError, StoreError -# --------------------------------------------------------------------------- # Helper de normalización DOI (espeja el de openalex.py, función pura) -# --------------------------------------------------------------------------- def _normalize_doi(raw: str | None) -> str | None: @@ -46,11 +44,6 @@ def _normalize_doi(raw: str | None) -> str | None: return doi.lower() or None -# --------------------------------------------------------------------------- -# Helper interno — abrir store para escritura -# --------------------------------------------------------------------------- - - def _open_writable(path: Path) -> Any: """Abre el store para escritura; falla accionable si está bloqueado. @@ -77,11 +70,6 @@ def _open_writable(path: Path) -> Any: ) from exc -# --------------------------------------------------------------------------- -# _resolve_dois_on_store — núcleo puro que opera sobre un store ya abierto -# --------------------------------------------------------------------------- - - def _resolve_dois_on_store( store: Any, *, @@ -122,13 +110,9 @@ def _resolve_dois_on_store( from bib2graph.sources.openalex import OpenAlexSource corpus = store.load() - # Convertir a lista de dicts para filtrado Python puro rows = corpus.to_arrow().to_pylist() total_papers = len(rows) - # Identificar papers con doi y con/sin source_id - # «tiene doi» = doi no nulo y no vacío - # «necesita resolver» = tiene doi Y source_id es nulo total_with_doi = sum(1 for r in rows if r.get(Col.DOI)) needs_resolve = [r for r in rows if r.get(Col.DOI) and r.get(Col.SOURCE_ID) is None] already_resolved = total_with_doi - len(needs_resolve) @@ -141,7 +125,6 @@ def _resolve_dois_on_store( "total_papers": total_papers, } - # Extraer DOIs normalizados a resolver dois_to_resolve: list[str] = [] for row in needs_resolve: doi_norm = _normalize_doi(row.get(Col.DOI)) @@ -156,7 +139,6 @@ def _resolve_dois_on_store( "total_papers": total_papers, } - # Llamar a OpenAlex para resolver DOI→source_id source = OpenAlexSource(email=email, transport=transport) try: doi_to_source_id = source.fetch_dois_to_openalex_ids(dois_to_resolve) @@ -174,7 +156,6 @@ def _resolve_dois_on_store( "total_papers": total_papers, } - # Actualizar source_id en las filas que correspondan resolved_count = 0 for row in rows: if row.get(Col.SOURCE_ID) is not None: @@ -187,7 +168,6 @@ def _resolve_dois_on_store( row[Col.SOURCE_ID] = doi_to_source_id[doi_norm] resolved_count += 1 - # Reconstruir la tabla con los source_id actualizados updated_table = pa.Table.from_pylist(rows, schema=CORPUS_SCHEMA) updated_corpus = Corpus.from_arrow(updated_table) backend_close = getattr(updated_corpus._backend, "close", None) @@ -208,11 +188,6 @@ def _resolve_dois_on_store( } -# --------------------------------------------------------------------------- -# resolve_dois — punto de entrada público (abre y cierra su propio store) -# --------------------------------------------------------------------------- - - def resolve_dois( store_path: str | Path, *, diff --git a/src/bib2graph/service/snapshot.py b/src/bib2graph/service/snapshot.py index d76892b..9e9f31a 100644 --- a/src/bib2graph/service/snapshot.py +++ b/src/bib2graph/service/snapshot.py @@ -19,83 +19,13 @@ from __future__ import annotations -from datetime import UTC, datetime +from datetime import datetime from pathlib import Path from typing import Any -from bib2graph.service.errors import DataError, StoreError - -# Umbrales fijos del auto-preproc (ADR 0031, espejo de cli/_ingest.py). -# Fuente canónica: cli/_ingest.py. Si se cambian allí, actualizar acá también. -_THRESHOLD_AUTHORS: float = 0.92 -_THRESHOLD_KEYWORDS: float = 0.90 - - -# --------------------------------------------------------------------------- -# Helper interno — abrir store para escritura -# --------------------------------------------------------------------------- - - -def _open_store(path: Path) -> Any: - """Abre (o crea) el DuckDBStore en ``path`` para escritura. - - Args: - path: Ruta al archivo ``.duckdb``. - - Returns: - ``DuckDBStore`` abierto y listo para leer/escribir. - - Raises: - StoreError: Si el store está bloqueado o no se puede abrir. - """ - from bib2graph.backends.duckdb import StoreLockedError - from bib2graph.stores.duckdb import DuckDBStore - - try: - return DuckDBStore(path) - except StoreLockedError as exc: - raise StoreError(str(exc)) from exc - except OSError as exc: - raise StoreError( - f"No se puede abrir el store '{path}': {exc}. " - "Verificá que el archivo no esté bloqueado por otro proceso." - ) from exc - - -# --------------------------------------------------------------------------- -# Helper interno — normalize + dedup (espejo neutral de cli._ingest) -# --------------------------------------------------------------------------- - - -def _normalize_and_dedup(corpus: Any, *, applied_at: datetime | None) -> Any: - """Aplica normalize + dedup_authors + dedup_keywords al corpus. - - Espejo neutral de ``cli._ingest.normalize_and_dedup``. No importa de - ``cli/`` para mantener la capa de servicios independiente del adaptador - Click. Los umbrales son los mismos que en ``cli/_ingest.py`` (ADR 0031). - - Args: - corpus: Corpus completo ya mergeado (existing + incoming). - applied_at: Timestamp de la operación (R2). ``None`` usa - ``datetime.now(UTC)`` internamente (para uso como librería). - - Returns: - Nuevo Corpus normalizado y deduplicado. - """ - from bib2graph.preprocessors.dedup import deduplicate_authors, deduplicate_keywords - from bib2graph.preprocessors.preprocessor import Preprocessor - - ts = applied_at if applied_at is not None else datetime.now(UTC) - preprocessor = Preprocessor() - result = preprocessor.normalize(corpus, applied_at=ts) - result = deduplicate_authors(result, threshold=_THRESHOLD_AUTHORS) - result = deduplicate_keywords(result, threshold=_THRESHOLD_KEYWORDS) - return result - - -# --------------------------------------------------------------------------- -# run_snapshot -# --------------------------------------------------------------------------- +from bib2graph.preprocessors.pipeline import normalize_and_dedup +from bib2graph.service.errors import DataError +from bib2graph.service.store import open_store as _open_store def run_snapshot( @@ -134,11 +64,6 @@ def run_snapshot( } -# --------------------------------------------------------------------------- -# run_restore -# --------------------------------------------------------------------------- - - def run_restore( store_path: str | Path, corpus_path: str | Path, @@ -230,7 +155,7 @@ def run_restore( # Merge primero, dedup después sobre el corpus COMPLETO (fix bug cross-biblioteca). # El reloj se fija UNA vez por invocación (R2): pasado via decided_at. merged = existing.merge(incoming) - merged_deduped = _normalize_and_dedup(merged, applied_at=decided_at) + merged_deduped = normalize_and_dedup(merged, applied_at=decided_at) papers_loaded = len(incoming) total_papers = len(merged_deduped) merged_backend_close = getattr(merged_deduped._backend, "close", None) diff --git a/src/bib2graph/service/store.py b/src/bib2graph/service/store.py new file mode 100644 index 0000000..5b82ab9 --- /dev/null +++ b/src/bib2graph/service/store.py @@ -0,0 +1,53 @@ +"""service.store — Helper neutral para abrir DuckDBStore. + +Sin Click, sin print, sin sys.exit. Capa de servicios neutral (ADR 0028). + +Callers: + - ``service.snapshot`` (run_snapshot / run_restore) + - ``cli._store`` (re-exporta ``open_store`` para que los comandos CLI + y los tests que importan desde allí sigan funcionando) + +Este módulo es la fuente canónica de ``open_store`` (issue #175): evita la +duplicación que existía entre ``cli/_store.py`` y ``service/snapshot.py``. +""" + +from __future__ import annotations + +from pathlib import Path +from typing import Any + +from bib2graph.service.errors import StoreError + + +def open_store(path: str | Path) -> Any: + """Abre (o crea) el DuckDBStore en ``path`` para escritura/lectura. + + Captura ``StoreLockedError`` (subclase de ``OSError``) y lo re-lanza + como ``StoreError`` (exit 5). + + Uso: operaciones de ESCRITURA (seed, chain, filter, build, accept, reject, + snapshot, restore) o lectura desde ``service/``. Los comandos CLI de + SOLO LECTURA deben usar ``cli._store.open_store_readonly`` para no + auto-crear el store ante un typo. + + Args: + path: Ruta al archivo ``.duckdb``. + + Returns: + ``DuckDBStore`` abierto y listo para usar. + + Raises: + StoreError: Si el archivo está bloqueado o no se puede abrir. + """ + from bib2graph.backends.duckdb import StoreLockedError + from bib2graph.stores.duckdb import DuckDBStore + + try: + return DuckDBStore(path) + except StoreLockedError as exc: + raise StoreError(str(exc)) from exc + except OSError as exc: + raise StoreError( + f"No se puede abrir el store '{path}': {exc}. " + "Verificá que el archivo no esté bloqueado por otro proceso." + ) from exc diff --git a/src/bib2graph/sources/bibtex.py b/src/bib2graph/sources/bibtex.py index 95a488f..2e1e8c4 100644 --- a/src/bib2graph/sources/bibtex.py +++ b/src/bib2graph/sources/bibtex.py @@ -96,7 +96,6 @@ def _entry_to_row( _venue_raw = entry.get("journal") or entry.get("booktitle") venue = str(_venue_raw) if _venue_raw else None - # Año: convertir a int si es posible raw_year = entry.get("year") year: int | None = None if raw_year: @@ -105,7 +104,6 @@ def _entry_to_row( except ValueError: year = None - # DOI: normalizar quitando prefijo URL raw_doi = str(entry.get("doi") or "") doi: str | None = None if raw_doi: @@ -116,7 +114,6 @@ def _entry_to_row( break doi = d.lower() or None - # Provenance provenance_event = ProvenanceEvent( action="seeded", equation_id=None, @@ -258,7 +255,6 @@ def load(self, path: str) -> Corpus: # R5: bulk load — construir la tabla Arrow de una vez y usar from_arrow # en vez del loop add_paper/clone que era O(n²). - # Pre-computar ids (D1) antes de armar la tabla. rows_complete = _rows_with_ids(rows) if rows else [] if rows_complete: table = pa.Table.from_pylist(rows_complete, schema=CORPUS_SCHEMA) diff --git a/src/bib2graph/sources/openalex.py b/src/bib2graph/sources/openalex.py index 29bc311..c49abf7 100644 --- a/src/bib2graph/sources/openalex.py +++ b/src/bib2graph/sources/openalex.py @@ -39,9 +39,7 @@ from .base import SeedResult -# --------------------------------------------------------------------------- # Constantes internas -# --------------------------------------------------------------------------- _BASE_URL = "https://api.openalex.org" _FIELDS = ",".join( @@ -86,9 +84,7 @@ ) -# --------------------------------------------------------------------------- # Traducción de ecuación (función pura, sin I/O) -# --------------------------------------------------------------------------- def _translate( @@ -138,7 +134,6 @@ def _translate( if native: return query, ["query nativa OpenAlex, sin traducción"] - # Detectar límites y acumular reporte if _RE_NEAR.search(query): report.append( "Límite ADR-0007: NEAR/n no soportado en OpenAlex; " @@ -163,7 +158,6 @@ def _translate( # en el filtro de OpenAlex (un `"` embebido cierra la frase antes de tiempo). terms = [t.strip().replace('"', "") for t in (exclude or []) if t and t.strip()] - # Construir el cuerpo interno: (query) [AND NOT "t1" AND NOT "t2" ...] body = f"({query})" if terms: not_clauses = " ".join(f'AND NOT "{t}"' for t in terms) @@ -174,11 +168,8 @@ def _translate( + ". Cláusulas AND NOT añadidas al filtro de OpenAlex." ) - # Envolver UNA sola vez en el campo de OpenAlex (PASSTHROUGH) executed = f"title_and_abstract.search:{body}" - # Filtro de año: sintaxis idiomática de rango de OpenAlex. - # Las cláusulas se combinan con AND junto al resto del filtro. year_clauses: list[str] = [] if min_year is not None: year_clauses.append(f"from_publication_date:{min_year}-01-01") @@ -200,9 +191,7 @@ def _translate( return executed, report -# --------------------------------------------------------------------------- # Helpers de mapeo JSON → fila del Corpus -# --------------------------------------------------------------------------- def _reconstruct_abstract(inv_index: dict[str, list[int]] | None) -> str | None: @@ -292,11 +281,9 @@ def _work_to_row( Returns: Dict con todas las columnas del schema canónico. """ - # --- Identificadores --- openalex_id = _oa_id_short(work.get("id")) doi = _normalize_doi(work.get("doi")) - # --- Autores y afiliaciones --- authorships: list[dict[str, Any]] = work.get("authorships") or [] authors_raw: list[str] = [] authors_id: list[str] = [] @@ -312,13 +299,11 @@ def _work_to_row( _oa_id_short(author.get("orcid") or author.get("id")) or name or "unknown" ) authors_id.append(au_id) - # Afiliaciones per-autor for inst in authorship.get("institutions") or []: country = (inst.get("country_code") or "").upper() or "??" inst_name = inst.get("display_name") or "?" authors_affiliations.append(f"{inst_name} ({country})") - # --- Instituciones únicas --- institutions_raw: list[str] = [] institutions_id: list[str] = [] seen_inst: set[str] = set() @@ -332,7 +317,6 @@ def _work_to_row( institutions_raw.append(inst_name) institutions_id.append(inst_id) - # --- Keywords --- kws: list[dict[str, Any]] = work.get("keywords") or [] keywords_raw = [k.get("display_name", "") for k in kws if k.get("display_name")] keywords_id = [ @@ -341,19 +325,16 @@ def _work_to_row( if k.get("id") or k.get("display_name") ] - # --- Referencias (``referenced_works`` = URLs de OpenAlex) --- ref_urls: list[str] = work.get("referenced_works") or [] references_id = [_oa_id_short(r) for r in ref_urls if r] # Filtra posibles None (aunque _oa_id_short solo devuelve None si la URL # es vacía, lo cual no ocurre en la lista anterior) references_id_clean: list[str] = [r for r in references_id if r] - # --- Venue / source --- primary_loc: dict[str, Any] = work.get("primary_location") or {} loc_source: dict[str, Any] = primary_loc.get("source") or {} venue = loc_source.get("display_name") - # --- Provenance (evento inicial) --- provenance_event = ProvenanceEvent( action=action, equation_id=equation_id, @@ -391,11 +372,6 @@ def _work_to_row( } -# --------------------------------------------------------------------------- -# OpenAlexSource -# --------------------------------------------------------------------------- - - class OpenAlexSource: """Siembra un ``Corpus`` desde la API de OpenAlex. @@ -439,9 +415,7 @@ def __init__( self._max_results = max_results self._transport = transport - # ------------------------------------------------------------------ # Construcción del cliente httpx - # ------------------------------------------------------------------ def _client(self) -> httpx.Client: """Construye el cliente httpx con las credenciales inyectadas. @@ -468,9 +442,7 @@ def _client(self) -> httpx.Client: params=params, ) - # ------------------------------------------------------------------ # Paginación con cursor - # ------------------------------------------------------------------ def _fetch_all(self, filter_str: str) -> tuple[list[dict[str, Any]], str | None]: """Recupera works de OpenAlex paginando con cursor. @@ -524,9 +496,7 @@ def _fetch_all(self, filter_str: str) -> tuple[list[dict[str, Any]], str | None] return works[: self._max_results], openalex_version or fetched_at - # ------------------------------------------------------------------ # API pública - # ------------------------------------------------------------------ def seed( self, @@ -600,7 +570,6 @@ def seed( ], } ) - # Sustituir el manifest en el corpus usando la API pública result_corpus = corpus.with_manifest(updated_manifest) return SeedResult( @@ -679,11 +648,9 @@ def fetch_citing(self, openalex_id: str) -> list[dict[str, Any]]: fetched_at = datetime.now(UTC).isoformat() equation_id = f"chaining:forward:{openalex_id}" - # R5: retry/backoff ante 429/5xx works, _ = self._fetch_all_with_retry(filter_str) rows: list[dict[str, Any]] = [] for work in works: - # is_seed=False: los citantes son candidatos, no semillas. # La provenance se sobreescribe para agregar chaining_hop=1 (no # soportado como parámetro de _work_to_row: es específico de fetch_citing). row = _work_to_row( @@ -738,7 +705,6 @@ def fetch_dois_for(self, ids: list[str]) -> dict[str, str]: if not ids: return {} - # Normalizar IDs a la forma corta (W...) por si vienen como URL normalized = [_oa_id_short(i) or i for i in ids] resultado: dict[str, str] = {} @@ -746,7 +712,6 @@ def fetch_dois_for(self, ids: list[str]) -> dict[str, str]: for start in range(0, len(normalized), batch_size): lote = normalized[start : start + batch_size] - # Filtro OR de OpenAlex: openalex_id:W1|W2|... filter_str = "openalex_id:" + "|".join(lote) # Usamos el cliente directamente con select acotado (id + doi) @@ -792,9 +757,7 @@ def fetch_dois_to_openalex_ids(self, dois: list[str]) -> dict[str, str]: if not dois: return {} - # Normalizar DOIs de entrada (minúsculas, sin prefijo URL) normalized_dois = [_normalize_doi(d) for d in dois] - # Filtrar Nones de la normalización valid_dois = [d for d in normalized_dois if d] if not valid_dois: @@ -805,7 +768,6 @@ def fetch_dois_to_openalex_ids(self, dois: list[str]) -> dict[str, str]: for start in range(0, len(valid_dois), batch_size): lote = valid_dois[start : start + batch_size] - # Filtro OR de OpenAlex: doi:d1|d2|... filter_str = "doi:" + "|".join(lote) # Usamos el cliente directamente con select acotado (id + doi) @@ -857,7 +819,6 @@ def fetch_works_by_ids(self, ids: list[str]) -> Corpus: ) return Corpus.from_arrow(table) - # Normalizar IDs a la forma corta (W...) por si vienen como URL normalized = [_oa_id_short(i) or i for i in ids] fetched_at = datetime.now(UTC).isoformat() diff --git a/src/bib2graph/stores/duckdb.py b/src/bib2graph/stores/duckdb.py index 4535ed7..86a4474 100644 --- a/src/bib2graph/stores/duckdb.py +++ b/src/bib2graph/stores/duckdb.py @@ -39,10 +39,6 @@ def __init__(self, path: str | Path) -> None: # Abrir (o crear) el backend en disco; propaga StoreLockedError si bloqueado self._backend: DuckDBBackend = DuckDBBackend(path=self._path) - # ------------------------------------------------------------------ - # Store Protocol - # ------------------------------------------------------------------ - def persist(self, corpus: Corpus) -> None: """Persiste el corpus en la biblioteca viva (idempotente). @@ -98,10 +94,8 @@ def load(self) -> Corpus: {f.name: pa.array([], type=f.type) for f in CORPUS_SCHEMA}, schema=CORPUS_SCHEMA, ) - # Devolver un Corpus respaldado por el DuckDBBackend corpus = Corpus.from_arrow(table, backend=self._backend) - # #126: reconstruir manifest.filters desde filter_log raw_steps = self._backend.load_filter_steps() if raw_steps: filter_steps = [ @@ -116,7 +110,6 @@ def load(self) -> Corpus: new_manifest = corpus.manifest.model_copy(update={"filters": filter_steps}) corpus = corpus.with_manifest(new_manifest) - # #141: reconstruir manifest.enrichers desde enricher_log raw_refs = self._backend.load_enricher_refs() if raw_refs: enricher_refs = [ @@ -133,10 +126,6 @@ def load(self) -> Corpus: return corpus - # ------------------------------------------------------------------ - # Acceso al backend subyacente (CycleState, query SQL) - # ------------------------------------------------------------------ - def close(self) -> None: """Cierra la conexión DuckDB y libera el lock de archivo. diff --git a/src/bib2graph/workspace.py b/src/bib2graph/workspace.py index 76f9082..b00e78e 100644 --- a/src/bib2graph/workspace.py +++ b/src/bib2graph/workspace.py @@ -34,10 +34,6 @@ from pydantic import BaseModel, Field -# --------------------------------------------------------------------------- -# Manifest mínimo (marcador del workspace) -# --------------------------------------------------------------------------- - WORKSPACE_MANIFEST_FILE = "workspace.json" WORKSPACE_SCHEMA_VERSION = "1" LIBRARY_FILENAME = "library.duckdb" @@ -69,11 +65,6 @@ class WorkspaceManifest(BaseModel): schema_version: str = WORKSPACE_SCHEMA_VERSION -# --------------------------------------------------------------------------- -# Excepción propia del seam workspace -# --------------------------------------------------------------------------- - - class WorkspaceNotFoundError(Exception): """No se pudo resolver ningún workspace desde el contexto actual. @@ -95,10 +86,6 @@ class WorkspaceExistsError(Exception): """Ya existe un workspace.json en el directorio destino.""" -# --------------------------------------------------------------------------- -# Workspace -# --------------------------------------------------------------------------- - _DIRS = ("networks", "snapshots", "exports") @@ -131,10 +118,6 @@ def __init__( self._manifest = manifest self._source = source - # ------------------------------------------------------------------ - # Propiedades públicas - # ------------------------------------------------------------------ - @property def root(self) -> Path: """Carpeta raíz del workspace.""" @@ -173,10 +156,6 @@ def source(self) -> str: """ return self._source - # ------------------------------------------------------------------ - # Factory: init (scaffolding) - # ------------------------------------------------------------------ - @classmethod def init(cls, path: Path, name: str) -> Workspace: """Scaffolds una carpeta como workspace nuevo. @@ -225,10 +204,6 @@ def init(cls, path: Path, name: str) -> Workspace: source="init", ) - # ------------------------------------------------------------------ - # Factory: open (desde carpeta ya existente) - # ------------------------------------------------------------------ - @classmethod def open(cls, path: Path, *, source: str = "flag") -> Workspace: """Abre un workspace existente desde su carpeta raíz. @@ -260,10 +235,6 @@ def open(cls, path: Path, *, source: str = "flag") -> Workspace: source=source, ) - # ------------------------------------------------------------------ - # Factory: resolve (resolución ambiente completa) - # ------------------------------------------------------------------ - @classmethod def resolve( cls, @@ -301,27 +272,19 @@ def resolve( if cwd is None: cwd = Path.cwd() - # 1. --workspace explícito if workspace is not None: return cls.open(Path(workspace), source="flag") - # 2. Variable de entorno B2G_WORKSPACE env_ws = env.get("B2G_WORKSPACE") if env_ws: return cls.open(Path(env_ws), source="env") - # 3. Caminar hacia arriba desde cwd found = _walk_up(cwd) if found is not None: return cls.open(found, source="cwd") - # 4. Sin workspace → error accionable raise WorkspaceNotFoundError() - # ------------------------------------------------------------------ - # Representación - # ------------------------------------------------------------------ - def __repr__(self) -> str: return ( f"Workspace(root={self._root!r}, " @@ -434,11 +397,7 @@ def to_dict(self) -> dict[str, Any]: } -# --------------------------------------------------------------------------- # Helpers internos -# --------------------------------------------------------------------------- - - def _walk_up(start: Path) -> Path | None: """Camina hacia arriba desde ``start`` buscando un directorio con workspace.json. diff --git a/tests/unit/test_curate.py b/tests/unit/test_curate.py index ca89bac..228de2c 100644 --- a/tests/unit/test_curate.py +++ b/tests/unit/test_curate.py @@ -1038,3 +1038,56 @@ def test_round_trip_con_columnas_nuevas(tmp_path: Path) -> None: by_id = {r["id"]: r for r in corpus.to_arrow().to_pylist()} assert by_id["PA"]["curation_status"] == "accepted" assert by_id["PB"]["curation_status"] == "rejected" + + +# --------------------------------------------------------------------------- +# 26. BOM UTF-8 — curate apply tolera el BOM que agrega Excel-Windows (#238) +# --------------------------------------------------------------------------- + + +@pytest.mark.unit +@pytest.mark.parametrize( + "with_bom", + [False, True], + ids=["sin_bom", "con_bom"], +) +def test_from_csv_tolerates_utf8_bom(tmp_path: Path, with_bom: bool) -> None: + """run_curate_from_csv procesa correctamente CSV con y sin BOM UTF-8 (#238). + + Excel-Windows antepone EF BB BF al guardar CSV como UTF-8. Sin utf-8-sig + el header de la primera columna se lee como '\\ufeffid' en vez de 'id', + causando el falso error 'falta columna id'. + """ + from bib2graph.cli.commands.curate import CSV_COLUMNS, run_curate_from_csv + from bib2graph.stores.duckdb import DuckDBStore + + store_path = tmp_path / "test.duckdb" + rows = [_make_corpus_row(id="P1"), _make_corpus_row(id="P2")] + _seed_store(store_path, rows) + + encoding = "utf-8-sig" if with_bom else "utf-8" + csv_path = tmp_path / "decisions.csv" + with open(csv_path, "w", newline="", encoding=encoding) as f: + writer = csv.DictWriter(f, fieldnames=CSV_COLUMNS) + writer.writeheader() + writer.writerow( + {**{c: "" for c in CSV_COLUMNS}, "id": "P1", "decision": "accepted"} + ) + writer.writerow( + {**{c: "" for c in CSV_COLUMNS}, "id": "P2", "decision": "rejected"} + ) + + now = datetime.now(UTC) + result = run_curate_from_csv(store_path, csv_path, decided_at=now) + + assert result["accepted_count"] == 1 + assert result["rejected_count"] == 1 + assert result["skipped_count"] == 0 + assert result["not_found_count"] == 0 + + store = DuckDBStore(store_path) + corpus = store.load() + by_id = {r["id"]: r for r in corpus.to_arrow().to_pylist()} + store.close() + assert by_id["P1"]["curation_status"] == "accepted" + assert by_id["P2"]["curation_status"] == "rejected" diff --git a/tests/unit/test_decorate.py b/tests/unit/test_decorate.py index 873b093..c861ff6 100644 --- a/tests/unit/test_decorate.py +++ b/tests/unit/test_decorate.py @@ -1,12 +1,14 @@ -"""Tests de la capa decorate — issue #25. +"""Tests de la capa decorate — issue #25 y #209. Verifica: - ``decorate_graph`` inyecta ``label`` correcto por ``NetworkKind``. - Atributos ``year``/``is_seed``/``curation_status``/``degree_centrality`` presentes en nodos de paper. +- Atributos ``doi``/``url`` presentes en nodos de paper cuando hay DOI (#209). - Atributo ``community`` presente cuando se pasa ``communities``. - Round-trip GraphML: exportar grafo decorado → releer → nodos tienen ``label`` legible (no el id crudo). +- Round-trip CSV y GraphML incluyen ``doi``/``url`` cuando están presentes (#209). - Los proyectores siguen puros (sin ``label``) — la decoración es aparte. - Determinismo: mismo corpus → mismos atributos. @@ -23,6 +25,8 @@ from bib2graph.constants import NetworkKind from bib2graph.corpus import Corpus +from bib2graph.exporters.csv import CsvExporter +from bib2graph.exporters.graphml import GraphMLExporter from bib2graph.networks.decorate import LABEL_MAX_CHARS, decorate, decorate_graph from bib2graph.networks.facade import Networks from bib2graph.networks.projectors import ( @@ -471,3 +475,237 @@ def test_label_paper_truncado_si_titulo_largo() -> None: assert label.endswith("..."), f"label largo no truncado: {label!r}" # El label truncado tiene exactamente LABEL_MAX_CHARS chars + "..." assert len(label) == LABEL_MAX_CHARS + 3 + + +# --------------------------------------------------------------------------- +# doi / url en nodos de paper (#209) +# --------------------------------------------------------------------------- + + +def _make_table_con_doi() -> pa.Table: + """Tabla Arrow con un paper con DOI y otro sin DOI. + + Ambos comparten ``R_shared`` para que el acoplamiento bibliográfico cree + una arista entre ellos (los dos nodos quedan en el grafo). + """ + rows = [ + { + "id": "PDOI", + "source_id": None, + "doi": "10.1234/ejemplo.2024", + "title": "Paper con DOI", + "year": 2024, + "abstract": None, + "source": None, + "language": None, + "publisher": None, + "research_areas": None, + "is_seed": True, + "curation_status": "accepted", + "provenance": None, + "authors_raw": None, + "authors_id": None, + "authors_affiliations": None, + "keywords_raw": None, + "keywords_id": None, + "institutions_raw": None, + "institutions_id": None, + "references_id": ["R_shared", "R_a"], + "references_doi": None, + "cited_by_id": None, + }, + { + "id": "PNODOI", + "source_id": None, + "doi": None, + "title": "Paper sin DOI", + "year": 2023, + "abstract": None, + "source": None, + "language": None, + "publisher": None, + "research_areas": None, + "is_seed": True, + "curation_status": "candidate", + "provenance": None, + "authors_raw": None, + "authors_id": None, + "authors_affiliations": None, + "keywords_raw": None, + "keywords_id": None, + "institutions_raw": None, + "institutions_id": None, + "references_id": ["R_shared", "R_b"], + "references_doi": None, + "cited_by_id": None, + }, + ] + return pa.Table.from_pylist(rows, schema=CORPUS_SCHEMA) + + +@pytest.mark.unit +def test_doi_y_url_en_nodo_paper_con_doi() -> None: + """Nodo de paper con DOI → atributos ``doi`` y ``url`` correctos (#209).""" + table = _make_table_con_doi() + projector = BibliographicCouplingProjector() + g = projector.project(table) + assert "PDOI" in g.nodes, "PDOI debe estar en el grafo" + + decorate_graph(g, table, NetworkKind.BIBLIOGRAPHIC_COUPLING) + + attrs = g.nodes["PDOI"] + assert "doi" in attrs, "atributo doi ausente en nodo con DOI" + assert attrs["doi"] == "10.1234/ejemplo.2024" + assert "url" in attrs, "atributo url ausente en nodo con DOI" + assert attrs["url"] == "https://doi.org/10.1234/ejemplo.2024" + + +@pytest.mark.unit +def test_sin_doi_no_tiene_url_basura() -> None: + """Nodo de paper sin DOI NO debe tener atributos ``doi`` ni ``url`` (#209). + + Garantiza que no aparezca ``url = 'https://doi.org/None'`` ni un doi vacío. + """ + table = _make_table_con_doi() + projector = BibliographicCouplingProjector() + g = projector.project(table) + assert "PNODOI" in g.nodes, "PNODOI debe estar en el grafo" + + decorate_graph(g, table, NetworkKind.BIBLIOGRAPHIC_COUPLING) + + attrs = g.nodes["PNODOI"] + assert "doi" not in attrs, f"doi no debería estar en nodo sin DOI: {attrs!r}" + assert "url" not in attrs, f"url no debería estar en nodo sin DOI: {attrs!r}" + + +@pytest.mark.unit +def test_doi_no_se_inyecta_en_nodo_autor() -> None: + """Los atributos doi/url NO se inyectan en nodos de red de autores. + + Solo aplican a paper-kinds (bibliographic_coupling, cocitation). + """ + rows = [ + { + "id": "PA1", + "source_id": None, + "doi": "10.9999/autor.2024", + "title": "Autor compartido A", + "year": 2024, + "abstract": None, + "source": None, + "language": None, + "publisher": None, + "research_areas": None, + "is_seed": True, + "curation_status": "accepted", + "provenance": None, + "authors_raw": ["Juan Pérez"], + "authors_id": ["auth_shared"], + "authors_affiliations": None, + "keywords_raw": None, + "keywords_id": None, + "institutions_raw": None, + "institutions_id": None, + "references_id": None, + "references_doi": None, + "cited_by_id": None, + }, + { + "id": "PA2", + "source_id": None, + "doi": "10.9999/autor.2025", + "title": "Autor compartido B", + "year": 2025, + "abstract": None, + "source": None, + "language": None, + "publisher": None, + "research_areas": None, + "is_seed": True, + "curation_status": "accepted", + "provenance": None, + "authors_raw": ["Juan Pérez", "Ana García"], + "authors_id": ["auth_shared", "auth_other"], + "authors_affiliations": None, + "keywords_raw": None, + "keywords_id": None, + "institutions_raw": None, + "institutions_id": None, + "references_id": None, + "references_doi": None, + "cited_by_id": None, + }, + ] + t = pa.Table.from_pylist(rows, schema=CORPUS_SCHEMA) + projector = AuthorCollaborationProjector() + g = projector.project(t) + assert g.number_of_nodes() > 0, "grafo de autores debe tener nodos" + + decorate_graph(g, t, NetworkKind.AUTHOR_COLLAB) + + for node in g.nodes(): + attrs = g.nodes[node] + assert "doi" not in attrs, ( + f"doi no debe estar en nodo de autor {node!r}: {attrs!r}" + ) + assert "url" not in attrs, ( + f"url no debe estar en nodo de autor {node!r}: {attrs!r}" + ) + + +@pytest.mark.unit +def test_export_csv_incluye_doi_url(tmp_path: Path) -> None: + """El CSV de un grafo decorado con DOIs incluye columnas doi y url (#209). + + CsvExporter es genérico: vuelca todos los atributos de nodo presentes. + Si decorate_graph inyecta doi/url, aparecen en nodos.csv. + """ + table = _make_table_con_doi() + projector = BibliographicCouplingProjector() + g = projector.project(table) + decorate_graph(g, table, NetworkKind.BIBLIOGRAPHIC_COUPLING) + + CsvExporter().export(g, {}, tmp_path) + + content = (tmp_path / "nodos.csv").read_text(encoding="utf-8-sig") + header = content.splitlines()[0] + assert "doi" in header, f"columna doi ausente en nodos.csv; header: {header!r}" + assert "url" in header, f"columna url ausente en nodos.csv; header: {header!r}" + + # El nodo con DOI tiene el valor correcto + assert "10.1234/ejemplo.2024" in content + assert "https://doi.org/10.1234/ejemplo.2024" in content + + +@pytest.mark.unit +def test_export_graphml_incluye_doi_url(tmp_path: Path) -> None: + """El GraphML de un grafo decorado con DOIs incluye atributos doi y url (#209). + + GraphMLExporter es genérico: escribe todos los atributos de nodo presentes. + """ + table = _make_table_con_doi() + projector = BibliographicCouplingProjector() + g = projector.project(table) + decorate_graph(g, table, NetworkKind.BIBLIOGRAPHIC_COUPLING) + + GraphMLExporter().export(g, {}, tmp_path) + + reloaded = nx.read_graphml(str(tmp_path / "network.graphml")) + + # El nodo con DOI tiene ambos atributos + assert "doi" in reloaded.nodes["PDOI"], ( + f"doi ausente en PDOI tras round-trip GraphML: {dict(reloaded.nodes['PDOI'])!r}" + ) + assert reloaded.nodes["PDOI"]["doi"] == "10.1234/ejemplo.2024" + assert "url" in reloaded.nodes["PDOI"], ( + f"url ausente en PDOI tras round-trip GraphML: {dict(reloaded.nodes['PDOI'])!r}" + ) + assert reloaded.nodes["PDOI"]["url"] == "https://doi.org/10.1234/ejemplo.2024" + + # El nodo sin DOI NO tiene url basura + assert "doi" not in reloaded.nodes["PNODOI"], ( + "doi no debería aparecer en PNODOI tras round-trip GraphML" + ) + assert "url" not in reloaded.nodes["PNODOI"], ( + "url no debería aparecer en PNODOI tras round-trip GraphML" + ) diff --git a/tests/unit/test_ingest.py b/tests/unit/test_ingest.py index 41c59ef..0dab1c5 100644 --- a/tests/unit/test_ingest.py +++ b/tests/unit/test_ingest.py @@ -777,3 +777,42 @@ def test_thesaurus_remapeo_no_acumula_canonicos(tmp_path: Path) -> None: f"El canónico v2 ('artificial intelligence') no está en la biblioteca. " f"Keywords: {kws_v2}." ) + + +# --------------------------------------------------------------------------- +# 10. Anti-drift: fuente única de umbrales y normalize_and_dedup (issue #175) +# --------------------------------------------------------------------------- + + +@pytest.mark.unit +def test_umbrales_vienen_del_modulo_neutral() -> None: + """THRESHOLD_AUTHORS y THRESHOLD_KEYWORDS viven en preprocessors.pipeline. + + Sella el invariante del issue #175: los umbrales tienen UN SOLO lugar + canónico (``preprocessors.pipeline``) para que ingest y snapshot restore + no puedan diverger silenciosamente. + """ + from bib2graph.preprocessors.pipeline import THRESHOLD_AUTHORS, THRESHOLD_KEYWORDS + + assert THRESHOLD_AUTHORS == 0.92, ( + f"THRESHOLD_AUTHORS cambió su valor canónico: {THRESHOLD_AUTHORS}" + ) + assert THRESHOLD_KEYWORDS == 0.90, ( + f"THRESHOLD_KEYWORDS cambió su valor canónico: {THRESHOLD_KEYWORDS}" + ) + + +@pytest.mark.unit +def test_cli_ingest_reexporta_misma_funcion_que_modulo_neutral() -> None: + """cli._ingest.normalize_and_dedup ES el mismo objeto que preprocessors.pipeline. + + Si alguien re-introduce una copia local en cli/_ingest.py (en vez de + re-exportar), este test falla — protección contra regresión de drift. + """ + from bib2graph.cli._ingest import normalize_and_dedup as nd_ingest + from bib2graph.preprocessors.pipeline import normalize_and_dedup as nd_pipeline + + assert nd_ingest is nd_pipeline, ( + "cli._ingest.normalize_and_dedup debe ser el mismo objeto que " + "preprocessors.pipeline.normalize_and_dedup — no una copia local." + ) diff --git a/tests/unit/test_service_reads.py b/tests/unit/test_service_reads.py index afe561a..c306ac2 100644 --- a/tests/unit/test_service_reads.py +++ b/tests/unit/test_service_reads.py @@ -39,6 +39,7 @@ def _row( year: int = 2020, is_seed: bool = True, curation_status: str = "candidate", + doi: str | None = None, references_id: list[str] | None = None, cited_by_id: list[str] | None = None, ) -> dict[str, Any]: @@ -46,7 +47,7 @@ def _row( return { "id": id, "openalex_id": None, - "doi": None, + "doi": doi, "title": title, "year": year, "abstract": None, @@ -545,3 +546,132 @@ def test_get_scent_paper_inexistente_lanza_dataerror(tmp_path: Path) -> None: # Neutralidad de transporte de service.reads: consolidada en # test_service.py::test_service_modulo_neutral_de_transporte (epic #184). + + +# --------------------------------------------------------------------------- +# 5. resolve_doi / resolve_url (issue #212 — opción 1) +# --------------------------------------------------------------------------- + + +@pytest.mark.unit +def test_resolve_doi_con_doi(tmp_path: Path) -> None: + """resolve_doi devuelve el DOI desnudo cuando el paper existe y tiene DOI.""" + from bib2graph.service.reads import resolve_doi + + ws = _init_workspace(tmp_path) + _seed_store(ws, [_row(id="P1", doi="10.1234/test.001")]) + + result = resolve_doi(ws, "P1") + + assert result == "10.1234/test.001" + + +@pytest.mark.unit +def test_resolve_doi_sin_doi(tmp_path: Path) -> None: + """resolve_doi devuelve None cuando el paper existe pero no tiene DOI.""" + from bib2graph.service.reads import resolve_doi + + ws = _init_workspace(tmp_path) + _seed_store(ws, [_row(id="P1", doi=None)]) + + result = resolve_doi(ws, "P1") + + assert result is None + + +@pytest.mark.unit +def test_resolve_doi_doi_vacio_es_none(tmp_path: Path) -> None: + """resolve_doi trata un DOI cadena vacía ('') como ausente → None. + + Coherente con networks/decorate.py (que solo emite doi/url cuando el + DOI es truthy) y con resolve_url. Sella el contrato 'None en los 3 + casos' del issue #212. + """ + from bib2graph.service.reads import resolve_doi, resolve_url + + ws = _init_workspace(tmp_path) + _seed_store(ws, [_row(id="P1", doi="")]) + + assert resolve_doi(ws, "P1") is None + assert resolve_url(ws, "P1") is None + + +@pytest.mark.unit +def test_resolve_doi_id_inexistente(tmp_path: Path) -> None: + """resolve_doi devuelve None cuando el id no existe en el corpus (no lanza).""" + from bib2graph.service.reads import resolve_doi + + ws = _init_workspace(tmp_path) + _seed_store(ws, [_row(id="P1")]) + + result = resolve_doi(ws, "id-que-no-existe") + + assert result is None + + +@pytest.mark.unit +def test_resolve_url_con_doi(tmp_path: Path) -> None: + """resolve_url devuelve la URL bien formada cuando hay DOI.""" + from bib2graph.service.reads import resolve_url + + ws = _init_workspace(tmp_path) + _seed_store(ws, [_row(id="P1", doi="10.1234/test.001")]) + + result = resolve_url(ws, "P1") + + assert result == "https://doi.org/10.1234/test.001" + + +@pytest.mark.unit +def test_resolve_url_sin_doi(tmp_path: Path) -> None: + """resolve_url devuelve None cuando el paper existe pero no tiene DOI.""" + from bib2graph.service.reads import resolve_url + + ws = _init_workspace(tmp_path) + _seed_store(ws, [_row(id="P1", doi=None)]) + + result = resolve_url(ws, "P1") + + assert result is None + + +@pytest.mark.unit +def test_resolve_url_id_inexistente(tmp_path: Path) -> None: + """resolve_url devuelve None cuando el id no existe en el corpus (no lanza).""" + from bib2graph.service.reads import resolve_url + + ws = _init_workspace(tmp_path) + _seed_store(ws, [_row(id="P1")]) + + result = resolve_url(ws, "id-que-no-existe") + + assert result is None + + +@pytest.mark.unit +def test_resolve_url_criterio_consistente_con_decorate(tmp_path: Path) -> None: + """resolve_url usa el mismo criterio doi→url que networks/decorate.py. + + Ambos consumen doi_to_url de constants.py como fuente única. + Este test fija el contrato: mismo DOI → misma URL. + """ + from bib2graph.constants import doi_to_url + from bib2graph.service.reads import resolve_url + + doi = "10.9999/consistencia" + ws = _init_workspace(tmp_path) + _seed_store(ws, [_row(id="P1", doi=doi)]) + + # resolve_url debe coincidir con la derivación de doi_to_url directa + assert resolve_url(ws, "P1") == doi_to_url(doi) + + +@pytest.mark.unit +def test_resolve_doi_y_url_expuestos_en_service(tmp_path: Path) -> None: + """resolve_doi y resolve_url son importables desde bib2graph.service.""" + import bib2graph.service as svc + + assert hasattr(svc, "resolve_doi") + assert hasattr(svc, "resolve_url") + assert callable(svc.resolve_doi) + assert callable(svc.resolve_url) diff --git a/tests/unit/test_stores.py b/tests/unit/test_stores.py index b897031..21686a9 100644 --- a/tests/unit/test_stores.py +++ b/tests/unit/test_stores.py @@ -458,6 +458,44 @@ def test_persist_multifila_nueva_seq_determinista(tmp_path: Path) -> None: ) +@pytest.mark.integration +def test_persist_dup_colapsado_conserva_primera_aparicion(tmp_path: Path) -> None: + """Un id duplicado intercalado con filas nuevas conserva su PRIMERA aparición. + + Seguimiento #235 (hueco señalado por el verifier de #211): los tests de + orden cubrían filas nuevas sin duplicados; faltaba el caso combinado de un + id que reaparece DESPUÉS de filas nuevas. ``_dedup_merge_table`` registra + el orden solo en la primera aparición, así que el id colapsado debe quedar + en su posición inicial, no en la de su reaparición. + + Lote entrante: [A, B, A, C]. A reaparece en el índice 2 (después de B). + El orden D3 esperado es [A, B, C] (A en su primera posición); si la + deduplicación conservara la última aparición saldría [B, A, C] o similar. + """ + db_path = tmp_path / "lib_dup_ord.duckdb" + id_a = "oa:aaaa000000000001" + id_b = "oa:bbbb000000000002" + id_c = "oa:cccc000000000003" + + rows = [ + _make_row(id=id_a, title="A primera"), + _make_row(id=id_b, title="B nueva"), + _make_row(id=id_a, title="A reaparece"), + _make_row(id=id_c, title="C nueva"), + ] + corpus = _make_corpus(rows) + + store = DuckDBStore(db_path) + store.persist(corpus) + + loaded = store.load() + loaded_ids = loaded.to_arrow().column("id").to_pylist() + assert loaded_ids == [id_a, id_b, id_c], ( + f"El id colapsado debe conservar su primera aparición.\n" + f"Esperado: {[id_a, id_b, id_c]}\nObtenido: {loaded_ids}" + ) + + # --------------------------------------------------------------------------- # Benchmark de escala — upsert masivo (issue #211) # Marcado @slow: NO corre en el gate por defecto (-m "not network and not slow").