Data management plans (DMPs) are documents accompanying research proposals and project outputs. DMPs are created as textual narratives and describe the data and tools employed in scientific investigations.They are sometimes seen as an administrative exercise and not as an integral part of research practice. Machine Actionable DMPs (maDMPs) take the DMP concept further by using PIDs and PIDs services to connect all resources associated with a DMP.
This notebook displays all DMP statistics for an organisation, funder and/or data repository. By the end of this notebook, you will be able to succinctly display all the DMPs statistics for an organization, a funder and a repository. To demonstrate this we use the California Digital Library as Organization (https://ror.org/03yrm5c26) and the ** European Commision** as Funder (https://doi.org/10.13039/501100000780). In the summary statistics you will find a row for each DMP of the EC. Each row includes the title of the DMP, the PID, number of datasets and related publications, people involved, organizations and funders.
The process of displaying the DMP statistics is very simple. First, and after an initial setup, we fetch all we need from the DataCite GraphQL API. Then, we transform this data into a data structure that can be used for computation. Finally, we take the data transformation and supply it to a table.
%%capture
# Install required Python packages
!pip install dfply
import json
import pandas as pd
import numpy as np
from dfply import *
# Prepare the GraphQL client
import requests
from IPython.display import display, Markdown
from gql import gql, Client
from gql.transport.requests import RequestsHTTPTransport
_transport = RequestsHTTPTransport(
url='https://api.datacite.org/graphql',
use_json=True,
)
client = Client(
transport=_transport,
fetch_schema_from_transport=True,
)
import ipywidgets as widgets
f = widgets.Dropdown(
options=[('European Commission - ror.org/00k4n6c32', 'https://ror.org/00k4n6c32'), ('California Digital Library - ror.org/03yrm5c26','https://ror.org/03yrm5c26')],
value='https://ror.org/03yrm5c26',
description='Choose Organisation:',
disabled=False,
)
Dropdown(description='Choose Organisation:', index=1, options=(('European Commission - ror.org/00k4n6c32', 'ht…
display(f)
We obtain all the data from the DataCite GraphQL API.
# Generate the GraphQL query to retrieve up to 100 outputs of University of Oxford, with at least 100 views each.
repo_id = "cdl.cdl" if f.value == "https://ror.org/03yrm5c26" else "cern.zenodo"
funder_id = "https://doi.org/10.13039/100000141" if f.value == "https://ror.org/03yrm5c26" else "https://doi.org/10.13039/501100000780"
query_params = {
"rorId" : f.value,
"funderId" : funder_id,
"repositoryId" : repo_id
}
organizationQuery = gql("""query getOutputs($rorId: ID!)
{
organization(id: $rorId) {
name
dataManagementPlans(first: 10) {
totalCount
nodes {
id
title: titles(first: 1) {
title
}
datasets: citations(query:"types.resourceTypeGeneral:Dataset") {
totalCount
}
publications: citations(query:"types.resourceTypeGeneral:Text") {
totalCount
}
producer: contributors(contributorType: "Producer") {
id
title: name
}
funders: fundingReferences {
id: funderIdentifier
funderIdentifierType
title: funderName
}
people: creators {
id
name
}
contributors {
id
name
}
}
}
}
}
""")
funderQuery = gql("""query getOutputs($funderId: ID!)
{
funder(id: $funderId) {
name
dataManagementPlans(first: 10) {
totalCount
nodes {
id
title: titles(first: 1) {
title
}
datasets: citations(query:"types.resourceTypeGeneral:Dataset") {
totalCount
}
publications: citations(query:"types.resourceTypeGeneral:Text") {
totalCount
}
producer: contributors(contributorType: "Producer") {
id
title: name
}
funders: fundingReferences {
id: funderIdentifier
funderIdentifierType
title: funderName
}
people: creators {
id
name
}
contributors {
id
name
}
}
}
}
}
""")
repositoryQuery = gql("""query getOutputs($repositoryId: ID!)
{
repository(id: $repositoryId) {
name
dataManagementPlans(first: 10) {
totalCount
nodes {
id
title: titles(first: 1) {
title
}
datasets: citations(query:"types.resourceTypeGeneral:Dataset") {
totalCount
}
publications: citations(query:"types.resourceTypeGeneral:Text") {
totalCount
}
producer: contributors(contributorType: "Producer") {
id
title: name
}
funders: fundingReferences {
id: funderIdentifier
funderIdentifierType
title: funderName
}
people: creators {
id
name
}
contributors {
id
name
}
}
}
}
}
""")
def get_data(type):
if type == "organization":
return client.execute(organizationQuery, variable_values=json.dumps(query_params))["organization"]
elif type == "funder":
return client.execute(funderQuery, variable_values=json.dumps(query_params))["funder"]
else:
return client.execute(repositoryQuery, variable_values=json.dumps(query_params))["repository"]
Simple transformations are performed to convert the graphql response into an array that can be used. The final array is composed of the columns used in the DMP statistics.
def get_series_size(series_element):
return len(series_element)
def get_total(series_element):
if len(series_element) == 0:
return 0
return series_element['totalCount']
def dmp_header(row):
s = 'DMP: '+ row.dmp + '\r Funder: '+row.funders+'\r Producer: '+row.producer
return s
def get_dataset_nodes(series_element):
return series_element['nodes']
def get_title(series_element):
if len(series_element) == 0:
return "None"
return series_element[0]['title']
def transform_dmps(dataframe):
"""Modifies each item to include attributes needed for the node visulisation
Parameters:
dataframe (dataframe): A dataframe with all the itemss
parent (int): The id of the parent node
Returns:
dataframe:Returning vthe same dataframe with new attributes
"""
if (dataframe) is None:
return pd.DataFrame()
else:
return (dataframe >>
mutate(
DMP = X.title.apply(get_title),
doi = X.id,
NumDatasets = X.datasets.apply(get_total),
NumPublications = X.publications.apply(get_total),
Producer = X.producer.apply(get_title),
Funder = X.funders.apply(get_title),
NumPeople = (X.people + X.contributors).apply(get_series_size)
)
# >>
# mutate(
# header = dmp_header(X),
# )
# >>
# filter_by(
# X.hostingInstitution > 0
# )
)
def processTable(type):
data = get_data(type)
if len(data["dataManagementPlans"]['nodes']) == 0:
return None
else:
table = pd.DataFrame(data["dataManagementPlans"]['nodes'],columns=data["dataManagementPlans"]['nodes'][0].keys())
return transform_dmps(table)[list(('DMP', 'Funder', 'Producer', 'NumDatasets','NumPublications','NumPeople', 'doi'))].style.set_caption(data['name'])
The following three tables show the DMP Statistics for three different entities. Each of the tables includes the DMP title, its funding body, producer, host, and summary statistics about the number of datasets, publications, and people linked to the DMP. The first table displays DMP statistics that are hosted by the California Digital Library. The next table displays the statistics of DMPs funded by the European Commission. Finally, the last table shows the DMP statistics stored in the Zenodo Repository.
processTable("organization")
DMP | Funder | Producer | NumDatasets | NumPublications | NumPeople | doi | |
---|---|---|---|---|---|---|---|
0 | DMPRoadmap: Making Data Management Plans Actionable | National Science Foundation (NSF) | University Of California System | 0 | 0 | 4 | https://doi.org/10.48321/d1mw28 |
1 | LTREB: Drivers of temperate forest carbon storage from canopy closure through successional time | National Science Foundation (NSF) | University Of Michigan | 1 | 3 | 5 | https://doi.org/10.48321/d1h59r |
2 | Late Season Productivity, Carbon, and Nutrient Dynamics in a Changing Arctic | National Science Foundation (NSF) | Oregon State University | 0 | 0 | 5 | https://doi.org/10.48321/d17p4j |
3 | REU Site: A Multidisciplinary Research Experience in Engineered Bioactive Interfaces and Devices | National Science Foundation (NSF) | University Of Kentucky | 0 | 0 | 4 | https://doi.org/10.48321/d1cc7t |
4 | Brown carbon characterization | National Science Foundation (NSF) | College, Harvey Mudd | 0 | 2 | 3 | https://doi.org/10.48321/d13w2m |
5 | A Political Ecology of Value: A Cohort-Based Ethnography of the Environmental Turn in Nicaraguan Urban Social Policy | National Science Foundation (NSF) | Western Washington University | 0 | 2 | 3 | https://doi.org/10.48321/d10593 |
6 | Finding Levers for Privacy and Security by Design in Mobile Development | National Science Foundation (NSF) | University Of Maryland, College Park | 0 | 6 | 4 | https://doi.org/10.48321/d1vc75 |
7 | Use of telemetry and the Acoustic Wave Glider to study southern flounder migrations | National Science Foundation (NSF) | East Carolina University | 0 | 0 | 6 | https://doi.org/10.48321/d1kw2z |
8 | The Virgin Islands Partnership to Increase Participation and Engagement through Linked, Informal, Nurturing Experiences in STEM (V.I. PIPELINES) | National Science Foundation (NSF) | University Of The Virgin Islands | 0 | 0 | 7 | https://doi.org/10.48321/d1qp4w |
9 | DMP for The Role of Temperature in Regulating Herbivory and Algal Biomass in Upwelling Systems | National Science Foundation (NSF) | University Of North Carolina, Chapel Hill | 0 | 13 | 3 | https://doi.org/10.48321/d1g59f |
10 | Barriers to cross-shelf coral connectivity in the Florida Keys | National Science Foundation (NSF) | University Of Texas At Austin | 0 | 2 | 3 | https://doi.org/10.48321/d1bc7h |
11 | THE EFFECTS OF MASS INCARCERATION ON FAMILIES IN THE NATION’S CAPITAL | National Science Foundation (NSF) | University Of California, Merced | 0 | 0 | 3 | https://doi.org/10.48321/d13018 |
12 | EAGER: High-throughput, culture-independent technique identifying cyanobacteria infections to improve understanding of carbon biogeochemical cycling | National Science Foundation (NSF) | Johns Hopkins University | 0 | 0 | 3 | https://doi.org/10.48321/d1z59s |
13 | Development and Intercomparison of Methodologies to Measure Ferrous Iron in Seawater | National Science Foundation (NSF) | University Of Southern California | 0 | 0 | 3 | https://doi.org/10.48321/d1tg6h |
14 | Fundamentals of Quantum Materials Winter School and Workshop | National Science Foundation (NSF) | University Of Maryland, College Park | 0 | 0 | 6 | https://doi.org/10.48321/d1pp4k |
15 | Bolstering STEM with Scholarships and Mentoring Networks at an HSI | National Science Foundation (NSF) | New Mexico Institute Of Mining And Technology | 0 | 0 | 5 | https://doi.org/10.48321/d1k01m |
16 | CAREER: 4.5D Printing of Nickel Titanium Shape Memory Alloys | National Science Foundation (NSF) | Texas A&M University | 0 | 0 | 3 | https://doi.org/10.48321/d1f594 |
17 | Impacts of size-selective mortality on sex-changing fishes | Division of Ocean Sciences (nsf.gov) | Oregon State University | 0 | 4 | 4 | https://doi.org/10.48321/d1101n |
18 | Turbulence-spurred settlement: Deciphering a newly recognized class of larval response | Division of Ocean Sciences (nsf.gov) | San Francisco State University (Sfsu.Edu) | 0 | 4 | 6 | https://doi.org/10.48321/d14s38 |
19 | Collaborative Research: New Approaches to New Production | Division of Ocean Sciences (nsf.gov) | University Of Southern California (Usc.Edu) | 0 | 7 | 4 | https://doi.org/10.48321/d1w88t |
20 | Adaptations of fish and fishing communities to rapid climate change | Division of Ocean Sciences (nsf.gov) | University Of California, Santa Barbara (Ucsb.Edu) | 1 | 10 | 9 | https://doi.org/10.48321/d1h010 |
21 | Gene content, gene expression, and physiology in mesopelagic ammonia-oxidizing archaea | Division of Ocean Sciences (nsf.gov) | J. Craig Venter Institute (Jcvi.Org) | 0 | 1 | 4 | https://doi.org/10.48321/d1ms3m |
22 | Collaborative Research: Ocean Acidification and Coral Reefs: Scale Dependence and Adaptive Capacity | Division of Ocean Sciences (nsf.gov) | California State University, Northridge (Csun.Edu) | 1 | 11 | 8 | https://doi.org/10.48321/d1rg6w |
23 | Collaborative research: Quantifying the biological, chemical, and physical linkages between chemosynthetic communities and the surrounding deep sea | Division of Ocean Sciences (nsf.gov) | University Of California, San Diego (Ucsd.Edu) | 0 | 0 | 10 | https://doi.org/10.48321/d17g67 |
24 | Collaborative Research: Field test of larval behavior on transport and connectivity in an upwelling regime | Division of Ocean Sciences (nsf.gov) | University Of California, Davis (Ucdavis.Edu) | 0 | 0 | 6 | https://doi.org/10.48321/d1c885 |
25 | Collaborative Research: Dissolved organic matter feedbacks in coral reef resilience: The genomic & geochemical basis for microbial modulation of algal phase shifts | Division of Ocean Sciences (nsf.gov) | University Of Hawaii At Manoa (Manoa.Hawaii.Edu) | 0 | 10 | 6 | https://doi.org/10.48321/d1001b |
26 | Quantifying the potential for biogeochemical feedbacks to create 'refugia' from ocean acidification on tropical coral reefs | Division of Ocean Sciences (nsf.gov) | Carnegie Institution For Science (Carnegiescience.Edu) | 0 | 1 | 7 | https://doi.org/10.48321/d13s3z |
27 | Collaborative Research: Use of Triple Oxygen Isotopes and O2/Ar to constrain Net/Gross Oxygen Production during upwelling and non-upwelling periods in a Coastal Setting | Division of Ocean Sciences (nsf.gov) | King Abdullah University Of Science And Technology (Kaust.Edu.Sa) | 0 | 3 | 9 | https://doi.org/10.48321/d1v88h |
28 | The ProteOMZ Expedition: Investigating Life Without Oxygen in the Pacific Ocean | None | Woods Hole Oceanographic Institution (Whoi.Edu) | 0 | 1 | 4 | https://doi.org/10.48321/d1qg6k |
29 | Collaborative Research: Diatoms, Food Webs and Carbon Export - Leveraging NASA EXPORTS to Test the Role of Diatom Physiology in the Biological Carbon Pump | Division of Ocean Sciences (nsf.gov) | University Of California, Santa Barbara (Ucsb.Edu) | 0 | 0 | 6 | https://doi.org/10.48321/d1ks39 |
30 | Convergence: RAISE: Linking the adaptive dynamics of plankton with emergent global ocean biogeochemistry | Division of Ocean Sciences (nsf.gov) | University Of California, Irvine (Uci.Edu) | 1 | 10 | 11 | https://doi.org/10.48321/d1g01p |
processTable("funder")
--------------------------------------------------------------------------- Exception Traceback (most recent call last) <ipython-input-15-eabd4652c7f6> in <module> ----> 1 processTable("funder") <ipython-input-13-8a42c7904a5b> in processTable(type) 1 def processTable(type): ----> 2 data = get_data(type) 3 if len(data["dataManagementPlans"]['nodes']) == 0: 4 return None 5 else: <ipython-input-6-831c17256ef1> in get_data(type) 3 return client.execute(organizationQuery, variable_values=json.dumps(query_params))["organization"] 4 elif type == "funder": ----> 5 return client.execute(funderQuery, variable_values=json.dumps(query_params))["funder"] 6 else: 7 return client.execute(repositoryQuery, variable_values=json.dumps(query_params))["repository"] /usr/local/lib/python3.8/site-packages/gql/client.py in execute(self, document, *args, **kwargs) 50 result = self._get_result(document, *args, **kwargs) 51 if result.errors: ---> 52 raise Exception(str(result.errors[0])) 53 54 return result.data Exception: {'message': 'Record not found', 'path': ['funder'], 'extensions': {'code': 'DOWNSTREAM_SERVICE_ERROR', 'serviceName': 'client-api', 'query': 'query($funderId:ID!){funder(id:$funderId){name dataManagementPlans(first:50){totalCount nodes{id contributors{id name}title:titles(first:1){title}datasets:citations(query:"types.resourceTypeGeneral:Dataset"){totalCount}publications:citations(query:"types.resourceTypeGeneral:Text"){totalCount}producer:contributors(contributorType:"Producer"){id title:name}funders:fundingReferences{funderIdentifierType id:funderIdentifier title:funderName}people:creators{id name}}}}}', 'variables': {'funderId': 'https://doi.org/10.13039/100000141'}}}
processTable("repository")
DMP | Funder | Producer | Host | NumDatasets | NumPublications | NumPeople | doi | |
---|---|---|---|---|---|---|---|---|
0 | Periódicos técnicos | None | None | None | 0 | 0 | 1 | https://doi.org/10.5281/zenodo.2655759 |
1 | Periódicos técnicos | None | None | None | 0 | 0 | 1 | https://doi.org/10.5281/zenodo.2655758 |
2 | Fractional-order functions for solving fractional-order variational problems with boundary conditions | None | None | None | 0 | 0 | 2 | https://doi.org/10.5281/zenodo.2741388 |
3 | Fractional-order functions for solving fractional-order variational problems with boundary conditions | None | None | None | 0 | 0 | 2 | https://doi.org/10.5281/zenodo.2741387 |
4 | EURHISFIRM D1.2: Data Management Plan (first version) | European Commission | None | None | 0 | 0 | 3 | https://doi.org/10.5281/zenodo.3245354 |
5 | EURHISFIRM D1.2: Data Management Plan (first version) | European Commission | None | None | 0 | 0 | 3 | https://doi.org/10.5281/zenodo.3245353 |
6 | EURHISFIRM D1.7: Second Data Management Plan | European Commission | None | None | 0 | 0 | 5 | https://doi.org/10.5281/zenodo.3246339 |
7 | EURHISFIRM D1.7: Second Data Management Plan | European Commission | None | None | 0 | 0 | 5 | https://doi.org/10.5281/zenodo.3246338 |
8 | Example ezDMP output | None | None | None | 0 | 0 | 1 | https://doi.org/10.5281/zenodo.3247755 |
9 | Example ezDMP output | None | None | None | 0 | 0 | 1 | https://doi.org/10.5281/zenodo.3247756 |
10 | European Collaboration for Healthcare Optimisation (ECHO) Data Model Specification | European Commission | None | None | 0 | 0 | 8 | https://doi.org/10.5281/zenodo.3253683 |
11 | European Collaboration for Healthcare Optimisation (ECHO) Data Model Specification | European Commission | None | None | 0 | 0 | 8 | https://doi.org/10.5281/zenodo.3253684 |
12 | The data management plan of Alien-CSI | None | None | None | 0 | 0 | 12 | https://doi.org/10.5281/zenodo.3265764 |
13 | The data management plan of Alien-CSI | None | None | None | 0 | 0 | 12 | https://doi.org/10.5281/zenodo.3265765 |
14 | TANGO Data Management Plan Version 3 | None | None | None | 0 | 0 | 4 | https://doi.org/10.5281/zenodo.3349817 |
15 | TANGO Data Management Plan Version 4 | None | None | None | 0 | 0 | 4 | https://doi.org/10.5281/zenodo.3349816 |
16 | REEEM-D6.6_Data Management Plan (DMP) - Collection, processing and dissemination of data | European Commission | None | None | 0 | 0 | 1 | https://doi.org/10.5281/zenodo.3368558 |
17 | REEEM-D6.6_Data Management Plan (DMP) - Collection, processing and dissemination of data | European Commission | None | None | 0 | 0 | 1 | https://doi.org/10.5281/zenodo.3368557 |
18 | D6.5 Data Management Plan | European Commission | None | None | 0 | 0 | 1 | https://doi.org/10.5281/zenodo.3372460 |
19 | D6.5 Data Management Plan | European Commission | None | None | 0 | 0 | 1 | https://doi.org/10.5281/zenodo.3372459 |
20 | DMP test 1 | None | None | None | 0 | 0 | 1 | https://doi.org/10.5281/zenodo.3441880 |
21 | DMP test 1 | None | None | None | 0 | 0 | 1 | https://doi.org/10.5281/zenodo.3441879 |
22 | Data Management Plan | European Commission | None | None | 0 | 0 | 1 | https://doi.org/10.5281/zenodo.3446152 |
23 | Data Management Plan | European Commission | None | None | 0 | 0 | 1 | https://doi.org/10.5281/zenodo.3446151 |
24 | RECEIPT Data Management Plan | None | None | None | 0 | 0 | 1 | https://doi.org/10.5281/zenodo.3459695 |
25 | RECEIPT Data Management Plan | None | None | None | 0 | 0 | 1 | https://doi.org/10.5281/zenodo.3459696 |
26 | The European Qur'an. Islamic Scripture in European Culture and Religion 1150-1850. Horizon 2020 DMP (initial outline) | None | None | None | 0 | 0 | 2 | https://doi.org/10.5281/zenodo.3462464 |
27 | The European Qur'an. Islamic Scripture in European Culture and Religion 1150-1850. Horizon 2020 DMP (initial outline) | None | None | None | 0 | 0 | 2 | https://doi.org/10.5281/zenodo.3462465 |
28 | Interdependency_of_port_clusters_during_regional_disasters_FINAL_REPORT | None | None | None | 0 | 0 | 1 | https://doi.org/10.5281/zenodo.3466109 |
29 | Interdependency_of_port_clusters_during_regional_disasters_FINAL_REPORT | None | None | None | 0 | 0 | 1 | https://doi.org/10.5281/zenodo.3466108 |
30 | RECEIPT Data Management Plan | None | None | None | 0 | 0 | 1 | https://doi.org/10.5281/zenodo.3467621 |
31 | RECEIPT Data Management Plan | None | None | None | 0 | 0 | 1 | https://doi.org/10.5281/zenodo.3467620 |
32 | REEEM-D6.6_Data Management Plan (DMP) - Collection, processing and dissemination of data | European Commission | None | None | 0 | 0 | 1 | https://doi.org/10.5281/zenodo.3472765 |
33 | Data Management Plans at CERN | None | None | None | 0 | 0 | 1 | https://doi.org/10.5281/zenodo.3479129 |
34 | Data Management Plans at CERN | None | None | None | 0 | 0 | 1 | https://doi.org/10.5281/zenodo.3479128 |
35 | D7.2: Data Management Plan (1) | European Commission | None | None | 0 | 0 | 3 | https://doi.org/10.5281/zenodo.3492131 |
36 | D7.2: Data Management Plan (1) | European Commission | None | None | 0 | 0 | 3 | https://doi.org/10.5281/zenodo.3492130 |
37 | D7.3: Data Management Plan (2) | European Commission | None | None | 0 | 0 | 2 | https://doi.org/10.5281/zenodo.3492133 |
38 | D7.3: Data Management Plan (2) | European Commission | None | None | 0 | 0 | 2 | https://doi.org/10.5281/zenodo.3492132 |
39 | Testing a novel explanatory factor for the non-linearity between rainfall event magnitude-frequency and catchment erosion with HYDRALAB+ | European Commission | None | None | 0 | 0 | 2 | https://doi.org/10.5281/zenodo.3510132 |
40 | Testing a novel explanatory factor for the non-linearity between rainfall event magnitude-frequency and catchment erosion with HYDRALAB+ | European Commission | None | None | 0 | 0 | 2 | https://doi.org/10.5281/zenodo.3510131 |
41 | PatchFlow: Flow through emergent and submerged patches in wide shallow flow | European Commission | None | None | 0 | 0 | 2 | https://doi.org/10.5281/zenodo.3510197 |
42 | PatchFlow: Flow through emergent and submerged patches in wide shallow flow | European Commission | None | None | 0 | 0 | 2 | https://doi.org/10.5281/zenodo.3510196 |
43 | MoDEX: Morphological Diffusivity Experiment - controls on morphological diffusivity for innovative beach protection schemes | European Commission | None | None | 0 | 0 | 2 | https://doi.org/10.5281/zenodo.3510200 |
44 | MoDEX: Morphological Diffusivity Experiment - controls on morphological diffusivity for innovative beach protection schemes | European Commission | None | None | 0 | 0 | 2 | https://doi.org/10.5281/zenodo.3510201 |
45 | Smelling vortices: Animal tracking of chemical scents in turbulent, unidirectional flow | European Commission | None | None | 0 | 0 | 3 | https://doi.org/10.5281/zenodo.3510210 |
46 | Smelling vortices: Animal tracking of chemical scents in turbulent, unidirectional flow | European Commission | None | None | 0 | 0 | 3 | https://doi.org/10.5281/zenodo.3510211 |
47 | Data Management Plan for the MSCA project PlasmaSolution | European Commission | None | None | 0 | 0 | 3 | https://doi.org/10.5281/zenodo.3530163 |
48 | Data Management Plan for the MSCA project PlasmaSolution | European Commission | None | None | 0 | 0 | 3 | https://doi.org/10.5281/zenodo.3530162 |
49 | Planeación primer trimestre del tercer grado de primaria del estado de sonora. | None | None | None | 0 | 0 | 1 | https://doi.org/10.5281/zenodo.3533817 |