From d580e154424a8f211cf35ab1cae079f2624b8e44 Mon Sep 17 00:00:00 2001 From: Sandro La Bruzzo Date: Thu, 21 Apr 2022 11:06:08 +0200 Subject: [PATCH 1/8] Modified last intersection since we lost many titles. this is my last resource, after that, I've to change my job --- .../doiboost/SparkGenerateDoiBoost.scala | 37 +++++++++++++++++-- 1 file changed, 34 insertions(+), 3 deletions(-) diff --git a/dhp-workflows/dhp-doiboost/src/main/scala/eu/dnetlib/doiboost/SparkGenerateDoiBoost.scala b/dhp-workflows/dhp-doiboost/src/main/scala/eu/dnetlib/doiboost/SparkGenerateDoiBoost.scala index 79b9e8183..bc26e44d6 100644 --- a/dhp-workflows/dhp-doiboost/src/main/scala/eu/dnetlib/doiboost/SparkGenerateDoiBoost.scala +++ b/dhp-workflows/dhp-doiboost/src/main/scala/eu/dnetlib/doiboost/SparkGenerateDoiBoost.scala @@ -60,7 +60,7 @@ object SparkGenerateDoiBoost { val openaireOrganizationPath = parser.get("openaireOrganizationPath") val crossrefAggregator = new Aggregator[(String, Publication), Publication, Publication] with Serializable { - override def zero: Publication = new Publication + override def zero: Publication = null override def reduce(b: Publication, a: (String, Publication)): Publication = { @@ -177,12 +177,43 @@ object SparkGenerateDoiBoost { .map(DoiBoostMappingUtil.fixPublication) .map(p => (p.getId, p)) .groupByKey(_._1) - .agg(crossrefAggregator.toColumn) - .map(p => p._2) + .reduceGroups((left, right) => + { + //Check left is not null + if (left != null && left._1 != null) + { + //If right is null then return left + if (right == null || right._2 == null) + left + else { + // Here Left and Right are not null + // So we have to merge + val b1 = left._2 + val b2 = right._2 + b1.mergeFrom(b2) + b1.mergeOAFDataInfo(b2) + val authors = AuthorMerger.mergeAuthor(b1.getAuthor, b2.getAuthor) + b1.setAuthor(authors) + if (b2.getId != null && b2.getId.nonEmpty) + b1.setId(b2.getId) + //Return publication Merged + (b1.getId, b1) + } + } + else { + // Left is Null so we return right + right + } + } + + ) + .filter(s => s!= null && s._2!=null) + .map(s => s._2) .write .mode(SaveMode.Overwrite) .save(s"$workingDirPath/doiBoostPublicationFiltered") + val affiliationPath = parser.get("affiliationPath") val paperAffiliationPath = parser.get("paperAffiliationPath") From d660895b309d185e84c4ea3d55d1c1351820f0b2 Mon Sep 17 00:00:00 2001 From: Sandro La Bruzzo Date: Thu, 21 Apr 2022 20:41:13 +0200 Subject: [PATCH 2/8] fixed wrong mapping type of dataset --- .../main/scala/eu/dnetlib/doiboost/SparkGenerateDoiBoost.scala | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dhp-workflows/dhp-doiboost/src/main/scala/eu/dnetlib/doiboost/SparkGenerateDoiBoost.scala b/dhp-workflows/dhp-doiboost/src/main/scala/eu/dnetlib/doiboost/SparkGenerateDoiBoost.scala index bc26e44d6..fbe42ef7c 100644 --- a/dhp-workflows/dhp-doiboost/src/main/scala/eu/dnetlib/doiboost/SparkGenerateDoiBoost.scala +++ b/dhp-workflows/dhp-doiboost/src/main/scala/eu/dnetlib/doiboost/SparkGenerateDoiBoost.scala @@ -208,7 +208,7 @@ object SparkGenerateDoiBoost { ) .filter(s => s!= null && s._2!=null) - .map(s => s._2) + .map(s => s._2._2) .write .mode(SaveMode.Overwrite) .save(s"$workingDirPath/doiBoostPublicationFiltered") From 2a8e0fb72f10ca5a1ae4496e24649e9e86d9f1e7 Mon Sep 17 00:00:00 2001 From: Claudio Atzori Date: Mon, 9 May 2022 16:06:04 +0200 Subject: [PATCH 3/8] [openorgs] mapping parent/child relations without massaging the semantic labels --- .../dhp/oa/graph/raw/MigrateDbEntitiesApplication.java | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/dhp-workflows/dhp-graph-mapper/src/main/java/eu/dnetlib/dhp/oa/graph/raw/MigrateDbEntitiesApplication.java b/dhp-workflows/dhp-graph-mapper/src/main/java/eu/dnetlib/dhp/oa/graph/raw/MigrateDbEntitiesApplication.java index b5801ca5c..3e23e3493 100644 --- a/dhp-workflows/dhp-graph-mapper/src/main/java/eu/dnetlib/dhp/oa/graph/raw/MigrateDbEntitiesApplication.java +++ b/dhp-workflows/dhp-graph-mapper/src/main/java/eu/dnetlib/dhp/oa/graph/raw/MigrateDbEntitiesApplication.java @@ -711,10 +711,7 @@ public class MigrateDbEntitiesApplication extends AbstractMigrationApplication i final Relation r = new Relation(); r.setRelType(ORG_ORG_RELTYPE); r.setSubRelType(ModelConstants.RELATIONSHIP); - r - .setRelClass( - rs.getString("type").equalsIgnoreCase("parent") ? ModelConstants.IS_PARENT_OF - : ModelConstants.IS_CHILD_OF); + r.setRelClass(rs.getString("type")); r.setSource(orgId1); r.setTarget(orgId2); r.setCollectedfrom(collectedFrom); From 6031acb2e3a0a268ac2a837183d35a54999c5c91 Mon Sep 17 00:00:00 2001 From: Claudio Atzori Date: Mon, 16 May 2022 09:20:30 +0200 Subject: [PATCH 4/8] [openorgs] fixed parent/child query, using the correct semantic labels --- .../dnetlib/dhp/oa/graph/sql/queryParentChildRelsOpenOrgs.sql | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dhp-workflows/dhp-graph-mapper/src/main/resources/eu/dnetlib/dhp/oa/graph/sql/queryParentChildRelsOpenOrgs.sql b/dhp-workflows/dhp-graph-mapper/src/main/resources/eu/dnetlib/dhp/oa/graph/sql/queryParentChildRelsOpenOrgs.sql index 388fee3f5..0ac843401 100644 --- a/dhp-workflows/dhp-graph-mapper/src/main/resources/eu/dnetlib/dhp/oa/graph/sql/queryParentChildRelsOpenOrgs.sql +++ b/dhp-workflows/dhp-graph-mapper/src/main/resources/eu/dnetlib/dhp/oa/graph/sql/queryParentChildRelsOpenOrgs.sql @@ -10,4 +10,4 @@ SELECT 'OpenOrgs Database' AS collectedfromname, 'sysimport:crosswalk:entityregistry@@@dnet:provenance_actions' AS provenanceaction FROM relationships -WHERE reltype = 'Child' OR reltype = 'Parent' \ No newline at end of file +WHERE reltype = 'IsChildOf' OR reltype = 'IsParentOf' \ No newline at end of file From 46c07e0724f655d8cc86e6af1a4ec34fd19d7d21 Mon Sep 17 00:00:00 2001 From: "michele.artini" Date: Mon, 16 May 2022 09:39:54 +0200 Subject: [PATCH 5/8] deleted hierarchical rels from ror action set --- .../ror/GenerateRorActionSetJob.java | 62 ++++--------------- 1 file changed, 11 insertions(+), 51 deletions(-) diff --git a/dhp-workflows/dhp-aggregation/src/main/java/eu/dnetlib/dhp/actionmanager/ror/GenerateRorActionSetJob.java b/dhp-workflows/dhp-aggregation/src/main/java/eu/dnetlib/dhp/actionmanager/ror/GenerateRorActionSetJob.java index e4d458780..6c76f8a4d 100644 --- a/dhp-workflows/dhp-aggregation/src/main/java/eu/dnetlib/dhp/actionmanager/ror/GenerateRorActionSetJob.java +++ b/dhp-workflows/dhp-aggregation/src/main/java/eu/dnetlib/dhp/actionmanager/ror/GenerateRorActionSetJob.java @@ -3,7 +3,6 @@ package eu.dnetlib.dhp.actionmanager.ror; import static eu.dnetlib.dhp.common.SparkSessionSupport.runWithSparkSession; import static eu.dnetlib.dhp.schema.common.ModelConstants.ENTITYREGISTRY_PROVENANCE_ACTION; -import static eu.dnetlib.dhp.schema.common.ModelConstants.ORG_ORG_RELTYPE; import static eu.dnetlib.dhp.schema.oaf.utils.OafMapperUtils.dataInfo; import static eu.dnetlib.dhp.schema.oaf.utils.OafMapperUtils.field; import static eu.dnetlib.dhp.schema.oaf.utils.OafMapperUtils.listKeyValues; @@ -39,7 +38,6 @@ import org.slf4j.LoggerFactory; import com.fasterxml.jackson.databind.ObjectMapper; import eu.dnetlib.dhp.actionmanager.ror.model.ExternalIdType; -import eu.dnetlib.dhp.actionmanager.ror.model.Relationship; import eu.dnetlib.dhp.actionmanager.ror.model.RorOrganization; import eu.dnetlib.dhp.application.ArgumentApplicationParser; import eu.dnetlib.dhp.common.HdfsSupport; @@ -51,7 +49,6 @@ import eu.dnetlib.dhp.schema.oaf.KeyValue; import eu.dnetlib.dhp.schema.oaf.Oaf; import eu.dnetlib.dhp.schema.oaf.Organization; import eu.dnetlib.dhp.schema.oaf.Qualifier; -import eu.dnetlib.dhp.schema.oaf.Relation; import eu.dnetlib.dhp.schema.oaf.StructuredProperty; import eu.dnetlib.dhp.utils.DHPUtils; import scala.Tuple2; @@ -64,21 +61,17 @@ public class GenerateRorActionSetJob { private static final String ROR_NS_PREFIX = "ror_________"; - private static final List ROR_COLLECTED_FROM = listKeyValues( - "10|openaire____::993a7ae7a863813cf95028b50708e222", "ROR"); + private static final List ROR_COLLECTED_FROM = listKeyValues("10|openaire____::993a7ae7a863813cf95028b50708e222", "ROR"); - private static final DataInfo ROR_DATA_INFO = dataInfo( - false, "", false, false, ENTITYREGISTRY_PROVENANCE_ACTION, "0.92"); + private static final DataInfo ROR_DATA_INFO = dataInfo(false, "", false, false, ENTITYREGISTRY_PROVENANCE_ACTION, "0.92"); - private static final Qualifier ROR_PID_TYPE = qualifier( - "ROR", "ROR", ModelConstants.DNET_PID_TYPES, ModelConstants.DNET_PID_TYPES); + private static final Qualifier ROR_PID_TYPE = qualifier("ROR", "ROR", ModelConstants.DNET_PID_TYPES, ModelConstants.DNET_PID_TYPES); public static void main(final String[] args) throws Exception { final String jsonConfiguration = IOUtils - .toString( - GenerateRorActionSetJob.class - .getResourceAsStream("/eu/dnetlib/dhp/actionmanager/ror/action_set_parameters.json")); + .toString(GenerateRorActionSetJob.class + .getResourceAsStream("/eu/dnetlib/dhp/actionmanager/ror/action_set_parameters.json")); final ArgumentApplicationParser parser = new ArgumentApplicationParser(jsonConfiguration); @@ -116,9 +109,8 @@ public class GenerateRorActionSetJob { readInputPath(spark, inputPath) .map(GenerateRorActionSetJob::convertRorOrg) .flatMap(List::iterator) - .mapToPair( - aa -> new Tuple2<>(new Text(aa.getClazz().getCanonicalName()), - new Text(OBJECT_MAPPER.writeValueAsString(aa)))) + .mapToPair(aa -> new Tuple2<>(new Text(aa.getClazz().getCanonicalName()), + new Text(OBJECT_MAPPER.writeValueAsString(aa)))) .saveAsHadoopFile(outputPath, Text.class, Text.class, SequenceFileOutputFormat.class); } @@ -153,12 +145,9 @@ public class GenerateRorActionSetJob { o.setEcnutscode(null); if (r.getCountry() != null) { o - .setCountry( - qualifier( - r.getCountry().getCountryCode(), r - .getCountry() - .getCountryName(), - ModelConstants.DNET_COUNTRY_TYPE, ModelConstants.DNET_COUNTRY_TYPE)); + .setCountry(qualifier(r.getCountry().getCountryCode(), r + .getCountry() + .getCountryName(), ModelConstants.DNET_COUNTRY_TYPE, ModelConstants.DNET_COUNTRY_TYPE)); } else { o.setCountry(null); } @@ -168,38 +157,10 @@ public class GenerateRorActionSetJob { final List> res = new ArrayList<>(); res.add(new AtomicAction<>(Organization.class, o)); - for (final Relationship rorRel : r.getRelationships()) { - if (rorRel.getType().equalsIgnoreCase("parent")) { - final String orgId1 = calculateOpenaireId(r.getId()); - final String orgId2 = calculateOpenaireId(rorRel.getId()); - res - .add( - new AtomicAction<>(Relation.class, - calculateHierarchyRel(orgId1, orgId2, ModelConstants.IS_PARENT_OF))); - res - .add( - new AtomicAction<>(Relation.class, - calculateHierarchyRel(orgId2, orgId1, ModelConstants.IS_CHILD_OF))); - } - } - return res; } - private static Relation calculateHierarchyRel(final String source, final String target, final String relClass) { - final Relation rel = new Relation(); - rel.setSource(source); - rel.setTarget(target); - rel.setRelType(ORG_ORG_RELTYPE); - rel.setSubRelType(ModelConstants.RELATIONSHIP); - rel.setRelClass(relClass); - rel.setCollectedfrom(ROR_COLLECTED_FROM); - rel.setDataInfo(ROR_DATA_INFO); - rel.setLastupdatetimestamp(System.currentTimeMillis()); - return rel; - } - private static String calculateOpenaireId(final String rorId) { return String.format("20|%s::%s", ROR_NS_PREFIX, DHPUtils.md5(rorId)); } @@ -212,8 +173,7 @@ public class GenerateRorActionSetJob { final String type = e.getKey(); final List all = e.getValue().getAll(); if (all != null) { - final Qualifier qualifier = qualifier( - type, type, ModelConstants.DNET_PID_TYPES, ModelConstants.DNET_PID_TYPES); + final Qualifier qualifier = qualifier(type, type, ModelConstants.DNET_PID_TYPES, ModelConstants.DNET_PID_TYPES); for (final String pid : all) { pids .add(structuredProperty(pid, qualifier, ROR_DATA_INFO)); From 52cb086506161dfdbd98a331b4ff004e5fb8f2bd Mon Sep 17 00:00:00 2001 From: Claudio Atzori Date: Mon, 16 May 2022 12:07:40 +0200 Subject: [PATCH 6/8] [graph grouping] drop relation target path before copying from source --- .../dnetlib/dhp/oa/graph/group/oozie_app/workflow.xml | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/dhp-workflows/dhp-graph-mapper/src/main/resources/eu/dnetlib/dhp/oa/graph/group/oozie_app/workflow.xml b/dhp-workflows/dhp-graph-mapper/src/main/resources/eu/dnetlib/dhp/oa/graph/group/oozie_app/workflow.xml index f77b46105..888a873c5 100644 --- a/dhp-workflows/dhp-graph-mapper/src/main/resources/eu/dnetlib/dhp/oa/graph/group/oozie_app/workflow.xml +++ b/dhp-workflows/dhp-graph-mapper/src/main/resources/eu/dnetlib/dhp/oa/graph/group/oozie_app/workflow.xml @@ -283,7 +283,15 @@ - + + + + + + + + + From 8dd5517548d1224e5067c4f48c68bda5817431ca Mon Sep 17 00:00:00 2001 From: Claudio Atzori Date: Mon, 16 May 2022 14:35:24 +0200 Subject: [PATCH 7/8] code formatting --- .../ror/GenerateRorActionSetJob.java | 31 +++++++---- .../doiboost/SparkGenerateDoiBoost.scala | 52 ++++++++----------- 2 files changed, 43 insertions(+), 40 deletions(-) diff --git a/dhp-workflows/dhp-aggregation/src/main/java/eu/dnetlib/dhp/actionmanager/ror/GenerateRorActionSetJob.java b/dhp-workflows/dhp-aggregation/src/main/java/eu/dnetlib/dhp/actionmanager/ror/GenerateRorActionSetJob.java index 6c76f8a4d..6b5bed5b8 100644 --- a/dhp-workflows/dhp-aggregation/src/main/java/eu/dnetlib/dhp/actionmanager/ror/GenerateRorActionSetJob.java +++ b/dhp-workflows/dhp-aggregation/src/main/java/eu/dnetlib/dhp/actionmanager/ror/GenerateRorActionSetJob.java @@ -61,17 +61,21 @@ public class GenerateRorActionSetJob { private static final String ROR_NS_PREFIX = "ror_________"; - private static final List ROR_COLLECTED_FROM = listKeyValues("10|openaire____::993a7ae7a863813cf95028b50708e222", "ROR"); + private static final List ROR_COLLECTED_FROM = listKeyValues( + "10|openaire____::993a7ae7a863813cf95028b50708e222", "ROR"); - private static final DataInfo ROR_DATA_INFO = dataInfo(false, "", false, false, ENTITYREGISTRY_PROVENANCE_ACTION, "0.92"); + private static final DataInfo ROR_DATA_INFO = dataInfo( + false, "", false, false, ENTITYREGISTRY_PROVENANCE_ACTION, "0.92"); - private static final Qualifier ROR_PID_TYPE = qualifier("ROR", "ROR", ModelConstants.DNET_PID_TYPES, ModelConstants.DNET_PID_TYPES); + private static final Qualifier ROR_PID_TYPE = qualifier( + "ROR", "ROR", ModelConstants.DNET_PID_TYPES, ModelConstants.DNET_PID_TYPES); public static void main(final String[] args) throws Exception { final String jsonConfiguration = IOUtils - .toString(GenerateRorActionSetJob.class - .getResourceAsStream("/eu/dnetlib/dhp/actionmanager/ror/action_set_parameters.json")); + .toString( + GenerateRorActionSetJob.class + .getResourceAsStream("/eu/dnetlib/dhp/actionmanager/ror/action_set_parameters.json")); final ArgumentApplicationParser parser = new ArgumentApplicationParser(jsonConfiguration); @@ -109,8 +113,9 @@ public class GenerateRorActionSetJob { readInputPath(spark, inputPath) .map(GenerateRorActionSetJob::convertRorOrg) .flatMap(List::iterator) - .mapToPair(aa -> new Tuple2<>(new Text(aa.getClazz().getCanonicalName()), - new Text(OBJECT_MAPPER.writeValueAsString(aa)))) + .mapToPair( + aa -> new Tuple2<>(new Text(aa.getClazz().getCanonicalName()), + new Text(OBJECT_MAPPER.writeValueAsString(aa)))) .saveAsHadoopFile(outputPath, Text.class, Text.class, SequenceFileOutputFormat.class); } @@ -145,9 +150,12 @@ public class GenerateRorActionSetJob { o.setEcnutscode(null); if (r.getCountry() != null) { o - .setCountry(qualifier(r.getCountry().getCountryCode(), r - .getCountry() - .getCountryName(), ModelConstants.DNET_COUNTRY_TYPE, ModelConstants.DNET_COUNTRY_TYPE)); + .setCountry( + qualifier( + r.getCountry().getCountryCode(), r + .getCountry() + .getCountryName(), + ModelConstants.DNET_COUNTRY_TYPE, ModelConstants.DNET_COUNTRY_TYPE)); } else { o.setCountry(null); } @@ -173,7 +181,8 @@ public class GenerateRorActionSetJob { final String type = e.getKey(); final List all = e.getValue().getAll(); if (all != null) { - final Qualifier qualifier = qualifier(type, type, ModelConstants.DNET_PID_TYPES, ModelConstants.DNET_PID_TYPES); + final Qualifier qualifier = qualifier( + type, type, ModelConstants.DNET_PID_TYPES, ModelConstants.DNET_PID_TYPES); for (final String pid : all) { pids .add(structuredProperty(pid, qualifier, ROR_DATA_INFO)); diff --git a/dhp-workflows/dhp-doiboost/src/main/scala/eu/dnetlib/doiboost/SparkGenerateDoiBoost.scala b/dhp-workflows/dhp-doiboost/src/main/scala/eu/dnetlib/doiboost/SparkGenerateDoiBoost.scala index fbe42ef7c..72b93749b 100644 --- a/dhp-workflows/dhp-doiboost/src/main/scala/eu/dnetlib/doiboost/SparkGenerateDoiBoost.scala +++ b/dhp-workflows/dhp-doiboost/src/main/scala/eu/dnetlib/doiboost/SparkGenerateDoiBoost.scala @@ -177,43 +177,37 @@ object SparkGenerateDoiBoost { .map(DoiBoostMappingUtil.fixPublication) .map(p => (p.getId, p)) .groupByKey(_._1) - .reduceGroups((left, right) => - { - //Check left is not null - if (left != null && left._1 != null) - { - //If right is null then return left - if (right == null || right._2 == null) - left - else { - // Here Left and Right are not null - // So we have to merge - val b1 = left._2 - val b2 = right._2 - b1.mergeFrom(b2) - b1.mergeOAFDataInfo(b2) - val authors = AuthorMerger.mergeAuthor(b1.getAuthor, b2.getAuthor) - b1.setAuthor(authors) - if (b2.getId != null && b2.getId.nonEmpty) - b1.setId(b2.getId) - //Return publication Merged - (b1.getId, b1) - } - } + .reduceGroups((left, right) => { + //Check left is not null + if (left != null && left._1 != null) { + //If right is null then return left + if (right == null || right._2 == null) + left else { - // Left is Null so we return right - right + // Here Left and Right are not null + // So we have to merge + val b1 = left._2 + val b2 = right._2 + b1.mergeFrom(b2) + b1.mergeOAFDataInfo(b2) + val authors = AuthorMerger.mergeAuthor(b1.getAuthor, b2.getAuthor) + b1.setAuthor(authors) + if (b2.getId != null && b2.getId.nonEmpty) + b1.setId(b2.getId) + //Return publication Merged + (b1.getId, b1) } + } else { + // Left is Null so we return right + right } - - ) - .filter(s => s!= null && s._2!=null) + }) + .filter(s => s != null && s._2 != null) .map(s => s._2._2) .write .mode(SaveMode.Overwrite) .save(s"$workingDirPath/doiBoostPublicationFiltered") - val affiliationPath = parser.get("affiliationPath") val paperAffiliationPath = parser.get("paperAffiliationPath") From 1dda11e0319eebe5ec3a772b1fafd6c75912ff56 Mon Sep 17 00:00:00 2001 From: Claudio Atzori Date: Mon, 16 May 2022 15:53:27 +0200 Subject: [PATCH 8/8] [hb patch] updated map --- .../eu/dnetlib/dhp/datacite/hostedBy_map.json | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/dhp-workflows/dhp-aggregation/src/main/resources/eu/dnetlib/dhp/datacite/hostedBy_map.json b/dhp-workflows/dhp-aggregation/src/main/resources/eu/dnetlib/dhp/datacite/hostedBy_map.json index 947a9a255..ecae6811a 100644 --- a/dhp-workflows/dhp-aggregation/src/main/resources/eu/dnetlib/dhp/datacite/hostedBy_map.json +++ b/dhp-workflows/dhp-aggregation/src/main/resources/eu/dnetlib/dhp/datacite/hostedBy_map.json @@ -15,7 +15,7 @@ "official_name": "Aperta TÜBİTAK Open Archive" }, "BL.CAM": { - "openaire_id": "re3data_____::r3d100010620", + "openaire_id": "opendoar____::109", "datacite_name": "Apollo", "official_name": "Apollo" }, @@ -196,7 +196,7 @@ }, "CSIC.DIGITAL": { "openaire_id": "re3data_____::r3d100011076", - "datacite_name": "DIGITAL.CSIC", + "datacite_name": "Digital CSIC", "official_name": "DIGITAL.CSIC" }, "BL.DRI": { @@ -644,6 +644,11 @@ "datacite_name": "PANGAEA", "official_name": "PANGAEA" }, + "TIB.PANGAEA": { + "openaire_id": "re3data_____::r3d100010134", + "datacite_name": "PANGAEA", + "official_name": "PANGAEA" + }, "NASAPDS.NASAPDS": { "openaire_id": "re3data_____::r3d100010121", "datacite_name": "PDS", @@ -896,7 +901,7 @@ }, "FIGSHARE.UCT": { "openaire_id": "re3data_____::r3d100012633", - "datacite_name": "ZivaHub", + "datacite_name": "University of Cape Town (UCT)", "official_name": "ZivaHub" }, "BL.UCLAN": { @@ -1030,9 +1035,9 @@ "official_name": "ZBW Journal Data Archive" }, "CERN.ZENODO": { - "openaire_id": "re3data_____::r3d100010468", + "openaire_id": "opendoar____::2659", "datacite_name": "Zenodo", - "official_name": "Zenodo" + "official_name": "ZENODO" }, "ZBW.ZEW": { "openaire_id": "re3data_____::r3d100010399",