From b260fee7877f3fea971dbaa39aef0c5c227c78a7 Mon Sep 17 00:00:00 2001 From: miconis Date: Wed, 22 Jul 2020 17:29:48 +0200 Subject: [PATCH 01/12] implementation of the dedup_id generation using pids to make the graph more stable --- .../eu/dnetlib/dhp/oa/dedup/DatePicker.java | 2 +- .../dhp/oa/dedup/DedupRecordFactory.java | 96 ++++++++++++++++--- .../eu/dnetlib/dhp/oa/dedup/Identifier.java | 55 +++++++++++ .../java/eu/dnetlib/dhp/oa/dedup/PidType.java | 54 +++++++++++ .../dhp/oa/dedup/EntityMergerTest.java | 27 +++++- .../dnetlib/dhp/oa/dedup/SparkDedupTest.java | 41 ++++---- .../dhp/dedup/json/publication_merge3.json | 3 + 7 files changed, 237 insertions(+), 41 deletions(-) create mode 100644 dhp-workflows/dhp-dedup-openaire/src/main/java/eu/dnetlib/dhp/oa/dedup/Identifier.java create mode 100644 dhp-workflows/dhp-dedup-openaire/src/main/java/eu/dnetlib/dhp/oa/dedup/PidType.java create mode 100644 dhp-workflows/dhp-dedup-openaire/src/test/resources/eu/dnetlib/dhp/dedup/json/publication_merge3.json diff --git a/dhp-workflows/dhp-dedup-openaire/src/main/java/eu/dnetlib/dhp/oa/dedup/DatePicker.java b/dhp-workflows/dhp-dedup-openaire/src/main/java/eu/dnetlib/dhp/oa/dedup/DatePicker.java index 70fb2cc5b..d6b8bf71c 100644 --- a/dhp-workflows/dhp-dedup-openaire/src/main/java/eu/dnetlib/dhp/oa/dedup/DatePicker.java +++ b/dhp-workflows/dhp-dedup-openaire/src/main/java/eu/dnetlib/dhp/oa/dedup/DatePicker.java @@ -114,7 +114,7 @@ public class DatePicker { } } - private static boolean inRange(final String date) { + public static boolean inRange(final String date) { final int year = Integer.parseInt(substringBefore(date, "-")); return year >= YEAR_LB && year <= YEAR_UB; } diff --git a/dhp-workflows/dhp-dedup-openaire/src/main/java/eu/dnetlib/dhp/oa/dedup/DedupRecordFactory.java b/dhp-workflows/dhp-dedup-openaire/src/main/java/eu/dnetlib/dhp/oa/dedup/DedupRecordFactory.java index 8028d5a94..7f04afe8a 100644 --- a/dhp-workflows/dhp-dedup-openaire/src/main/java/eu/dnetlib/dhp/oa/dedup/DedupRecordFactory.java +++ b/dhp-workflows/dhp-dedup-openaire/src/main/java/eu/dnetlib/dhp/oa/dedup/DedupRecordFactory.java @@ -1,11 +1,12 @@ package eu.dnetlib.dhp.oa.dedup; -import java.io.Serializable; -import java.util.Collection; -import java.util.Iterator; -import java.util.List; - +import com.fasterxml.jackson.databind.DeserializationFeature; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.google.common.collect.Lists; +import eu.dnetlib.dhp.schema.common.ModelSupport; +import eu.dnetlib.dhp.schema.oaf.*; +import org.apache.commons.lang.StringUtils; import org.apache.spark.api.java.function.MapFunction; import org.apache.spark.api.java.function.MapGroupsFunction; import org.apache.spark.sql.Dataset; @@ -13,15 +14,12 @@ import org.apache.spark.sql.Encoders; import org.apache.spark.sql.SparkSession; import org.slf4j.Logger; import org.slf4j.LoggerFactory; - -import com.fasterxml.jackson.databind.DeserializationFeature; -import com.fasterxml.jackson.databind.ObjectMapper; -import com.google.common.collect.Lists; - -import eu.dnetlib.dhp.schema.common.ModelSupport; -import eu.dnetlib.dhp.schema.oaf.*; import scala.Tuple2; +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.*; + public class DedupRecordFactory { private static final Logger log = LoggerFactory.getLogger(DedupRecordFactory.class); @@ -77,15 +75,23 @@ public class DedupRecordFactory { String id, Iterator> entities, long ts, DataInfo dataInfo, Class clazz) throws IllegalAccessException, InstantiationException { + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); + T entity = clazz.newInstance(); final Collection dates = Lists.newArrayList(); final List> authors = Lists.newArrayList(); + final List bestPids = Lists.newArrayList(); //best pids list entities .forEachRemaining( t -> { T duplicate = t._2(); + + StructuredProperty bestPid = bestPid(duplicate.getPid()); + if (bestPid != null) + bestPids.add(new Identifier(bestPid, extractDate(duplicate, sdf), PidType.classidValueOf(bestPid.getQualifier().getClassid()))); + entity.mergeFrom(duplicate); if (ModelSupport.isSubClass(duplicate, Result.class)) { Result r1 = (Result) duplicate; @@ -94,6 +100,7 @@ public class DedupRecordFactory { if (r1.getDateofacceptance() != null) dates.add(r1.getDateofacceptance().getValue()); } + }); // set authors and date @@ -102,10 +109,73 @@ public class DedupRecordFactory { ((Result) entity).setAuthor(AuthorMerger.merge(authors)); } - entity.setId(id); + Identifier bestPid = winnerPid(bestPids); + if (bestPid == null) + entity.setId(id); + else + entity.setId(id.split("\\|")[0] + "|" + createPrefix(bestPid.getPid().getQualifier().getClassid()) + "::" + DedupUtility.md5(bestPid.getPid().getValue())); + entity.setLastupdatetimestamp(ts); entity.setDataInfo(dataInfo); return entity; } + + //pick the best pid from the list (consider date and pidtype) + public static Identifier winnerPid(List pids) { + if (pids == null || pids.size() == 0) + return null; + Optional bp = pids.stream() + .filter(pid -> pid.getType() != PidType.undefined) + .max(Identifier::compareTo); + return bp.orElse(null); + } + + //pick the best pid from the entity + public static StructuredProperty bestPid(List pids) { + + if (pids == null || pids.size() == 0) + return null; + Optional bp = pids.stream() + .filter(pid -> PidType.classidValueOf(pid.getQualifier().getClassid()) != PidType.undefined) + .max(Comparator.comparing(pid -> PidType.classidValueOf(pid.getQualifier().getClassid()))); + + return bp.orElse(null); + } + + //create the prefix (length = 12): dedup_+ pidType + public static String createPrefix(String pidType) { + + StringBuilder prefix = new StringBuilder("dedup_" + pidType); + + while (prefix.length() < 12) { + prefix.append("_"); + } + return prefix.toString().substring(0, 12); + + } + + //extracts the date from the record. If the date is not available or is not wellformed, it returns a base date: 00-01-01 + public static Date extractDate(T duplicate, SimpleDateFormat sdf){ + + String date = "2000-01-01"; + if (ModelSupport.isSubClass(duplicate, Result.class)) { + Result result = (Result) duplicate; + if (isWellformed(result.getDateofacceptance())){ + date = result.getDateofacceptance().getValue(); + } + } + + try { + return sdf.parse(date); + } catch (ParseException e) { + return new Date(); + } + + } + + public static boolean isWellformed(Field date) { + return date != null && StringUtils.isNotBlank(date.getValue()) && date.getValue().matches("\\d{4}-\\d{2}-\\d{2}") && DatePicker.inRange(date.getValue()); + } + } diff --git a/dhp-workflows/dhp-dedup-openaire/src/main/java/eu/dnetlib/dhp/oa/dedup/Identifier.java b/dhp-workflows/dhp-dedup-openaire/src/main/java/eu/dnetlib/dhp/oa/dedup/Identifier.java new file mode 100644 index 000000000..3d92900ca --- /dev/null +++ b/dhp-workflows/dhp-dedup-openaire/src/main/java/eu/dnetlib/dhp/oa/dedup/Identifier.java @@ -0,0 +1,55 @@ +package eu.dnetlib.dhp.oa.dedup; + +import eu.dnetlib.dhp.schema.oaf.StructuredProperty; + +import java.io.Serializable; +import java.util.Date; + +public class Identifier implements Serializable, Comparable{ + + StructuredProperty pid; + Date date; + PidType type; + + public Identifier(StructuredProperty pid, Date date, PidType type) { + this.pid = pid; + this.date = date; + this.type = type; + } + + public StructuredProperty getPid() { + return pid; + } + + public void setPid(StructuredProperty pidValue) { + this.pid = pid; + } + + public Date getDate() { + return date; + } + + public void setDate(Date date) { + this.date = date; + } + + public PidType getType() { + return type; + } + + public void setType(PidType type) { + this.type = type; + } + + @Override + public int compareTo(Identifier i) { + //priority in comparisons: 1) pidtype, 2) date + if (this.getType().compareTo(i.getType()) == 0){ //same type + return this.getDate().compareTo(date); + } + else { + return this.getType().compareTo(i.getType()); + } + + } +} diff --git a/dhp-workflows/dhp-dedup-openaire/src/main/java/eu/dnetlib/dhp/oa/dedup/PidType.java b/dhp-workflows/dhp-dedup-openaire/src/main/java/eu/dnetlib/dhp/oa/dedup/PidType.java new file mode 100644 index 000000000..c0af44b1e --- /dev/null +++ b/dhp-workflows/dhp-dedup-openaire/src/main/java/eu/dnetlib/dhp/oa/dedup/PidType.java @@ -0,0 +1,54 @@ +package eu.dnetlib.dhp.oa.dedup; + +public enum PidType { + + //from the less to the more important + undefined, + orcid, + ror, + grid, + pdb, + arXiv, + pmid, + doi; + + public static PidType classidValueOf(String s){ + try { + return PidType.valueOf(s); + } + catch (Exception e) { + return PidType.undefined; + } + } + +} + +//dnet:pid_types +//"actrn" +//"nct" +//"euctr" +//"epo_id" +//"gsk" +//"GeoPass" +//"GBIF" +//"isrctn" +//"ISNI" +//"jprn" +//"mag_id" +//"oai" +//"orcid" +//"PANGAEA" +//"epo_nr_epodoc" +//"UNKNOWN" +//"VIAF" +//"arXiv" +//"doi" +//"grid" +//"info:eu-repo/dai" +//"orcidworkid" +//"pmc" +//"pmid" +//"urn" +//"who" +//"drks" +//"pdb" \ No newline at end of file diff --git a/dhp-workflows/dhp-dedup-openaire/src/test/java/eu/dnetlib/dhp/oa/dedup/EntityMergerTest.java b/dhp-workflows/dhp-dedup-openaire/src/test/java/eu/dnetlib/dhp/oa/dedup/EntityMergerTest.java index 3fb9d1751..b3cb7b9d9 100644 --- a/dhp-workflows/dhp-dedup-openaire/src/test/java/eu/dnetlib/dhp/oa/dedup/EntityMergerTest.java +++ b/dhp-workflows/dhp-dedup-openaire/src/test/java/eu/dnetlib/dhp/oa/dedup/EntityMergerTest.java @@ -22,10 +22,11 @@ public class EntityMergerTest implements Serializable { List> publications; List> publications2; + List> publications3; String testEntityBasePath; DataInfo dataInfo; - String dedupId = "dedup_id"; + String dedupId = "00|dedup_id::1"; Publication pub_top; @BeforeEach @@ -38,6 +39,8 @@ public class EntityMergerTest implements Serializable { publications = readSample(testEntityBasePath + "/publication_merge.json", Publication.class); publications2 = readSample(testEntityBasePath + "/publication_merge2.json", Publication.class); + publications3 = readSample(testEntityBasePath + "/publication_merge3.json", Publication.class); + pub_top = getTopPub(publications); @@ -54,6 +57,9 @@ public class EntityMergerTest implements Serializable { .entityMerger(dedupId, softwares.iterator(), 0, dataInfo, Software.class); assertEquals(merged.getBestaccessright().getClassid(), "OPEN SOURCE"); + + assertEquals(merged.getId(), "00|dedup_doi___::0968af610a356656706657e4f234b340"); + } @Test @@ -62,7 +68,8 @@ public class EntityMergerTest implements Serializable { Publication pub_merged = DedupRecordFactory .entityMerger(dedupId, publications.iterator(), 0, dataInfo, Publication.class); - assertEquals(dedupId, pub_merged.getId()); + // verify id + assertEquals(pub_merged.getId(), "00|dedup_doi___::0968af610a356656706657e4f234b340"); assertEquals(pub_merged.getJournal(), pub_top.getJournal()); assertEquals(pub_merged.getBestaccessright(), pub_top.getBestaccessright()); @@ -117,11 +124,25 @@ public class EntityMergerTest implements Serializable { Publication pub_merged = DedupRecordFactory .entityMerger(dedupId, publications2.iterator(), 0, dataInfo, Publication.class); + // verify id + assertEquals(pub_merged.getId(), "00|dedup_doi___::0ca46ff10b2b4c756191719d85302b14"); + assertEquals(pub_merged.getAuthor().size(), 27); - // insert assertions here } + @Test + public void publicationMergerTest3() throws InstantiationException, IllegalAccessException { + + Publication pub_merged = DedupRecordFactory + .entityMerger(dedupId, publications3.iterator(), 0, dataInfo, Publication.class); + + // verify id + assertEquals(pub_merged.getId(), "00|dedup_doi___::0ca46ff10b2b4c756191719d85302b14"); + + } + + public DataInfo setDI() { DataInfo dataInfo = new DataInfo(); dataInfo.setTrust("0.9"); diff --git a/dhp-workflows/dhp-dedup-openaire/src/test/java/eu/dnetlib/dhp/oa/dedup/SparkDedupTest.java b/dhp-workflows/dhp-dedup-openaire/src/test/java/eu/dnetlib/dhp/oa/dedup/SparkDedupTest.java index fb5ebc099..35c4c7026 100644 --- a/dhp-workflows/dhp-dedup-openaire/src/test/java/eu/dnetlib/dhp/oa/dedup/SparkDedupTest.java +++ b/dhp-workflows/dhp-dedup-openaire/src/test/java/eu/dnetlib/dhp/oa/dedup/SparkDedupTest.java @@ -1,22 +1,12 @@ package eu.dnetlib.dhp.oa.dedup; -import static java.nio.file.Files.createTempDirectory; - -import static org.apache.spark.sql.functions.col; -import static org.apache.spark.sql.functions.count; -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.mockito.Mockito.lenient; - -import java.io.File; -import java.io.IOException; -import java.io.Serializable; -import java.net.URISyntaxException; -import java.nio.file.Paths; -import java.util.HashSet; -import java.util.Set; -import java.util.stream.Collectors; - +import com.fasterxml.jackson.databind.ObjectMapper; +import eu.dnetlib.dhp.application.ArgumentApplicationParser; +import eu.dnetlib.dhp.schema.oaf.Relation; +import eu.dnetlib.enabling.is.lookup.rmi.ISLookUpException; +import eu.dnetlib.enabling.is.lookup.rmi.ISLookUpService; +import eu.dnetlib.pace.util.MapDocumentUtil; import org.apache.commons.io.FileUtils; import org.apache.commons.io.IOUtils; import org.apache.spark.SparkConf; @@ -35,16 +25,19 @@ import org.junit.jupiter.api.extension.ExtendWith; import org.mockito.Mock; import org.mockito.Mockito; import org.mockito.junit.jupiter.MockitoExtension; - -import com.fasterxml.jackson.databind.ObjectMapper; - -import eu.dnetlib.dhp.application.ArgumentApplicationParser; -import eu.dnetlib.dhp.schema.oaf.Relation; -import eu.dnetlib.enabling.is.lookup.rmi.ISLookUpException; -import eu.dnetlib.enabling.is.lookup.rmi.ISLookUpService; -import eu.dnetlib.pace.util.MapDocumentUtil; import scala.Tuple2; +import java.io.File; +import java.io.IOException; +import java.io.Serializable; +import java.net.URISyntaxException; +import java.nio.file.Paths; + +import static java.nio.file.Files.createTempDirectory; +import static org.apache.spark.sql.functions.count; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.mockito.Mockito.lenient; + @ExtendWith(MockitoExtension.class) @TestMethodOrder(MethodOrderer.OrderAnnotation.class) public class SparkDedupTest implements Serializable { diff --git a/dhp-workflows/dhp-dedup-openaire/src/test/resources/eu/dnetlib/dhp/dedup/json/publication_merge3.json b/dhp-workflows/dhp-dedup-openaire/src/test/resources/eu/dnetlib/dhp/dedup/json/publication_merge3.json new file mode 100644 index 000000000..c82c8c83e --- /dev/null +++ b/dhp-workflows/dhp-dedup-openaire/src/test/resources/eu/dnetlib/dhp/dedup/json/publication_merge3.json @@ -0,0 +1,3 @@ +{"id":"50|doajarticles::842fa3b99fcdccafb4d5c8a815f56efa","dateofcollection":"2020-04-06T12:22:31.216Z","title":[{"dataInfo":{"deletedbyinference":false,"inferenceprovenance":"","inferred":false,"invisible":false,"provenanceaction":{"classid":"sysimport:crosswalk:repository","classname":"sysimport:crosswalk:repository","schemeid":"dnet:provenanceActions","schemename":"dnet:provenanceActions"},"trust":"0.9"},"qualifier":{"classid":"main title","classname":"main title","schemeid":"dnet:dataCite_title","schemename":"dnet:dataCite_title"},"value":"Increased Expression of Herpes Virus-Encoded hsv1-miR-H18 and hsv2-miR-H9-5p in Cancer-Containing Prostate Tissue Compared to That in Benign Prostate Hyperplasia Tissue"}],"publisher":{"dataInfo":{"deletedbyinference":false,"inferenceprovenance":"","inferred":false,"invisible":false,"provenanceaction":{"classid":"sysimport:crosswalk:repository","classname":"sysimport:crosswalk:repository","schemeid":"dnet:provenanceActions","schemename":"dnet:provenanceActions"},"trust":"0.9"},"value":"Korean Continence Society"},"bestaccessright":null,"dataInfo":{"deletedbyinference":true,"inferenceprovenance":"","inferred":false,"invisible":false,"provenanceaction":{"classid":"sysimport:crosswalk:repository","classname":"sysimport:crosswalk:repository","schemeid":"dnet:provenanceActions","schemename":"dnet:provenanceActions"},"trust":"0.9"},"collectedfrom":[{"dataInfo":null,"key":"10|driver______::bee53aa31dc2cbb538c10c2b65fa5824","value":"DOAJ-Articles"}],"pid":[{"dataInfo":{"deletedbyinference":false,"inferenceprovenance":"","inferred":false,"invisible":false,"provenanceaction":{"classid":"sysimport:crosswalk:repository","classname":"sysimport:crosswalk:repository","schemeid":"dnet:provenanceActions","schemename":"dnet:provenanceActions"},"trust":"0.9"},"qualifier":{"classid":"doi","classname":"doi","schemeid":"dnet:pid_types","schemename":"dnet:pid_types"},"value":"10.5213/inj.1632552.276"}, {"dataInfo":{"deletedbyinference":false,"inferenceprovenance":"","inferred":false,"invisible":false,"provenanceaction":{"classid":"sysimport:crosswalk:repository","classname":"sysimport:crosswalk:repository","schemeid":"dnet:provenanceActions","schemename":"dnet:provenanceActions"},"trust":"0.9"},"qualifier":{"classid":"doi","classname":"doi","schemeid":"dnet:pid_types","schemename":"dnet:pid_types"},"value":"10.5213/inj.1632552.27XXXXX"}],"author":[{"affiliation":null,"fullname":"Seok Joong Yun","name":null,"pid":[],"rank":1,"surname":null},{"affiliation":null,"fullname":"Pildu Jeong","name":null,"pid":[],"rank":2,"surname":null},{"affiliation":null,"fullname":"Ho Won Kang","name":null,"pid":[],"rank":3,"surname":null},{"affiliation":null,"fullname":"Helen Ki Shinn","name":null,"pid":[],"rank":4,"surname":null},{"affiliation":null,"fullname":"Ye-Hwan Kim","name":null,"pid":[],"rank":5,"surname":null},{"affiliation":null,"fullname":"Chunri Yan","name":null,"pid":[],"rank":6,"surname":null},{"affiliation":null,"fullname":"Young-Ki Choi","name":null,"pid":[],"rank":7,"surname":null},{"affiliation":null,"fullname":"Dongho Kim","name":null,"pid":[],"rank":8,"surname":null},{"affiliation":null,"fullname":"Dong Hee Ryu","name":null,"pid":[],"rank":9,"surname":null},{"affiliation":null,"fullname":"Yun-Sok Ha","name":null,"pid":[],"rank":10,"surname":null},{"affiliation":null,"fullname":"Tae-Hwan Kim","name":null,"pid":[],"rank":11,"surname":null},{"affiliation":null,"fullname":"Tae Gyun Kwon","name":null,"pid":[],"rank":12,"surname":null},{"affiliation":null,"fullname":"Jung Min Kim","name":null,"pid":[],"rank":13,"surname":null},{"affiliation":null,"fullname":"Sang Heon Suh","name":null,"pid":[],"rank":14,"surname":null},{"affiliation":null,"fullname":"Seon-Kyu Kim","name":null,"pid":[],"rank":15,"surname":null},{"affiliation":null,"fullname":"Seon-Young Kim","name":null,"pid":[],"rank":16,"surname":null},{"affiliation":null,"fullname":"Sang Tae Kim","name":null,"pid":[],"rank":17,"surname":null},{"affiliation":null,"fullname":"Won Tae Kim","name":null,"pid":[],"rank":18,"surname":null},{"affiliation":null,"fullname":"Ok-Jun Lee","name":null,"pid":[],"rank":19,"surname":null},{"affiliation":null,"fullname":"Sung-Kwon Moon","name":null,"pid":[],"rank":20,"surname":null},{"affiliation":null,"fullname":"Nam-Hyung Kim","name":null,"pid":[],"rank":21,"surname":null},{"affiliation":null,"fullname":"Isaac Yi Kim","name":null,"pid":[],"rank":22,"surname":null},{"affiliation":null,"fullname":"Jayoung Kim","name":null,"pid":[],"rank":23,"surname":null},{"affiliation":null,"fullname":"Hee-Jae Cha","name":null,"pid":[],"rank":24,"surname":null},{"affiliation":null,"fullname":"Yung-Hyun Choi","name":null,"pid":[],"rank":25,"surname":null},{"affiliation":null,"fullname":"Eun-Jong Cha","name":null,"pid":[],"rank":26,"surname":null},{"affiliation":null,"fullname":"Wun-Jae Kim","name":null,"pid":[],"rank":27,"surname":null}],"resulttype":{"classid":"publication","classname":"publication","schemeid":"dnet:result_typologies","schemename":"dnet:result_typologies"},"language":{"classid":"eng","classname":"English","schemeid":"dnet:languages","schemename":"dnet:languages"},"country":[],"subject":[{"dataInfo":{"deletedbyinference":false,"inferenceprovenance":"","inferred":false,"invisible":false,"provenanceaction":{"classid":"sysimport:crosswalk:repository","classname":"sysimport:crosswalk:repository","schemeid":"dnet:provenanceActions","schemename":"dnet:provenanceActions"},"trust":"0.9"},"qualifier":{"classid":"","classname":"","schemeid":"","schemename":""},"value":"MicroRNAs"},{"dataInfo":{"deletedbyinference":false,"inferenceprovenance":"","inferred":false,"invisible":false,"provenanceaction":{"classid":"sysimport:crosswalk:repository","classname":"sysimport:crosswalk:repository","schemeid":"dnet:provenanceActions","schemename":"dnet:provenanceActions"},"trust":"0.9"},"qualifier":{"classid":"","classname":"","schemeid":"","schemename":""},"value":"Prostate Neoplasms"},{"dataInfo":{"deletedbyinference":false,"inferenceprovenance":"","inferred":false,"invisible":false,"provenanceaction":{"classid":"sysimport:crosswalk:repository","classname":"sysimport:crosswalk:repository","schemeid":"dnet:provenanceActions","schemename":"dnet:provenanceActions"},"trust":"0.9"},"qualifier":{"classid":"","classname":"","schemeid":"","schemename":""},"value":"Herpesviridae"},{"dataInfo":{"deletedbyinference":false,"inferenceprovenance":"","inferred":false,"invisible":false,"provenanceaction":{"classid":"sysimport:crosswalk:repository","classname":"sysimport:crosswalk:repository","schemeid":"dnet:provenanceActions","schemename":"dnet:provenanceActions"},"trust":"0.9"},"qualifier":{"classid":"","classname":"","schemeid":"","schemename":""},"value":"Prostate Hyperplasia"},{"dataInfo":{"deletedbyinference":false,"inferenceprovenance":"","inferred":false,"invisible":false,"provenanceaction":{"classid":"sysimport:crosswalk:repository","classname":"sysimport:crosswalk:repository","schemeid":"dnet:provenanceActions","schemename":"dnet:provenanceActions"},"trust":"0.9"},"qualifier":{"classid":"","classname":"","schemeid":"","schemename":""},"value":"Diseases of the genitourinary system. Urology"},{"dataInfo":{"deletedbyinference":false,"inferenceprovenance":"","inferred":false,"invisible":false,"provenanceaction":{"classid":"sysimport:crosswalk:repository","classname":"sysimport:crosswalk:repository","schemeid":"dnet:provenanceActions","schemename":"dnet:provenanceActions"},"trust":"0.9"},"qualifier":{"classid":"","classname":"","schemeid":"","schemename":""},"value":"RC870-923"}],"description":[{"dataInfo":{"deletedbyinference":false,"inferenceprovenance":"","inferred":false,"invisible":false,"provenanceaction":{"classid":"sysimport:crosswalk:repository","classname":"sysimport:crosswalk:repository","schemeid":"dnet:provenanceActions","schemename":"dnet:provenanceActions"},"trust":"0.9"},"value":"Purpose: Previously, we reported the presence of virus-encoded microRNAs (miRNAs) in the urine of prostate cancer (CaP) patients. In this study, we investigated the expression of two herpes virus-encoded miRNAs in prostate tissue. Methods: A total of 175 tissue samples from noncancerous benign prostatic hyperplasia (BPH), 248 tissue samples from patients with CaP and BPH, and 50 samples from noncancerous surrounding tissues from these same patients were analyzed for the expression of two herpes virus-encoded miRNAs by real-time polymerase chain reaction (PCR) and immunocytochemistry using nanoparticles as molecular beacons. Results: Real-time reverse transcription-PCR results revealed significantly higher expression of hsv1-miR-H18 and hsv2-miRH9- 5p in surrounding noncancerous and CaP tissues than that in BPH tissue (each comparison, P<0.001). Of note, these miRNA were expressed equivalently in the CaP tissues and surrounding noncancerous tissues. Moreover, immunocytochemistry clearly demonstrated a significant enrichment of both hsv1-miR-H18 and hsv2-miR-H9 beacon-labeled cells in CaP and surrounding noncancerous tissue compared to that in BPH tissue (each comparison, P<0.05 for hsv1-miR-H18 and hsv2- miR-H9). Conclusions: These results suggest that increased expression of hsv1-miR-H18 and hsv2-miR-H95p might be associated with tumorigenesis in the prostate. Further studies will be required to elucidate the role of these miRNAs with respect to CaP and herpes viral infections."}],"dateofacceptance":{"dataInfo":{"deletedbyinference":false,"inferenceprovenance":"","inferred":false,"invisible":false,"provenanceaction":{"classid":"sysimport:crosswalk:repository","classname":"sysimport:crosswalk:repository","schemeid":"dnet:provenanceActions","schemename":"dnet:provenanceActions"},"trust":"0.9"},"value":"2016-06-01"},"embargoenddate":null,"resourcetype":null,"context":[],"instance":[{"accessright":{"classid":"OPEN","classname":"Open Access","schemeid":"dnet:access_modes","schemename":"dnet:access_modes"},"collectedfrom":{"dataInfo":null,"key":"10|driver______::bee53aa31dc2cbb538c10c2b65fa5824","value":"DOAJ-Articles"},"dateofacceptance":{"dataInfo":{"deletedbyinference":false,"inferenceprovenance":"","inferred":false,"invisible":false,"provenanceaction":{"classid":"sysimport:crosswalk:repository","classname":"sysimport:crosswalk:repository","schemeid":"dnet:provenanceActions","schemename":"dnet:provenanceActions"},"trust":"0.9"},"value":"2016-06-01"},"distributionlocation":"","hostedby":{"dataInfo":null,"key":"10|doajarticles::52db9a4f8e176f6e8e1d9f0c1e0a2de0","value":"International Neurourology Journal"},"instancetype":{"classid":"0001","classname":"peerReviewed","schemeid":"dnet:publication_resource","schemename":"dnet:publication_resource"},"license":null,"processingchargeamount":null,"processingchargecurrency":null,"refereed":null,"url":["http://www.einj.org/upload/pdf/inj-1632552-276.pdf","https://doaj.org/toc/2093-4777","https://doaj.org/toc/2093-6931"]}]} +{"id":"50|od_______267::b5f5da11a8239ef57655cea8675cb466","dateofcollection":"","title":[{"dataInfo":{"deletedbyinference":false,"inferenceprovenance":"","inferred":false,"invisible":false,"provenanceaction":{"classid":"sysimport:crosswalk","classname":"sysimport:crosswalk","schemeid":"dnet:provenanceActions","schemename":"dnet:provenanceActions"},"trust":"0.9"},"qualifier":{"classid":"main title","classname":"main title","schemeid":"dnet:dataCite_title","schemename":"dnet:dataCite_title"},"value":"Increased Expression of Herpes Virus-Encoded hsv1-miR-H18 and hsv2-miR-H9-5p in Cancer-Containing Prostate Tissue Compared to That in Benign Prostate Hyperplasia Tissue"}],"publisher":{"dataInfo":{"deletedbyinference":false,"inferenceprovenance":"","inferred":false,"invisible":false,"provenanceaction":{"classid":"sysimport:crosswalk","classname":"sysimport:crosswalk","schemeid":"dnet:provenanceActions","schemename":"dnet:provenanceActions"},"trust":"0.9"},"value":"Korean Continence Society"},"bestaccessright":null,"dataInfo":{"deletedbyinference":true,"inferenceprovenance":"","inferred":false,"invisible":false,"provenanceaction":{"classid":"sysimport:crosswalk","classname":"sysimport:crosswalk","schemeid":"dnet:provenanceActions","schemename":"dnet:provenanceActions"},"trust":"0.9"},"collectedfrom":[{"dataInfo":null,"key":"10|opendoar____::eda80a3d5b344bc40f3bc04f65b7a357","value":"PubMed Central"}],"pid":[{"dataInfo":{"deletedbyinference":false,"inferenceprovenance":"","inferred":false,"invisible":false,"provenanceaction":{"classid":"sysimport:crosswalk","classname":"sysimport:crosswalk","schemeid":"dnet:provenanceActions","schemename":"dnet:provenanceActions"},"trust":"0.9"},"qualifier":{"classid":"doi","classname":"doi","schemeid":"dnet:pid_types","schemename":"dnet:pid_types"},"value":"10.5213/inj.1632552.276"},{"dataInfo":{"deletedbyinference":false,"inferenceprovenance":"","inferred":false,"invisible":false,"provenanceaction":{"classid":"sysimport:crosswalk","classname":"sysimport:crosswalk","schemeid":"dnet:provenanceActions","schemename":"dnet:provenanceActions"},"trust":"0.9"},"qualifier":{"classid":"pmc","classname":"pmc","schemeid":"dnet:pid_types","schemename":"dnet:pid_types"},"value":"PMC4932644"},{"dataInfo":{"deletedbyinference":false,"inferenceprovenance":"","inferred":false,"invisible":false,"provenanceaction":{"classid":"sysimport:crosswalk","classname":"sysimport:crosswalk","schemeid":"dnet:provenanceActions","schemename":"dnet:provenanceActions"},"trust":"0.9"},"qualifier":{"classid":"pmid","classname":"pmid","schemeid":"dnet:pid_types","schemename":"dnet:pid_types"},"value":"27377944"}],"author":[{"affiliation":null,"fullname":"Yun, Seok Joong","name":"Seok Joong","pid":[{"dataInfo":{"deletedbyinference":false,"inferenceprovenance":"","inferred":false,"invisible":false,"provenanceaction":{"classid":"sysimport:crosswalk","classname":"sysimport:crosswalk","schemeid":"dnet:provenanceActions","schemename":"dnet:provenanceActions"},"trust":"0.9"},"qualifier":{"classid":"ORCID","classname":"ORCID","schemeid":"dnet:pid_types","schemename":"dnet:pid_types"},"value":"0000-0001-7737-4746"}],"rank":1,"surname":"Yun"},{"affiliation":null,"fullname":"Jeong, Pildu","name":"Pildu","pid":[{"dataInfo":{"deletedbyinference":false,"inferenceprovenance":"","inferred":false,"invisible":false,"provenanceaction":{"classid":"sysimport:crosswalk","classname":"sysimport:crosswalk","schemeid":"dnet:provenanceActions","schemename":"dnet:provenanceActions"},"trust":"0.9"},"qualifier":{"classid":"ORCID","classname":"ORCID","schemeid":"dnet:pid_types","schemename":"dnet:pid_types"},"value":"0000-0002-5602-5376"}],"rank":2,"surname":"Jeong"},{"affiliation":null,"fullname":"Kang, Ho Won","name":"Ho Won","pid":[{"dataInfo":{"deletedbyinference":false,"inferenceprovenance":"","inferred":false,"invisible":false,"provenanceaction":{"classid":"sysimport:crosswalk","classname":"sysimport:crosswalk","schemeid":"dnet:provenanceActions","schemename":"dnet:provenanceActions"},"trust":"0.9"},"qualifier":{"classid":"ORCID","classname":"ORCID","schemeid":"dnet:pid_types","schemename":"dnet:pid_types"},"value":"0000-0002-8164-4427"}],"rank":3,"surname":"Kang"},{"affiliation":null,"fullname":"Shinn, Helen Ki","name":"Helen Ki","pid":[],"rank":4,"surname":"Shinn"},{"affiliation":null,"fullname":"Kim, Ye-Hwan","name":"Ye-Hwan","pid":[{"dataInfo":{"deletedbyinference":false,"inferenceprovenance":"","inferred":false,"invisible":false,"provenanceaction":{"classid":"sysimport:crosswalk","classname":"sysimport:crosswalk","schemeid":"dnet:provenanceActions","schemename":"dnet:provenanceActions"},"trust":"0.9"},"qualifier":{"classid":"ORCID","classname":"ORCID","schemeid":"dnet:pid_types","schemename":"dnet:pid_types"},"value":"0000-0002-8676-7119"}],"rank":5,"surname":"Kim"},{"affiliation":null,"fullname":"Yan, Chunri","name":"Chunri","pid":[],"rank":6,"surname":"Yan"},{"affiliation":null,"fullname":"Choi, Young-Ki","name":"Young-Ki","pid":[{"dataInfo":{"deletedbyinference":false,"inferenceprovenance":"","inferred":false,"invisible":false,"provenanceaction":{"classid":"sysimport:crosswalk","classname":"sysimport:crosswalk","schemeid":"dnet:provenanceActions","schemename":"dnet:provenanceActions"},"trust":"0.9"},"qualifier":{"classid":"ORCID","classname":"ORCID","schemeid":"dnet:pid_types","schemename":"dnet:pid_types"},"value":"0000-0002-1894-9869"}],"rank":7,"surname":"Choi"},{"affiliation":null,"fullname":"Kim, Dongho","name":"Dongho","pid":[{"dataInfo":{"deletedbyinference":false,"inferenceprovenance":"","inferred":false,"invisible":false,"provenanceaction":{"classid":"sysimport:crosswalk","classname":"sysimport:crosswalk","schemeid":"dnet:provenanceActions","schemename":"dnet:provenanceActions"},"trust":"0.9"},"qualifier":{"classid":"ORCID","classname":"ORCID","schemeid":"dnet:pid_types","schemename":"dnet:pid_types"},"value":"0000-0002-1409-3311"}],"rank":8,"surname":"Kim"},{"affiliation":null,"fullname":"Ryu, Dong Hee","name":"Dong Hee","pid":[{"dataInfo":{"deletedbyinference":false,"inferenceprovenance":"","inferred":false,"invisible":false,"provenanceaction":{"classid":"sysimport:crosswalk","classname":"sysimport:crosswalk","schemeid":"dnet:provenanceActions","schemename":"dnet:provenanceActions"},"trust":"0.9"},"qualifier":{"classid":"ORCID","classname":"ORCID","schemeid":"dnet:pid_types","schemename":"dnet:pid_types"},"value":"0000-0001-6088-298X"}],"rank":9,"surname":"Ryu"},{"affiliation":null,"fullname":"Ha, Yun-Sok","name":"Yun-Sok","pid":[{"dataInfo":{"deletedbyinference":false,"inferenceprovenance":"","inferred":false,"invisible":false,"provenanceaction":{"classid":"sysimport:crosswalk","classname":"sysimport:crosswalk","schemeid":"dnet:provenanceActions","schemename":"dnet:provenanceActions"},"trust":"0.9"},"qualifier":{"classid":"ORCID","classname":"ORCID","schemeid":"dnet:pid_types","schemename":"dnet:pid_types"},"value":"0000-0003-3732-9814"}],"rank":10,"surname":"Ha"},{"affiliation":null,"fullname":"Kim, Tae-Hwan","name":"Tae-Hwan","pid":[],"rank":11,"surname":"Kim"},{"affiliation":null,"fullname":"Kwon, Tae Gyun","name":"Tae Gyun","pid":[{"dataInfo":{"deletedbyinference":false,"inferenceprovenance":"","inferred":false,"invisible":false,"provenanceaction":{"classid":"sysimport:crosswalk","classname":"sysimport:crosswalk","schemeid":"dnet:provenanceActions","schemename":"dnet:provenanceActions"},"trust":"0.9"},"qualifier":{"classid":"ORCID","classname":"ORCID","schemeid":"dnet:pid_types","schemename":"dnet:pid_types"},"value":"0000-0002-4390-0952"}],"rank":12,"surname":"Kwon"},{"affiliation":null,"fullname":"Kim, Jung Min","name":"Jung Min","pid":[{"dataInfo":{"deletedbyinference":false,"inferenceprovenance":"","inferred":false,"invisible":false,"provenanceaction":{"classid":"sysimport:crosswalk","classname":"sysimport:crosswalk","schemeid":"dnet:provenanceActions","schemename":"dnet:provenanceActions"},"trust":"0.9"},"qualifier":{"classid":"ORCID","classname":"ORCID","schemeid":"dnet:pid_types","schemename":"dnet:pid_types"},"value":"0000-0001-6319-0217"}],"rank":13,"surname":"Kim"},{"affiliation":null,"fullname":"Suh, Sang Heon","name":"Sang Heon","pid":[{"dataInfo":{"deletedbyinference":false,"inferenceprovenance":"","inferred":false,"invisible":false,"provenanceaction":{"classid":"sysimport:crosswalk","classname":"sysimport:crosswalk","schemeid":"dnet:provenanceActions","schemename":"dnet:provenanceActions"},"trust":"0.9"},"qualifier":{"classid":"ORCID","classname":"ORCID","schemeid":"dnet:pid_types","schemename":"dnet:pid_types"},"value":"0000-0003-4560-8880"}],"rank":14,"surname":"Suh"},{"affiliation":null,"fullname":"Kim, Seon-Kyu","name":"Seon-Kyu","pid":[{"dataInfo":{"deletedbyinference":false,"inferenceprovenance":"","inferred":false,"invisible":false,"provenanceaction":{"classid":"sysimport:crosswalk","classname":"sysimport:crosswalk","schemeid":"dnet:provenanceActions","schemename":"dnet:provenanceActions"},"trust":"0.9"},"qualifier":{"classid":"ORCID","classname":"ORCID","schemeid":"dnet:pid_types","schemename":"dnet:pid_types"},"value":"0000-0002-4176-5187"}],"rank":15,"surname":"Kim"},{"affiliation":null,"fullname":"Kim, Seon-Young","name":"Seon-Young","pid":[{"dataInfo":{"deletedbyinference":false,"inferenceprovenance":"","inferred":false,"invisible":false,"provenanceaction":{"classid":"sysimport:crosswalk","classname":"sysimport:crosswalk","schemeid":"dnet:provenanceActions","schemename":"dnet:provenanceActions"},"trust":"0.9"},"qualifier":{"classid":"ORCID","classname":"ORCID","schemeid":"dnet:pid_types","schemename":"dnet:pid_types"},"value":"0000-0002-1030-7730"}],"rank":16,"surname":"Kim"},{"affiliation":null,"fullname":"Kim, Sang Tae","name":"Sang Tae","pid":[],"rank":17,"surname":"Kim"},{"affiliation":null,"fullname":"Kim, Won Tae","name":"Won Tae","pid":[],"rank":18,"surname":"Kim"},{"affiliation":null,"fullname":"Lee, Ok-Jun","name":"Ok-Jun","pid":[],"rank":19,"surname":"Lee"},{"affiliation":null,"fullname":"Moon, Sung-Kwon","name":"Sung-Kwon","pid":[],"rank":20,"surname":"Moon"},{"affiliation":null,"fullname":"Kim, Nam-Hyung","name":"Nam-Hyung","pid":[],"rank":21,"surname":"Kim"},{"affiliation":null,"fullname":"Kim, Isaac Yi","name":"Isaac Yi","pid":[{"dataInfo":{"deletedbyinference":false,"inferenceprovenance":"","inferred":false,"invisible":false,"provenanceaction":{"classid":"sysimport:crosswalk","classname":"sysimport:crosswalk","schemeid":"dnet:provenanceActions","schemename":"dnet:provenanceActions"},"trust":"0.9"},"qualifier":{"classid":"ORCID","classname":"ORCID","schemeid":"dnet:pid_types","schemename":"dnet:pid_types"},"value":"0000-0002-1967-5281"}],"rank":22,"surname":"Kim"},{"affiliation":null,"fullname":"Kim, Jayoung","name":"Jayoung","pid":[],"rank":23,"surname":"Kim"},{"affiliation":null,"fullname":"Cha, Hee-Jae","name":"Hee-Jae","pid":[{"dataInfo":{"deletedbyinference":false,"inferenceprovenance":"","inferred":false,"invisible":false,"provenanceaction":{"classid":"sysimport:crosswalk","classname":"sysimport:crosswalk","schemeid":"dnet:provenanceActions","schemename":"dnet:provenanceActions"},"trust":"0.9"},"qualifier":{"classid":"ORCID","classname":"ORCID","schemeid":"dnet:pid_types","schemename":"dnet:pid_types"},"value":"0000-0002-6963-2685"}],"rank":24,"surname":"Cha"},{"affiliation":null,"fullname":"Choi, Yung-Hyun","name":"Yung-Hyun","pid":[{"dataInfo":{"deletedbyinference":false,"inferenceprovenance":"","inferred":false,"invisible":false,"provenanceaction":{"classid":"sysimport:crosswalk","classname":"sysimport:crosswalk","schemeid":"dnet:provenanceActions","schemename":"dnet:provenanceActions"},"trust":"0.9"},"qualifier":{"classid":"ORCID","classname":"ORCID","schemeid":"dnet:pid_types","schemename":"dnet:pid_types"},"value":"0000-0002-1454-3124"}],"rank":25,"surname":"Choi"},{"affiliation":null,"fullname":"Cha, Eun-Jong","name":"Eun-Jong","pid":[],"rank":26,"surname":"Cha"},{"affiliation":null,"fullname":"Kim, Wun-Jae","name":"Wun-Jae","pid":[{"dataInfo":{"deletedbyinference":false,"inferenceprovenance":"","inferred":false,"invisible":false,"provenanceaction":{"classid":"sysimport:crosswalk","classname":"sysimport:crosswalk","schemeid":"dnet:provenanceActions","schemename":"dnet:provenanceActions"},"trust":"0.9"},"qualifier":{"classid":"ORCID","classname":"ORCID","schemeid":"dnet:pid_types","schemename":"dnet:pid_types"},"value":"0000-0002-8060-8926"}],"rank":27,"surname":"Kim"}],"resulttype":{"classid":"publication","classname":"publication","schemeid":"dnet:result_typologies","schemename":"dnet:result_typologies"},"language":{"classid":"eng","classname":"English","schemeid":"dnet:languages","schemename":"dnet:languages"},"country":[],"subject":[{"dataInfo":{"deletedbyinference":false,"inferenceprovenance":"","inferred":false,"invisible":false,"provenanceaction":{"classid":"sysimport:crosswalk","classname":"sysimport:crosswalk","schemeid":"dnet:provenanceActions","schemename":"dnet:provenanceActions"},"trust":"0.9"},"qualifier":{"classid":"","classname":"","schemeid":"","schemename":""},"value":"Original Article"},{"dataInfo":{"deletedbyinference":false,"inferenceprovenance":"","inferred":false,"invisible":false,"provenanceaction":{"classid":"sysimport:crosswalk","classname":"sysimport:crosswalk","schemeid":"dnet:provenanceActions","schemename":"dnet:provenanceActions"},"trust":"0.9"},"qualifier":{"classid":"","classname":"","schemeid":"","schemename":""},"value":"Fundamental Science for Neurourology"},{"dataInfo":{"deletedbyinference":false,"inferenceprovenance":"","inferred":false,"invisible":false,"provenanceaction":{"classid":"sysimport:crosswalk","classname":"sysimport:crosswalk","schemeid":"dnet:provenanceActions","schemename":"dnet:provenanceActions"},"trust":"0.9"},"qualifier":{"classid":"","classname":"","schemeid":"","schemename":""},"value":"MicroRNAs"},{"dataInfo":{"deletedbyinference":false,"inferenceprovenance":"","inferred":false,"invisible":false,"provenanceaction":{"classid":"sysimport:crosswalk","classname":"sysimport:crosswalk","schemeid":"dnet:provenanceActions","schemename":"dnet:provenanceActions"},"trust":"0.9"},"qualifier":{"classid":"","classname":"","schemeid":"","schemename":""},"value":"Prostate Neoplasms"},{"dataInfo":{"deletedbyinference":false,"inferenceprovenance":"","inferred":false,"invisible":false,"provenanceaction":{"classid":"sysimport:crosswalk","classname":"sysimport:crosswalk","schemeid":"dnet:provenanceActions","schemename":"dnet:provenanceActions"},"trust":"0.9"},"qualifier":{"classid":"","classname":"","schemeid":"","schemename":""},"value":"Herpesviridae"},{"dataInfo":{"deletedbyinference":false,"inferenceprovenance":"","inferred":false,"invisible":false,"provenanceaction":{"classid":"sysimport:crosswalk","classname":"sysimport:crosswalk","schemeid":"dnet:provenanceActions","schemename":"dnet:provenanceActions"},"trust":"0.9"},"qualifier":{"classid":"","classname":"","schemeid":"","schemename":""},"value":"Prostate Hyperplasia"}],"description":[{"dataInfo":{"deletedbyinference":false,"inferenceprovenance":"","inferred":false,"invisible":false,"provenanceaction":{"classid":"sysimport:crosswalk","classname":"sysimport:crosswalk","schemeid":"dnet:provenanceActions","schemename":"dnet:provenanceActions"},"trust":"0.9"},"value":"Purpose: Previously, we reported the presence of virus-encoded microRNAs (miRNAs) in the urine of prostate cancer (CaP) patients. In this study, we investigated the expression of two herpes virus-encoded miRNAs in prostate tissue. Methods: A total of 175 tissue samples from noncancerous benign prostatic hyperplasia (BPH), 248 tissue samples from patients with CaP and BPH, and 50 samples from noncancerous surrounding tissues from these same patients were analyzed for the expression of two herpes virus-encoded miRNAs by real-time polymerase chain reaction (PCR) and immunocytochemistry using nanoparticles as molecular beacons. Results: Real-time reverse transcription-PCR results revealed significantly higher expression of hsv1-miR-H18 and hsv2-miRH9- 5p in surrounding noncancerous and CaP tissues than that in BPH tissue (each comparison, P<0.001). Of note, these miRNA were expressed equivalently in the CaP tissues and surrounding noncancerous tissues. Moreover, immunocytochemistry clearly demonstrated a significant enrichment of both hsv1-miR-H18 and hsv2-miR-H9 beacon-labeled cells in CaP and surrounding noncancerous tissue compared to that in BPH tissue (each comparison, P<0.05 for hsv1-miR-H18 and hsv2- miR-H9). Conclusions: These results suggest that increased expression of hsv1-miR-H18 and hsv2-miR-H95p might be associated with tumorigenesis in the prostate. Further studies will be required to elucidate the role of these miRNAs with respect to CaP and herpes viral infections."}],"dateofacceptance":{"dataInfo":{"deletedbyinference":false,"inferenceprovenance":"","inferred":false,"invisible":false,"provenanceaction":{"classid":"sysimport:crosswalk","classname":"sysimport:crosswalk","schemeid":"dnet:provenanceActions","schemename":"dnet:provenanceActions"},"trust":"0.9"},"value":"2016-06-01"},"embargoenddate":null,"resourcetype":null,"context":[],"instance":[{"accessright":{"classid":"OPEN","classname":"Open Access","schemeid":"dnet:access_modes","schemename":"dnet:access_modes"},"collectedfrom":{"dataInfo":null,"key":"10|opendoar____::eda80a3d5b344bc40f3bc04f65b7a357","value":"PubMed Central"},"dateofacceptance":{"dataInfo":{"deletedbyinference":false,"inferenceprovenance":"","inferred":false,"invisible":false,"provenanceaction":{"classid":"sysimport:crosswalk","classname":"sysimport:crosswalk","schemeid":"dnet:provenanceActions","schemename":"dnet:provenanceActions"},"trust":"0.9"},"value":"2016-06-01"},"distributionlocation":"","hostedby":{"dataInfo":null,"key":"10|opendoar____::8b6dd7db9af49e67306feb59a8bdc52c","value":"Europe PubMed Central"},"instancetype":{"classid":"0001","classname":"peerReviewed","schemeid":"dnet:publication_resource","schemename":"dnet:publication_resource"},"license":null,"processingchargeamount":null,"processingchargecurrency":null,"refereed":null,"url":["http://europepmc.org/articles/PMC4932644"]}]} +{"id":"50|doiboost____::0ca46ff10b2b4c756191719d85302b14","dateofcollection":"2019-02-15","title":[{"dataInfo":{"deletedbyinference":false,"inferenceprovenance":"","inferred":false,"invisible":false,"provenanceaction":{"classid":"","classname":"","schemeid":"","schemename":""},"trust":""},"qualifier":{"classid":"main title","classname":"main title","schemeid":"dnet:dataCite_title","schemename":"dnet:dataCite_title"},"value":"Increased Expression of Herpes Virus-Encoded hsv1-miR-H18 and hsv2-miR-H9-5p in Cancer-Containing Prostate Tissue Compared to That in Benign Prostate Hyperplasia Tissue"}],"publisher":{"dataInfo":{"deletedbyinference":false,"inferenceprovenance":"","inferred":false,"invisible":false,"provenanceaction":{"classid":"","classname":"","schemeid":"","schemename":""},"trust":""},"value":""},"bestaccessright":{"classid":"OPEN","classname":"Open Access","schemeid":"dnet:access_modes","schemename":"dnet:access_modes"},"dataInfo":{"deletedbyinference":true,"inferenceprovenance":"","inferred":false,"invisible":false,"provenanceaction":{"classid":"sysimport:actionset","classname":"sysimport:actionset","schemeid":"dnet:provenanceActions","schemename":"dnet:provenanceActions"},"trust":"0.9"},"collectedfrom":[{"dataInfo":{"deletedbyinference":false,"inferenceprovenance":"","inferred":false,"invisible":false,"provenanceaction":{"classid":"","classname":"","schemeid":"","schemename":""},"trust":""},"key":"10|openaire____::081b82f96300b6a6e3d282bad31cb6e2","value":"Crossref"},{"dataInfo":{"deletedbyinference":false,"inferenceprovenance":"","inferred":false,"invisible":false,"provenanceaction":{"classid":"","classname":"","schemeid":"","schemename":""},"trust":""},"key":"10|openaire____::5f532a3fc4f1ea403f37070f59a7a53a","value":"Microsoft Academic Graph"},{"dataInfo":{"deletedbyinference":false,"inferenceprovenance":"","inferred":false,"invisible":false,"provenanceaction":{"classid":"","classname":"","schemeid":"","schemename":""},"trust":""},"key":"10|openaire____::8ac8380272269217cb09a928c8caa993","value":"UnpayWall"}],"pid":[{"dataInfo":{"deletedbyinference":false,"inferenceprovenance":"","inferred":false,"invisible":false,"provenanceaction":{"classid":"","classname":"","schemeid":"","schemename":""},"trust":""},"qualifier":{"classid":"doi","classname":"doi","schemeid":"dnet:pid_types","schemename":"dnet:pid_types"},"value":"10.5213/inj.1632552.276"}],"author":[{"affiliation":[{"dataInfo":{"deletedbyinference":false,"inferenceprovenance":"","inferred":false,"invisible":false,"provenanceaction":{"classid":"","classname":"","schemeid":"","schemename":""},"trust":""},"value":"Chungbuk National University"}],"fullname":"Seok Joong Yun","name":"Seok Joong","pid":[{"dataInfo":null,"qualifier":{"classid":"MAG Identifier","classname":"MAG Identifier","schemeid":null,"schemename":null},"value":"2105974574"}],"rank":1,"surname":"Yun"},{"affiliation":[{"dataInfo":{"deletedbyinference":false,"inferenceprovenance":"","inferred":false,"invisible":false,"provenanceaction":{"classid":"","classname":"","schemeid":"","schemename":""},"trust":""},"value":"Chungbuk National University"}],"fullname":"Pildu Jeong","name":"Pildu","pid":[{"dataInfo":null,"qualifier":{"classid":"MAG Identifier","classname":"MAG Identifier","schemeid":null,"schemename":null},"value":"2041919263"}],"rank":2,"surname":"Jeong"},{"affiliation":[{"dataInfo":{"deletedbyinference":false,"inferenceprovenance":"","inferred":false,"invisible":false,"provenanceaction":{"classid":"","classname":"","schemeid":"","schemename":""},"trust":""},"value":"Chungbuk National University"}],"fullname":"Ho Won Kang","name":"Ho Won","pid":[{"dataInfo":null,"qualifier":{"classid":"MAG Identifier","classname":"MAG Identifier","schemeid":null,"schemename":null},"value":"2164408067"}],"rank":3,"surname":"Kang"},{"affiliation":[{"dataInfo":{"deletedbyinference":false,"inferenceprovenance":"","inferred":false,"invisible":false,"provenanceaction":{"classid":"","classname":"","schemeid":"","schemename":""},"trust":""},"value":"Inha University"}],"fullname":"Helen Ki Shinn","name":"Helen Ki","pid":[{"dataInfo":null,"qualifier":{"classid":"MAG Identifier","classname":"MAG Identifier","schemeid":null,"schemename":null},"value":"2045077081"}],"rank":4,"surname":"Shinn"},{"affiliation":[{"dataInfo":{"deletedbyinference":false,"inferenceprovenance":"","inferred":false,"invisible":false,"provenanceaction":{"classid":"","classname":"","schemeid":"","schemename":""},"trust":""},"value":"Chungbuk National University"}],"fullname":"Ye-Hwan Kim","name":"Ye-Hwan","pid":[{"dataInfo":null,"qualifier":{"classid":"MAG Identifier","classname":"MAG Identifier","schemeid":null,"schemename":null},"value":"2276303457"}],"rank":5,"surname":"Kim"},{"affiliation":[{"dataInfo":{"deletedbyinference":false,"inferenceprovenance":"","inferred":false,"invisible":false,"provenanceaction":{"classid":"","classname":"","schemeid":"","schemename":""},"trust":""},"value":"Chungbuk National University"}],"fullname":"Chunri Yan","name":"Chunri","pid":[{"dataInfo":null,"qualifier":{"classid":"MAG Identifier","classname":"MAG Identifier","schemeid":null,"schemename":null},"value":"2186750404"}],"rank":6,"surname":"Yan"},{"affiliation":[{"dataInfo":{"deletedbyinference":false,"inferenceprovenance":"","inferred":false,"invisible":false,"provenanceaction":{"classid":"","classname":"","schemeid":"","schemename":""},"trust":""},"value":"Chungbuk National University"}],"fullname":"Young-Ki Choi","name":"Young-Ki","pid":[{"dataInfo":null,"qualifier":{"classid":"MAG Identifier","classname":"MAG Identifier","schemeid":null,"schemename":null},"value":"2311466124"}],"rank":7,"surname":"Choi"},{"affiliation":[],"fullname":"Dongho Kim","name":"Dongho","pid":[{"dataInfo":null,"qualifier":{"classid":"MAG Identifier","classname":"MAG Identifier","schemeid":null,"schemename":null},"value":"2644843893"}],"rank":8,"surname":"Kim"},{"affiliation":[{"dataInfo":{"deletedbyinference":false,"inferenceprovenance":"","inferred":false,"invisible":false,"provenanceaction":{"classid":"","classname":"","schemeid":"","schemename":""},"trust":""},"value":"Chungbuk National University"}],"fullname":"Dong Hee Ryu","name":"Dong Hee","pid":[{"dataInfo":null,"qualifier":{"classid":"MAG Identifier","classname":"MAG Identifier","schemeid":null,"schemename":null},"value":"2117604941"}],"rank":9,"surname":"Ryu"},{"affiliation":[{"dataInfo":{"deletedbyinference":false,"inferenceprovenance":"","inferred":false,"invisible":false,"provenanceaction":{"classid":"","classname":"","schemeid":"","schemename":""},"trust":""},"value":"Kyungpook National University"}],"fullname":"Yun-Sok Ha","name":"Yun-Sok","pid":[{"dataInfo":null,"qualifier":{"classid":"MAG Identifier","classname":"MAG Identifier","schemeid":null,"schemename":null},"value":"2145233282"}],"rank":10,"surname":"Ha"},{"affiliation":[{"dataInfo":{"deletedbyinference":false,"inferenceprovenance":"","inferred":false,"invisible":false,"provenanceaction":{"classid":"","classname":"","schemeid":"","schemename":""},"trust":""},"value":"Kyungpook National University"}],"fullname":"Tae-Hwan Kim","name":"Tae-Hwan","pid":[{"dataInfo":null,"qualifier":{"classid":"MAG Identifier","classname":"MAG Identifier","schemeid":null,"schemename":null},"value":"2509096378"}],"rank":11,"surname":"Kim"},{"affiliation":[{"dataInfo":{"deletedbyinference":false,"inferenceprovenance":"","inferred":false,"invisible":false,"provenanceaction":{"classid":"","classname":"","schemeid":"","schemename":""},"trust":""},"value":"Kyungpook National University"}],"fullname":"Tae Gyun Kwon","name":"Tae Gyun","pid":[{"dataInfo":null,"qualifier":{"classid":"MAG Identifier","classname":"MAG Identifier","schemeid":null,"schemename":null},"value":"1978978081"}],"rank":12,"surname":"Kwon"},{"affiliation":[{"dataInfo":{"deletedbyinference":false,"inferenceprovenance":"","inferred":false,"invisible":false,"provenanceaction":{"classid":"","classname":"","schemeid":"","schemename":""},"trust":""},"value":"Daejeon University"}],"fullname":"Jung Min Kim","name":"Jung Min","pid":[{"dataInfo":null,"qualifier":{"classid":"MAG Identifier","classname":"MAG Identifier","schemeid":null,"schemename":null},"value":"2265841962"}],"rank":13,"surname":"Kim"},{"affiliation":[{"dataInfo":{"deletedbyinference":false,"inferenceprovenance":"","inferred":false,"invisible":false,"provenanceaction":{"classid":"","classname":"","schemeid":"","schemename":""},"trust":""},"value":"KAIST"}],"fullname":"Sang Heon Suh","name":"Sang Heon","pid":[{"dataInfo":null,"qualifier":{"classid":"MAG Identifier","classname":"MAG Identifier","schemeid":null,"schemename":null},"value":"2890693470"}],"rank":14,"surname":"Suh"},{"affiliation":[{"dataInfo":{"deletedbyinference":false,"inferenceprovenance":"","inferred":false,"invisible":false,"provenanceaction":{"classid":"","classname":"","schemeid":"","schemename":""},"trust":""},"value":"Korea Research Institute of Bioscience and Biotechnology"}],"fullname":"Seon-Kyu Kim","name":"Seon-Kyu","pid":[{"dataInfo":null,"qualifier":{"classid":"MAG Identifier","classname":"MAG Identifier","schemeid":null,"schemename":null},"value":"2162364977"}],"rank":15,"surname":"Kim"},{"affiliation":[{"dataInfo":{"deletedbyinference":false,"inferenceprovenance":"","inferred":false,"invisible":false,"provenanceaction":{"classid":"","classname":"","schemeid":"","schemename":""},"trust":""},"value":"Korea Research Institute of Bioscience and Biotechnology"}],"fullname":"Seon-Young Kim","name":"Seon-Young","pid":[{"dataInfo":null,"qualifier":{"classid":"MAG Identifier","classname":"MAG Identifier","schemeid":null,"schemename":null},"value":"2344797375"}],"rank":16,"surname":"Kim"},{"affiliation":[{"dataInfo":{"deletedbyinference":false,"inferenceprovenance":"","inferred":false,"invisible":false,"provenanceaction":{"classid":"","classname":"","schemeid":"","schemename":""},"trust":""},"value":"Seoul National University Bundang Hospital"}],"fullname":"Sang Tae Kim","name":"Sang Tae","pid":[{"dataInfo":null,"qualifier":{"classid":"MAG Identifier","classname":"MAG Identifier","schemeid":null,"schemename":null},"value":"2257827509"}],"rank":17,"surname":"Kim"},{"affiliation":[{"dataInfo":{"deletedbyinference":false,"inferenceprovenance":"","inferred":false,"invisible":false,"provenanceaction":{"classid":"","classname":"","schemeid":"","schemename":""},"trust":""},"value":"Chungbuk National University"}],"fullname":"Won Tae Kim","name":"Won Tae","pid":[{"dataInfo":null,"qualifier":{"classid":"MAG Identifier","classname":"MAG Identifier","schemeid":null,"schemename":null},"value":"2617237649"}],"rank":18,"surname":"Kim"},{"affiliation":[{"dataInfo":{"deletedbyinference":false,"inferenceprovenance":"","inferred":false,"invisible":false,"provenanceaction":{"classid":"","classname":"","schemeid":"","schemename":""},"trust":""},"value":"Chungbuk National University"}],"fullname":"Ok-Jun Lee","name":"Ok-Jun","pid":[{"dataInfo":null,"qualifier":{"classid":"MAG Identifier","classname":"MAG Identifier","schemeid":null,"schemename":null},"value":"2112231548"}],"rank":19,"surname":"Lee"},{"affiliation":[{"dataInfo":{"deletedbyinference":false,"inferenceprovenance":"","inferred":false,"invisible":false,"provenanceaction":{"classid":"","classname":"","schemeid":"","schemename":""},"trust":""},"value":"Chung-Ang University"}],"fullname":"Sung-Kwon Moon","name":"Sung-Kwon","pid":[{"dataInfo":null,"qualifier":{"classid":"MAG Identifier","classname":"MAG Identifier","schemeid":null,"schemename":null},"value":"2796689429"}],"rank":20,"surname":"Moon"},{"affiliation":[{"dataInfo":{"deletedbyinference":false,"inferenceprovenance":"","inferred":false,"invisible":false,"provenanceaction":{"classid":"","classname":"","schemeid":"","schemename":""},"trust":""},"value":"Chungbuk National University"}],"fullname":"Nam-Hyung Kim","name":"Nam-Hyung","pid":[{"dataInfo":null,"qualifier":{"classid":"MAG Identifier","classname":"MAG Identifier","schemeid":null,"schemename":null},"value":"2136287741"}],"rank":21,"surname":"Kim"},{"affiliation":[{"dataInfo":{"deletedbyinference":false,"inferenceprovenance":"","inferred":false,"invisible":false,"provenanceaction":{"classid":"","classname":"","schemeid":"","schemename":""},"trust":""},"value":"Rutgers University"}],"fullname":"Isaac Yi Kim","name":"Isaac Yi","pid":[{"dataInfo":null,"qualifier":{"classid":"MAG Identifier","classname":"MAG Identifier","schemeid":null,"schemename":null},"value":"2015295992"}],"rank":22,"surname":"Kim"},{"affiliation":[{"dataInfo":{"deletedbyinference":false,"inferenceprovenance":"","inferred":false,"invisible":false,"provenanceaction":{"classid":"","classname":"","schemeid":"","schemename":""},"trust":""},"value":"Harvard University"}],"fullname":"Jayoung Kim","name":"Jayoung","pid":[{"dataInfo":null,"qualifier":{"classid":"MAG Identifier","classname":"MAG Identifier","schemeid":null,"schemename":null},"value":"2130848131"}],"rank":23,"surname":"Kim"},{"affiliation":[{"dataInfo":{"deletedbyinference":false,"inferenceprovenance":"","inferred":false,"invisible":false,"provenanceaction":{"classid":"","classname":"","schemeid":"","schemename":""},"trust":""},"value":"Kosin University"}],"fullname":"Hee-Jae Cha","name":"Hee-Jae","pid":[{"dataInfo":null,"qualifier":{"classid":"MAG Identifier","classname":"MAG Identifier","schemeid":null,"schemename":null},"value":"2113489867"}],"rank":24,"surname":"Cha"},{"affiliation":[],"fullname":"Yung-Hyun Choi","name":"Yung-Hyun","pid":[{"dataInfo":null,"qualifier":{"classid":"MAG Identifier","classname":"MAG Identifier","schemeid":null,"schemename":null},"value":"2151282194"}],"rank":25,"surname":"Choi"},{"affiliation":[{"dataInfo":{"deletedbyinference":false,"inferenceprovenance":"","inferred":false,"invisible":false,"provenanceaction":{"classid":"","classname":"","schemeid":"","schemename":""},"trust":""},"value":"Chungbuk National University"}],"fullname":"Eun-Jong Cha","name":"Eun-Jong","pid":[{"dataInfo":null,"qualifier":{"classid":"MAG Identifier","classname":"MAG Identifier","schemeid":null,"schemename":null},"value":"2109572239"}],"rank":26,"surname":"Cha"},{"affiliation":[{"dataInfo":{"deletedbyinference":false,"inferenceprovenance":"","inferred":false,"invisible":false,"provenanceaction":{"classid":"","classname":"","schemeid":"","schemename":""},"trust":""},"value":"Chungbuk National University"}],"fullname":"Wun-Jae Kim","name":"Wun-Jae","pid":[{"dataInfo":null,"qualifier":{"classid":"MAG Identifier","classname":"MAG Identifier","schemeid":null,"schemename":null},"value":"2113339670"}],"rank":27,"surname":"Kim"}],"resulttype":{"classid":"publication","classname":"publication","schemeid":"dnet:result_typologies","schemename":"dnet:result_typologies"},"language":{"classid":"und","classname":"Undetermined","schemeid":"dnet:languages","schemename":"dnet:languages"},"country":[],"subject":[],"description":[{"dataInfo":{"deletedbyinference":false,"inferenceprovenance":"","inferred":false,"invisible":false,"provenanceaction":{"classid":"","classname":"","schemeid":"","schemename":""},"trust":""},"value":"Purpose:"}],"dateofacceptance":null,"embargoenddate":null,"resourcetype":null,"context":null,"instance":null} \ No newline at end of file From d47352cbc7daf9d5c20a92c97953c15b1aff19c0 Mon Sep 17 00:00:00 2001 From: miconis Date: Fri, 24 Jul 2020 20:10:47 +0200 Subject: [PATCH 02/12] refactoring of the procedure for the id generation, minor changes and addition of a comparation on the original id and the origin datasource --- .../eu/dnetlib/dhp/oa/dedup/DatePicker.java | 2 +- .../dhp/oa/dedup/DedupRecordFactory.java | 70 +-------------- .../eu/dnetlib/dhp/oa/dedup/IdGenerator.java | 90 +++++++++++++++++++ .../eu/dnetlib/dhp/oa/dedup/Identifier.java | 83 ++++++++++++++++- .../java/eu/dnetlib/dhp/oa/dedup/PidType.java | 33 +------ .../dhp/oa/dedup/EntityMergerTest.java | 34 +++++-- .../dhp/dedup/json/publication_merge4.json | 3 + .../dhp/dedup/json/publication_merge5.json | 3 + 8 files changed, 212 insertions(+), 106 deletions(-) create mode 100644 dhp-workflows/dhp-dedup-openaire/src/main/java/eu/dnetlib/dhp/oa/dedup/IdGenerator.java create mode 100644 dhp-workflows/dhp-dedup-openaire/src/test/resources/eu/dnetlib/dhp/dedup/json/publication_merge4.json create mode 100644 dhp-workflows/dhp-dedup-openaire/src/test/resources/eu/dnetlib/dhp/dedup/json/publication_merge5.json diff --git a/dhp-workflows/dhp-dedup-openaire/src/main/java/eu/dnetlib/dhp/oa/dedup/DatePicker.java b/dhp-workflows/dhp-dedup-openaire/src/main/java/eu/dnetlib/dhp/oa/dedup/DatePicker.java index d6b8bf71c..c2fe09a4d 100644 --- a/dhp-workflows/dhp-dedup-openaire/src/main/java/eu/dnetlib/dhp/oa/dedup/DatePicker.java +++ b/dhp-workflows/dhp-dedup-openaire/src/main/java/eu/dnetlib/dhp/oa/dedup/DatePicker.java @@ -18,7 +18,7 @@ import eu.dnetlib.dhp.schema.oaf.Field; public class DatePicker { - private static final String DATE_PATTERN = "\\d{4}-\\d{2}-\\d{2}"; + public static final String DATE_PATTERN = "\\d{4}-\\d{2}-\\d{2}"; private static final String DATE_DEFAULT_SUFFIX = "01-01"; private static final int YEAR_LB = 1300; private static final int YEAR_UB = Year.now().getValue() + 5; diff --git a/dhp-workflows/dhp-dedup-openaire/src/main/java/eu/dnetlib/dhp/oa/dedup/DedupRecordFactory.java b/dhp-workflows/dhp-dedup-openaire/src/main/java/eu/dnetlib/dhp/oa/dedup/DedupRecordFactory.java index 7f04afe8a..0fc393ea5 100644 --- a/dhp-workflows/dhp-dedup-openaire/src/main/java/eu/dnetlib/dhp/oa/dedup/DedupRecordFactory.java +++ b/dhp-workflows/dhp-dedup-openaire/src/main/java/eu/dnetlib/dhp/oa/dedup/DedupRecordFactory.java @@ -4,6 +4,7 @@ package eu.dnetlib.dhp.oa.dedup; import com.fasterxml.jackson.databind.DeserializationFeature; import com.fasterxml.jackson.databind.ObjectMapper; import com.google.common.collect.Lists; +import eu.dnetlib.dhp.schema.common.EntityType; import eu.dnetlib.dhp.schema.common.ModelSupport; import eu.dnetlib.dhp.schema.oaf.*; import org.apache.commons.lang.StringUtils; @@ -75,8 +76,6 @@ public class DedupRecordFactory { String id, Iterator> entities, long ts, DataInfo dataInfo, Class clazz) throws IllegalAccessException, InstantiationException { - SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); - T entity = clazz.newInstance(); final Collection dates = Lists.newArrayList(); @@ -88,9 +87,8 @@ public class DedupRecordFactory { t -> { T duplicate = t._2(); - StructuredProperty bestPid = bestPid(duplicate.getPid()); - if (bestPid != null) - bestPids.add(new Identifier(bestPid, extractDate(duplicate, sdf), PidType.classidValueOf(bestPid.getQualifier().getClassid()))); + //prepare the list of pids to use for the id generation + bestPids.addAll(IdGenerator.bestPidtoIdentifier(duplicate)); entity.mergeFrom(duplicate); if (ModelSupport.isSubClass(duplicate, Result.class)) { @@ -109,11 +107,7 @@ public class DedupRecordFactory { ((Result) entity).setAuthor(AuthorMerger.merge(authors)); } - Identifier bestPid = winnerPid(bestPids); - if (bestPid == null) - entity.setId(id); - else - entity.setId(id.split("\\|")[0] + "|" + createPrefix(bestPid.getPid().getQualifier().getClassid()) + "::" + DedupUtility.md5(bestPid.getPid().getValue())); + entity.setId(IdGenerator.generate(bestPids, id)); entity.setLastupdatetimestamp(ts); entity.setDataInfo(dataInfo); @@ -121,61 +115,5 @@ public class DedupRecordFactory { return entity; } - //pick the best pid from the list (consider date and pidtype) - public static Identifier winnerPid(List pids) { - if (pids == null || pids.size() == 0) - return null; - Optional bp = pids.stream() - .filter(pid -> pid.getType() != PidType.undefined) - .max(Identifier::compareTo); - return bp.orElse(null); - } - - //pick the best pid from the entity - public static StructuredProperty bestPid(List pids) { - - if (pids == null || pids.size() == 0) - return null; - Optional bp = pids.stream() - .filter(pid -> PidType.classidValueOf(pid.getQualifier().getClassid()) != PidType.undefined) - .max(Comparator.comparing(pid -> PidType.classidValueOf(pid.getQualifier().getClassid()))); - - return bp.orElse(null); - } - - //create the prefix (length = 12): dedup_+ pidType - public static String createPrefix(String pidType) { - - StringBuilder prefix = new StringBuilder("dedup_" + pidType); - - while (prefix.length() < 12) { - prefix.append("_"); - } - return prefix.toString().substring(0, 12); - - } - - //extracts the date from the record. If the date is not available or is not wellformed, it returns a base date: 00-01-01 - public static Date extractDate(T duplicate, SimpleDateFormat sdf){ - - String date = "2000-01-01"; - if (ModelSupport.isSubClass(duplicate, Result.class)) { - Result result = (Result) duplicate; - if (isWellformed(result.getDateofacceptance())){ - date = result.getDateofacceptance().getValue(); - } - } - - try { - return sdf.parse(date); - } catch (ParseException e) { - return new Date(); - } - - } - - public static boolean isWellformed(Field date) { - return date != null && StringUtils.isNotBlank(date.getValue()) && date.getValue().matches("\\d{4}-\\d{2}-\\d{2}") && DatePicker.inRange(date.getValue()); - } } diff --git a/dhp-workflows/dhp-dedup-openaire/src/main/java/eu/dnetlib/dhp/oa/dedup/IdGenerator.java b/dhp-workflows/dhp-dedup-openaire/src/main/java/eu/dnetlib/dhp/oa/dedup/IdGenerator.java new file mode 100644 index 000000000..2d203a1b1 --- /dev/null +++ b/dhp-workflows/dhp-dedup-openaire/src/main/java/eu/dnetlib/dhp/oa/dedup/IdGenerator.java @@ -0,0 +1,90 @@ +package eu.dnetlib.dhp.oa.dedup; + +import com.google.common.collect.Lists; +import eu.dnetlib.dhp.schema.common.EntityType; +import eu.dnetlib.dhp.schema.common.ModelSupport; +import eu.dnetlib.dhp.schema.oaf.Field; +import eu.dnetlib.dhp.schema.oaf.OafEntity; +import eu.dnetlib.dhp.schema.oaf.Result; +import eu.dnetlib.dhp.schema.oaf.StructuredProperty; +import org.apache.commons.lang.NullArgumentException; +import org.apache.commons.lang.StringUtils; + +import java.io.Serializable; +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.*; + +public class IdGenerator implements Serializable { + + private static SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); + public static String CROSSREF_ID = "10|openaire____::081b82f96300b6a6e3d282bad31cb6e2"; + public static String DATACITE_ID = "10|openaire____::9e3be59865b2c1c335d32dae2fe7b254"; + + //pick the best pid from the list (consider date and pidtype) + public static String generate(List pids, String defaultID) { + if (pids == null || pids.size() == 0) + return defaultID; + + Optional bp = pids.stream() + .max(Identifier::compareTo); + + if (bp.get().isUseOriginal() || bp.get().getPid().getValue() == null) { + return bp.get().getOriginalID().split("\\|")[0] + "|dedup_wf_001::" + DedupUtility.md5(bp.get().getOriginalID()); + } else { + return bp.get().getOriginalID().split("\\|")[0] + "|" + createPrefix(bp.get().getPid().getQualifier().getClassid()) + "::" + DedupUtility.md5(bp.get().getPid().getValue()); + } + + } + + //pick the best pid from the entity. Returns a list (length 1) to save time in the call + public static List bestPidtoIdentifier(T entity) { + + if (entity.getPid() == null || entity.getPid().size() == 0) + return Lists.newArrayList(new Identifier(new StructuredProperty(), new Date(), PidType.original, entity.getCollectedfrom(), EntityType.fromClass(entity.getClass()), entity.getId())); + + Optional bp = entity.getPid().stream() + .filter(pid -> PidType.classidValueOf(pid.getQualifier().getClassid()) != PidType.undefined) + .max(Comparator.comparing(pid -> PidType.classidValueOf(pid.getQualifier().getClassid()))); + + return bp.map(structuredProperty -> + Lists.newArrayList(new Identifier(structuredProperty, extractDate(entity, sdf), PidType.classidValueOf(structuredProperty.getQualifier().getClassid()), entity.getCollectedfrom(), EntityType.fromClass(entity.getClass()), entity.getId())) + ).orElseGet(() -> Lists.newArrayList(new Identifier(new StructuredProperty(), new Date(), PidType.original, entity.getCollectedfrom(), EntityType.fromClass(entity.getClass()), entity.getId()))); + + } + + //create the prefix (length = 12): dedup_+ pidType + public static String createPrefix(String pidType) { + + StringBuilder prefix = new StringBuilder("dedup_" + pidType); + + while (prefix.length() < 12) { + prefix.append("_"); + } + return prefix.toString().substring(0, 12); + + } + + //extracts the date from the record. If the date is not available or is not wellformed, it returns a base date: 00-01-01 + public static Date extractDate(T duplicate, SimpleDateFormat sdf){ + + String date = "2000-01-01"; + if (ModelSupport.isSubClass(duplicate, Result.class)) { + Result result = (Result) duplicate; + if (isWellformed(result.getDateofacceptance())){ + date = result.getDateofacceptance().getValue(); + } + } + + try { + return sdf.parse(date); + } catch (ParseException e) { + return new Date(); + } + + } + + public static boolean isWellformed(Field date) { + return date != null && StringUtils.isNotBlank(date.getValue()) && date.getValue().matches(DatePicker.DATE_PATTERN) && DatePicker.inRange(date.getValue()); + } +} diff --git a/dhp-workflows/dhp-dedup-openaire/src/main/java/eu/dnetlib/dhp/oa/dedup/Identifier.java b/dhp-workflows/dhp-dedup-openaire/src/main/java/eu/dnetlib/dhp/oa/dedup/Identifier.java index 3d92900ca..fd52d20f9 100644 --- a/dhp-workflows/dhp-dedup-openaire/src/main/java/eu/dnetlib/dhp/oa/dedup/Identifier.java +++ b/dhp-workflows/dhp-dedup-openaire/src/main/java/eu/dnetlib/dhp/oa/dedup/Identifier.java @@ -1,20 +1,31 @@ package eu.dnetlib.dhp.oa.dedup; +import eu.dnetlib.dhp.schema.common.EntityType; +import eu.dnetlib.dhp.schema.oaf.KeyValue; import eu.dnetlib.dhp.schema.oaf.StructuredProperty; import java.io.Serializable; import java.util.Date; +import java.util.List; public class Identifier implements Serializable, Comparable{ StructuredProperty pid; Date date; PidType type; + List collectedFrom; + EntityType entityType; + String originalID; - public Identifier(StructuredProperty pid, Date date, PidType type) { + boolean useOriginal = false; //to know if the top identifier won because of the alphabetical order of the original ID + + public Identifier(StructuredProperty pid, Date date, PidType type, List collectedFrom, EntityType entityType, String originalID) { this.pid = pid; this.date = date; this.type = type; + this.collectedFrom = collectedFrom; + this.entityType = entityType; + this.originalID = originalID; } public StructuredProperty getPid() { @@ -41,15 +52,81 @@ public class Identifier implements Serializable, Comparable{ this.type = type; } + public List getCollectedFrom() { + return collectedFrom; + } + + public void setCollectedFrom(List collectedFrom) { + this.collectedFrom = collectedFrom; + } + + public EntityType getEntityType() { + return entityType; + } + + public void setEntityType(EntityType entityType) { + this.entityType = entityType; + } + + public String getOriginalID() { + return originalID; + } + + public void setOriginalID(String originalID) { + this.originalID = originalID; + } + + public boolean isUseOriginal() { + return useOriginal; + } + + public void setUseOriginal(boolean useOriginal) { + this.useOriginal = useOriginal; + } + @Override public int compareTo(Identifier i) { - //priority in comparisons: 1) pidtype, 2) date + //priority in comparisons: 1) pidtype, 2) collectedfrom (depending on the entity type) , 3) date 4) alphabetical order of the originalID if (this.getType().compareTo(i.getType()) == 0){ //same type - return this.getDate().compareTo(date); + if (entityType == EntityType.publication) { + if (isFromDatasourceID(this.collectedFrom, IdGenerator.CROSSREF_ID) && !isFromDatasourceID(i.collectedFrom, IdGenerator.CROSSREF_ID)) + return 1; + if (isFromDatasourceID(i.collectedFrom, IdGenerator.CROSSREF_ID) && !isFromDatasourceID(this.collectedFrom, IdGenerator.CROSSREF_ID)) + return -1; + } + if (entityType == EntityType.dataset) { + if (isFromDatasourceID(this.collectedFrom, IdGenerator.DATACITE_ID) && !isFromDatasourceID(i.collectedFrom, IdGenerator.DATACITE_ID)) + return 1; + if (isFromDatasourceID(i.collectedFrom, IdGenerator.DATACITE_ID) && !isFromDatasourceID(this.collectedFrom, IdGenerator.DATACITE_ID)) + return -1; + } + + if (this.getDate().compareTo(date) == 0) {//same date + + if (this.originalID.compareTo(i.originalID) > 0) + this.useOriginal = true; + else + i.setUseOriginal(true); + + //the minus because we need to take the alphabetically lower id + return -this.originalID.compareTo(i.originalID); + } + else + //the minus is because we need to take the elder date + return -this.getDate().compareTo(date); } else { return this.getType().compareTo(i.getType()); } } + + public boolean isFromDatasourceID(List collectedFrom, String dsId){ + + for(KeyValue cf: collectedFrom) { + if(cf.getKey().equals(dsId)) + return true; + } + return false; + } } diff --git a/dhp-workflows/dhp-dedup-openaire/src/main/java/eu/dnetlib/dhp/oa/dedup/PidType.java b/dhp-workflows/dhp-dedup-openaire/src/main/java/eu/dnetlib/dhp/oa/dedup/PidType.java index c0af44b1e..ab5c49868 100644 --- a/dhp-workflows/dhp-dedup-openaire/src/main/java/eu/dnetlib/dhp/oa/dedup/PidType.java +++ b/dhp-workflows/dhp-dedup-openaire/src/main/java/eu/dnetlib/dhp/oa/dedup/PidType.java @@ -4,6 +4,7 @@ public enum PidType { //from the less to the more important undefined, + original, orcid, ror, grid, @@ -21,34 +22,4 @@ public enum PidType { } } -} - -//dnet:pid_types -//"actrn" -//"nct" -//"euctr" -//"epo_id" -//"gsk" -//"GeoPass" -//"GBIF" -//"isrctn" -//"ISNI" -//"jprn" -//"mag_id" -//"oai" -//"orcid" -//"PANGAEA" -//"epo_nr_epodoc" -//"UNKNOWN" -//"VIAF" -//"arXiv" -//"doi" -//"grid" -//"info:eu-repo/dai" -//"orcidworkid" -//"pmc" -//"pmid" -//"urn" -//"who" -//"drks" -//"pdb" \ No newline at end of file +} \ No newline at end of file diff --git a/dhp-workflows/dhp-dedup-openaire/src/test/java/eu/dnetlib/dhp/oa/dedup/EntityMergerTest.java b/dhp-workflows/dhp-dedup-openaire/src/test/java/eu/dnetlib/dhp/oa/dedup/EntityMergerTest.java index b3cb7b9d9..431751584 100644 --- a/dhp-workflows/dhp-dedup-openaire/src/test/java/eu/dnetlib/dhp/oa/dedup/EntityMergerTest.java +++ b/dhp-workflows/dhp-dedup-openaire/src/test/java/eu/dnetlib/dhp/oa/dedup/EntityMergerTest.java @@ -23,6 +23,8 @@ public class EntityMergerTest implements Serializable { List> publications; List> publications2; List> publications3; + List> publications4; + List> publications5; String testEntityBasePath; DataInfo dataInfo; @@ -40,7 +42,8 @@ public class EntityMergerTest implements Serializable { publications = readSample(testEntityBasePath + "/publication_merge.json", Publication.class); publications2 = readSample(testEntityBasePath + "/publication_merge2.json", Publication.class); publications3 = readSample(testEntityBasePath + "/publication_merge3.json", Publication.class); - + publications4 = readSample(testEntityBasePath + "/publication_merge4.json", Publication.class); + publications5 = readSample(testEntityBasePath + "/publication_merge5.json", Publication.class); pub_top = getTopPub(publications); @@ -58,7 +61,7 @@ public class EntityMergerTest implements Serializable { assertEquals(merged.getBestaccessright().getClassid(), "OPEN SOURCE"); - assertEquals(merged.getId(), "00|dedup_doi___::0968af610a356656706657e4f234b340"); + assertEquals(merged.getId(), "50|dedup_doi___::0968af610a356656706657e4f234b340"); } @@ -69,7 +72,7 @@ public class EntityMergerTest implements Serializable { .entityMerger(dedupId, publications.iterator(), 0, dataInfo, Publication.class); // verify id - assertEquals(pub_merged.getId(), "00|dedup_doi___::0968af610a356656706657e4f234b340"); + assertEquals(pub_merged.getId(), "50|dedup_doi___::0968af610a356656706657e4f234b340"); assertEquals(pub_merged.getJournal(), pub_top.getJournal()); assertEquals(pub_merged.getBestaccessright(), pub_top.getBestaccessright()); @@ -125,7 +128,7 @@ public class EntityMergerTest implements Serializable { .entityMerger(dedupId, publications2.iterator(), 0, dataInfo, Publication.class); // verify id - assertEquals(pub_merged.getId(), "00|dedup_doi___::0ca46ff10b2b4c756191719d85302b14"); + assertEquals("50|dedup_doi___::0ca46ff10b2b4c756191719d85302b14", pub_merged.getId()); assertEquals(pub_merged.getAuthor().size(), 27); @@ -138,10 +141,31 @@ public class EntityMergerTest implements Serializable { .entityMerger(dedupId, publications3.iterator(), 0, dataInfo, Publication.class); // verify id - assertEquals(pub_merged.getId(), "00|dedup_doi___::0ca46ff10b2b4c756191719d85302b14"); + assertEquals( "50|dedup_doi___::0ca46ff10b2b4c756191719d85302b14", pub_merged.getId()); } + @Test + public void publicationMergerTest4() throws InstantiationException, IllegalStateException, IllegalAccessException { + + Publication pub_merged = DedupRecordFactory + .entityMerger(dedupId, publications4.iterator(), 0, dataInfo, Publication.class); + + // verify id + assertEquals("50|dedup_wf_001::2d2bbbbcfb285e3fb3590237b79e2fa8", pub_merged.getId()); + + } + + @Test + public void publicationMergerTest5() throws InstantiationException, IllegalStateException, IllegalAccessException { + + Publication pub_merged = DedupRecordFactory + .entityMerger(dedupId, publications5.iterator(), 0, dataInfo, Publication.class); + + // verify id + assertEquals("50|dedup_wf_001::584b89679c3ccd1015b647ec63cc2699", pub_merged.getId()); + + } public DataInfo setDI() { DataInfo dataInfo = new DataInfo(); diff --git a/dhp-workflows/dhp-dedup-openaire/src/test/resources/eu/dnetlib/dhp/dedup/json/publication_merge4.json b/dhp-workflows/dhp-dedup-openaire/src/test/resources/eu/dnetlib/dhp/dedup/json/publication_merge4.json new file mode 100644 index 000000000..785465ae9 --- /dev/null +++ b/dhp-workflows/dhp-dedup-openaire/src/test/resources/eu/dnetlib/dhp/dedup/json/publication_merge4.json @@ -0,0 +1,3 @@ +{"id":"50|doajarticles::842fa3b99fcdccafb4d5c8a815f56efa","dateofcollection":"2020-04-06T12:22:31.216Z","title":[{"dataInfo":{"deletedbyinference":false,"inferenceprovenance":"","inferred":false,"invisible":false,"provenanceaction":{"classid":"sysimport:crosswalk:repository","classname":"sysimport:crosswalk:repository","schemeid":"dnet:provenanceActions","schemename":"dnet:provenanceActions"},"trust":"0.9"},"qualifier":{"classid":"main title","classname":"main title","schemeid":"dnet:dataCite_title","schemename":"dnet:dataCite_title"},"value":"Increased Expression of Herpes Virus-Encoded hsv1-miR-H18 and hsv2-miR-H9-5p in Cancer-Containing Prostate Tissue Compared to That in Benign Prostate Hyperplasia Tissue"}],"publisher":{"dataInfo":{"deletedbyinference":false,"inferenceprovenance":"","inferred":false,"invisible":false,"provenanceaction":{"classid":"sysimport:crosswalk:repository","classname":"sysimport:crosswalk:repository","schemeid":"dnet:provenanceActions","schemename":"dnet:provenanceActions"},"trust":"0.9"},"value":"Korean Continence Society"},"bestaccessright":null,"dataInfo":{"deletedbyinference":true,"inferenceprovenance":"","inferred":false,"invisible":false,"provenanceaction":{"classid":"sysimport:crosswalk:repository","classname":"sysimport:crosswalk:repository","schemeid":"dnet:provenanceActions","schemename":"dnet:provenanceActions"},"trust":"0.9"},"collectedfrom":[{"dataInfo":null,"key":"10|driver______::bee53aa31dc2cbb538c10c2b65fa5824","value":"DOAJ-Articles"}],"pid":[],"author":[{"affiliation":null,"fullname":"Seok Joong Yun","name":null,"pid":[],"rank":1,"surname":null},{"affiliation":null,"fullname":"Pildu Jeong","name":null,"pid":[],"rank":2,"surname":null},{"affiliation":null,"fullname":"Ho Won Kang","name":null,"pid":[],"rank":3,"surname":null},{"affiliation":null,"fullname":"Helen Ki Shinn","name":null,"pid":[],"rank":4,"surname":null},{"affiliation":null,"fullname":"Ye-Hwan Kim","name":null,"pid":[],"rank":5,"surname":null},{"affiliation":null,"fullname":"Chunri Yan","name":null,"pid":[],"rank":6,"surname":null},{"affiliation":null,"fullname":"Young-Ki Choi","name":null,"pid":[],"rank":7,"surname":null},{"affiliation":null,"fullname":"Dongho Kim","name":null,"pid":[],"rank":8,"surname":null},{"affiliation":null,"fullname":"Dong Hee Ryu","name":null,"pid":[],"rank":9,"surname":null},{"affiliation":null,"fullname":"Yun-Sok Ha","name":null,"pid":[],"rank":10,"surname":null},{"affiliation":null,"fullname":"Tae-Hwan Kim","name":null,"pid":[],"rank":11,"surname":null},{"affiliation":null,"fullname":"Tae Gyun Kwon","name":null,"pid":[],"rank":12,"surname":null},{"affiliation":null,"fullname":"Jung Min Kim","name":null,"pid":[],"rank":13,"surname":null},{"affiliation":null,"fullname":"Sang Heon Suh","name":null,"pid":[],"rank":14,"surname":null},{"affiliation":null,"fullname":"Seon-Kyu Kim","name":null,"pid":[],"rank":15,"surname":null},{"affiliation":null,"fullname":"Seon-Young Kim","name":null,"pid":[],"rank":16,"surname":null},{"affiliation":null,"fullname":"Sang Tae Kim","name":null,"pid":[],"rank":17,"surname":null},{"affiliation":null,"fullname":"Won Tae Kim","name":null,"pid":[],"rank":18,"surname":null},{"affiliation":null,"fullname":"Ok-Jun Lee","name":null,"pid":[],"rank":19,"surname":null},{"affiliation":null,"fullname":"Sung-Kwon Moon","name":null,"pid":[],"rank":20,"surname":null},{"affiliation":null,"fullname":"Nam-Hyung Kim","name":null,"pid":[],"rank":21,"surname":null},{"affiliation":null,"fullname":"Isaac Yi Kim","name":null,"pid":[],"rank":22,"surname":null},{"affiliation":null,"fullname":"Jayoung Kim","name":null,"pid":[],"rank":23,"surname":null},{"affiliation":null,"fullname":"Hee-Jae Cha","name":null,"pid":[],"rank":24,"surname":null},{"affiliation":null,"fullname":"Yung-Hyun Choi","name":null,"pid":[],"rank":25,"surname":null},{"affiliation":null,"fullname":"Eun-Jong Cha","name":null,"pid":[],"rank":26,"surname":null},{"affiliation":null,"fullname":"Wun-Jae Kim","name":null,"pid":[],"rank":27,"surname":null}],"resulttype":{"classid":"publication","classname":"publication","schemeid":"dnet:result_typologies","schemename":"dnet:result_typologies"},"language":{"classid":"eng","classname":"English","schemeid":"dnet:languages","schemename":"dnet:languages"},"country":[],"subject":[{"dataInfo":{"deletedbyinference":false,"inferenceprovenance":"","inferred":false,"invisible":false,"provenanceaction":{"classid":"sysimport:crosswalk:repository","classname":"sysimport:crosswalk:repository","schemeid":"dnet:provenanceActions","schemename":"dnet:provenanceActions"},"trust":"0.9"},"qualifier":{"classid":"","classname":"","schemeid":"","schemename":""},"value":"MicroRNAs"},{"dataInfo":{"deletedbyinference":false,"inferenceprovenance":"","inferred":false,"invisible":false,"provenanceaction":{"classid":"sysimport:crosswalk:repository","classname":"sysimport:crosswalk:repository","schemeid":"dnet:provenanceActions","schemename":"dnet:provenanceActions"},"trust":"0.9"},"qualifier":{"classid":"","classname":"","schemeid":"","schemename":""},"value":"Prostate Neoplasms"},{"dataInfo":{"deletedbyinference":false,"inferenceprovenance":"","inferred":false,"invisible":false,"provenanceaction":{"classid":"sysimport:crosswalk:repository","classname":"sysimport:crosswalk:repository","schemeid":"dnet:provenanceActions","schemename":"dnet:provenanceActions"},"trust":"0.9"},"qualifier":{"classid":"","classname":"","schemeid":"","schemename":""},"value":"Herpesviridae"},{"dataInfo":{"deletedbyinference":false,"inferenceprovenance":"","inferred":false,"invisible":false,"provenanceaction":{"classid":"sysimport:crosswalk:repository","classname":"sysimport:crosswalk:repository","schemeid":"dnet:provenanceActions","schemename":"dnet:provenanceActions"},"trust":"0.9"},"qualifier":{"classid":"","classname":"","schemeid":"","schemename":""},"value":"Prostate Hyperplasia"},{"dataInfo":{"deletedbyinference":false,"inferenceprovenance":"","inferred":false,"invisible":false,"provenanceaction":{"classid":"sysimport:crosswalk:repository","classname":"sysimport:crosswalk:repository","schemeid":"dnet:provenanceActions","schemename":"dnet:provenanceActions"},"trust":"0.9"},"qualifier":{"classid":"","classname":"","schemeid":"","schemename":""},"value":"Diseases of the genitourinary system. Urology"},{"dataInfo":{"deletedbyinference":false,"inferenceprovenance":"","inferred":false,"invisible":false,"provenanceaction":{"classid":"sysimport:crosswalk:repository","classname":"sysimport:crosswalk:repository","schemeid":"dnet:provenanceActions","schemename":"dnet:provenanceActions"},"trust":"0.9"},"qualifier":{"classid":"","classname":"","schemeid":"","schemename":""},"value":"RC870-923"}],"description":[{"dataInfo":{"deletedbyinference":false,"inferenceprovenance":"","inferred":false,"invisible":false,"provenanceaction":{"classid":"sysimport:crosswalk:repository","classname":"sysimport:crosswalk:repository","schemeid":"dnet:provenanceActions","schemename":"dnet:provenanceActions"},"trust":"0.9"},"value":"Purpose: Previously, we reported the presence of virus-encoded microRNAs (miRNAs) in the urine of prostate cancer (CaP) patients. In this study, we investigated the expression of two herpes virus-encoded miRNAs in prostate tissue. Methods: A total of 175 tissue samples from noncancerous benign prostatic hyperplasia (BPH), 248 tissue samples from patients with CaP and BPH, and 50 samples from noncancerous surrounding tissues from these same patients were analyzed for the expression of two herpes virus-encoded miRNAs by real-time polymerase chain reaction (PCR) and immunocytochemistry using nanoparticles as molecular beacons. Results: Real-time reverse transcription-PCR results revealed significantly higher expression of hsv1-miR-H18 and hsv2-miRH9- 5p in surrounding noncancerous and CaP tissues than that in BPH tissue (each comparison, P<0.001). Of note, these miRNA were expressed equivalently in the CaP tissues and surrounding noncancerous tissues. Moreover, immunocytochemistry clearly demonstrated a significant enrichment of both hsv1-miR-H18 and hsv2-miR-H9 beacon-labeled cells in CaP and surrounding noncancerous tissue compared to that in BPH tissue (each comparison, P<0.05 for hsv1-miR-H18 and hsv2- miR-H9). Conclusions: These results suggest that increased expression of hsv1-miR-H18 and hsv2-miR-H95p might be associated with tumorigenesis in the prostate. Further studies will be required to elucidate the role of these miRNAs with respect to CaP and herpes viral infections."}],"dateofacceptance":{"dataInfo":{"deletedbyinference":false,"inferenceprovenance":"","inferred":false,"invisible":false,"provenanceaction":{"classid":"sysimport:crosswalk:repository","classname":"sysimport:crosswalk:repository","schemeid":"dnet:provenanceActions","schemename":"dnet:provenanceActions"},"trust":"0.9"},"value":"2016-06-01"},"embargoenddate":null,"resourcetype":null,"context":[],"instance":[{"accessright":{"classid":"OPEN","classname":"Open Access","schemeid":"dnet:access_modes","schemename":"dnet:access_modes"},"collectedfrom":{"dataInfo":null,"key":"10|driver______::bee53aa31dc2cbb538c10c2b65fa5824","value":"DOAJ-Articles"},"dateofacceptance":{"dataInfo":{"deletedbyinference":false,"inferenceprovenance":"","inferred":false,"invisible":false,"provenanceaction":{"classid":"sysimport:crosswalk:repository","classname":"sysimport:crosswalk:repository","schemeid":"dnet:provenanceActions","schemename":"dnet:provenanceActions"},"trust":"0.9"},"value":"2016-06-01"},"distributionlocation":"","hostedby":{"dataInfo":null,"key":"10|doajarticles::52db9a4f8e176f6e8e1d9f0c1e0a2de0","value":"International Neurourology Journal"},"instancetype":{"classid":"0001","classname":"peerReviewed","schemeid":"dnet:publication_resource","schemename":"dnet:publication_resource"},"license":null,"processingchargeamount":null,"processingchargecurrency":null,"refereed":null,"url":["http://www.einj.org/upload/pdf/inj-1632552-276.pdf","https://doaj.org/toc/2093-4777","https://doaj.org/toc/2093-6931"]}]} +{"id":"50|od_______267::b5f5da11a8239ef57655cea8675cb466","dateofcollection":"","title":[{"dataInfo":{"deletedbyinference":false,"inferenceprovenance":"","inferred":false,"invisible":false,"provenanceaction":{"classid":"sysimport:crosswalk","classname":"sysimport:crosswalk","schemeid":"dnet:provenanceActions","schemename":"dnet:provenanceActions"},"trust":"0.9"},"qualifier":{"classid":"main title","classname":"main title","schemeid":"dnet:dataCite_title","schemename":"dnet:dataCite_title"},"value":"Increased Expression of Herpes Virus-Encoded hsv1-miR-H18 and hsv2-miR-H9-5p in Cancer-Containing Prostate Tissue Compared to That in Benign Prostate Hyperplasia Tissue"}],"publisher":{"dataInfo":{"deletedbyinference":false,"inferenceprovenance":"","inferred":false,"invisible":false,"provenanceaction":{"classid":"sysimport:crosswalk","classname":"sysimport:crosswalk","schemeid":"dnet:provenanceActions","schemename":"dnet:provenanceActions"},"trust":"0.9"},"value":"Korean Continence Society"},"bestaccessright":null,"dataInfo":{"deletedbyinference":true,"inferenceprovenance":"","inferred":false,"invisible":false,"provenanceaction":{"classid":"sysimport:crosswalk","classname":"sysimport:crosswalk","schemeid":"dnet:provenanceActions","schemename":"dnet:provenanceActions"},"trust":"0.9"},"collectedfrom":[{"dataInfo":null,"key":"10|opendoar____::eda80a3d5b344bc40f3bc04f65b7a357","value":"PubMed Central"}],"pid":[],"author":[{"affiliation":null,"fullname":"Yun, Seok Joong","name":"Seok Joong","pid":[{"dataInfo":{"deletedbyinference":false,"inferenceprovenance":"","inferred":false,"invisible":false,"provenanceaction":{"classid":"sysimport:crosswalk","classname":"sysimport:crosswalk","schemeid":"dnet:provenanceActions","schemename":"dnet:provenanceActions"},"trust":"0.9"},"qualifier":{"classid":"ORCID","classname":"ORCID","schemeid":"dnet:pid_types","schemename":"dnet:pid_types"},"value":"0000-0001-7737-4746"}],"rank":1,"surname":"Yun"},{"affiliation":null,"fullname":"Jeong, Pildu","name":"Pildu","pid":[{"dataInfo":{"deletedbyinference":false,"inferenceprovenance":"","inferred":false,"invisible":false,"provenanceaction":{"classid":"sysimport:crosswalk","classname":"sysimport:crosswalk","schemeid":"dnet:provenanceActions","schemename":"dnet:provenanceActions"},"trust":"0.9"},"qualifier":{"classid":"ORCID","classname":"ORCID","schemeid":"dnet:pid_types","schemename":"dnet:pid_types"},"value":"0000-0002-5602-5376"}],"rank":2,"surname":"Jeong"},{"affiliation":null,"fullname":"Kang, Ho Won","name":"Ho Won","pid":[{"dataInfo":{"deletedbyinference":false,"inferenceprovenance":"","inferred":false,"invisible":false,"provenanceaction":{"classid":"sysimport:crosswalk","classname":"sysimport:crosswalk","schemeid":"dnet:provenanceActions","schemename":"dnet:provenanceActions"},"trust":"0.9"},"qualifier":{"classid":"ORCID","classname":"ORCID","schemeid":"dnet:pid_types","schemename":"dnet:pid_types"},"value":"0000-0002-8164-4427"}],"rank":3,"surname":"Kang"},{"affiliation":null,"fullname":"Shinn, Helen Ki","name":"Helen Ki","pid":[],"rank":4,"surname":"Shinn"},{"affiliation":null,"fullname":"Kim, Ye-Hwan","name":"Ye-Hwan","pid":[{"dataInfo":{"deletedbyinference":false,"inferenceprovenance":"","inferred":false,"invisible":false,"provenanceaction":{"classid":"sysimport:crosswalk","classname":"sysimport:crosswalk","schemeid":"dnet:provenanceActions","schemename":"dnet:provenanceActions"},"trust":"0.9"},"qualifier":{"classid":"ORCID","classname":"ORCID","schemeid":"dnet:pid_types","schemename":"dnet:pid_types"},"value":"0000-0002-8676-7119"}],"rank":5,"surname":"Kim"},{"affiliation":null,"fullname":"Yan, Chunri","name":"Chunri","pid":[],"rank":6,"surname":"Yan"},{"affiliation":null,"fullname":"Choi, Young-Ki","name":"Young-Ki","pid":[{"dataInfo":{"deletedbyinference":false,"inferenceprovenance":"","inferred":false,"invisible":false,"provenanceaction":{"classid":"sysimport:crosswalk","classname":"sysimport:crosswalk","schemeid":"dnet:provenanceActions","schemename":"dnet:provenanceActions"},"trust":"0.9"},"qualifier":{"classid":"ORCID","classname":"ORCID","schemeid":"dnet:pid_types","schemename":"dnet:pid_types"},"value":"0000-0002-1894-9869"}],"rank":7,"surname":"Choi"},{"affiliation":null,"fullname":"Kim, Dongho","name":"Dongho","pid":[{"dataInfo":{"deletedbyinference":false,"inferenceprovenance":"","inferred":false,"invisible":false,"provenanceaction":{"classid":"sysimport:crosswalk","classname":"sysimport:crosswalk","schemeid":"dnet:provenanceActions","schemename":"dnet:provenanceActions"},"trust":"0.9"},"qualifier":{"classid":"ORCID","classname":"ORCID","schemeid":"dnet:pid_types","schemename":"dnet:pid_types"},"value":"0000-0002-1409-3311"}],"rank":8,"surname":"Kim"},{"affiliation":null,"fullname":"Ryu, Dong Hee","name":"Dong Hee","pid":[{"dataInfo":{"deletedbyinference":false,"inferenceprovenance":"","inferred":false,"invisible":false,"provenanceaction":{"classid":"sysimport:crosswalk","classname":"sysimport:crosswalk","schemeid":"dnet:provenanceActions","schemename":"dnet:provenanceActions"},"trust":"0.9"},"qualifier":{"classid":"ORCID","classname":"ORCID","schemeid":"dnet:pid_types","schemename":"dnet:pid_types"},"value":"0000-0001-6088-298X"}],"rank":9,"surname":"Ryu"},{"affiliation":null,"fullname":"Ha, Yun-Sok","name":"Yun-Sok","pid":[{"dataInfo":{"deletedbyinference":false,"inferenceprovenance":"","inferred":false,"invisible":false,"provenanceaction":{"classid":"sysimport:crosswalk","classname":"sysimport:crosswalk","schemeid":"dnet:provenanceActions","schemename":"dnet:provenanceActions"},"trust":"0.9"},"qualifier":{"classid":"ORCID","classname":"ORCID","schemeid":"dnet:pid_types","schemename":"dnet:pid_types"},"value":"0000-0003-3732-9814"}],"rank":10,"surname":"Ha"},{"affiliation":null,"fullname":"Kim, Tae-Hwan","name":"Tae-Hwan","pid":[],"rank":11,"surname":"Kim"},{"affiliation":null,"fullname":"Kwon, Tae Gyun","name":"Tae Gyun","pid":[{"dataInfo":{"deletedbyinference":false,"inferenceprovenance":"","inferred":false,"invisible":false,"provenanceaction":{"classid":"sysimport:crosswalk","classname":"sysimport:crosswalk","schemeid":"dnet:provenanceActions","schemename":"dnet:provenanceActions"},"trust":"0.9"},"qualifier":{"classid":"ORCID","classname":"ORCID","schemeid":"dnet:pid_types","schemename":"dnet:pid_types"},"value":"0000-0002-4390-0952"}],"rank":12,"surname":"Kwon"},{"affiliation":null,"fullname":"Kim, Jung Min","name":"Jung Min","pid":[{"dataInfo":{"deletedbyinference":false,"inferenceprovenance":"","inferred":false,"invisible":false,"provenanceaction":{"classid":"sysimport:crosswalk","classname":"sysimport:crosswalk","schemeid":"dnet:provenanceActions","schemename":"dnet:provenanceActions"},"trust":"0.9"},"qualifier":{"classid":"ORCID","classname":"ORCID","schemeid":"dnet:pid_types","schemename":"dnet:pid_types"},"value":"0000-0001-6319-0217"}],"rank":13,"surname":"Kim"},{"affiliation":null,"fullname":"Suh, Sang Heon","name":"Sang Heon","pid":[{"dataInfo":{"deletedbyinference":false,"inferenceprovenance":"","inferred":false,"invisible":false,"provenanceaction":{"classid":"sysimport:crosswalk","classname":"sysimport:crosswalk","schemeid":"dnet:provenanceActions","schemename":"dnet:provenanceActions"},"trust":"0.9"},"qualifier":{"classid":"ORCID","classname":"ORCID","schemeid":"dnet:pid_types","schemename":"dnet:pid_types"},"value":"0000-0003-4560-8880"}],"rank":14,"surname":"Suh"},{"affiliation":null,"fullname":"Kim, Seon-Kyu","name":"Seon-Kyu","pid":[{"dataInfo":{"deletedbyinference":false,"inferenceprovenance":"","inferred":false,"invisible":false,"provenanceaction":{"classid":"sysimport:crosswalk","classname":"sysimport:crosswalk","schemeid":"dnet:provenanceActions","schemename":"dnet:provenanceActions"},"trust":"0.9"},"qualifier":{"classid":"ORCID","classname":"ORCID","schemeid":"dnet:pid_types","schemename":"dnet:pid_types"},"value":"0000-0002-4176-5187"}],"rank":15,"surname":"Kim"},{"affiliation":null,"fullname":"Kim, Seon-Young","name":"Seon-Young","pid":[{"dataInfo":{"deletedbyinference":false,"inferenceprovenance":"","inferred":false,"invisible":false,"provenanceaction":{"classid":"sysimport:crosswalk","classname":"sysimport:crosswalk","schemeid":"dnet:provenanceActions","schemename":"dnet:provenanceActions"},"trust":"0.9"},"qualifier":{"classid":"ORCID","classname":"ORCID","schemeid":"dnet:pid_types","schemename":"dnet:pid_types"},"value":"0000-0002-1030-7730"}],"rank":16,"surname":"Kim"},{"affiliation":null,"fullname":"Kim, Sang Tae","name":"Sang Tae","pid":[],"rank":17,"surname":"Kim"},{"affiliation":null,"fullname":"Kim, Won Tae","name":"Won Tae","pid":[],"rank":18,"surname":"Kim"},{"affiliation":null,"fullname":"Lee, Ok-Jun","name":"Ok-Jun","pid":[],"rank":19,"surname":"Lee"},{"affiliation":null,"fullname":"Moon, Sung-Kwon","name":"Sung-Kwon","pid":[],"rank":20,"surname":"Moon"},{"affiliation":null,"fullname":"Kim, Nam-Hyung","name":"Nam-Hyung","pid":[],"rank":21,"surname":"Kim"},{"affiliation":null,"fullname":"Kim, Isaac Yi","name":"Isaac Yi","pid":[{"dataInfo":{"deletedbyinference":false,"inferenceprovenance":"","inferred":false,"invisible":false,"provenanceaction":{"classid":"sysimport:crosswalk","classname":"sysimport:crosswalk","schemeid":"dnet:provenanceActions","schemename":"dnet:provenanceActions"},"trust":"0.9"},"qualifier":{"classid":"ORCID","classname":"ORCID","schemeid":"dnet:pid_types","schemename":"dnet:pid_types"},"value":"0000-0002-1967-5281"}],"rank":22,"surname":"Kim"},{"affiliation":null,"fullname":"Kim, Jayoung","name":"Jayoung","pid":[],"rank":23,"surname":"Kim"},{"affiliation":null,"fullname":"Cha, Hee-Jae","name":"Hee-Jae","pid":[{"dataInfo":{"deletedbyinference":false,"inferenceprovenance":"","inferred":false,"invisible":false,"provenanceaction":{"classid":"sysimport:crosswalk","classname":"sysimport:crosswalk","schemeid":"dnet:provenanceActions","schemename":"dnet:provenanceActions"},"trust":"0.9"},"qualifier":{"classid":"ORCID","classname":"ORCID","schemeid":"dnet:pid_types","schemename":"dnet:pid_types"},"value":"0000-0002-6963-2685"}],"rank":24,"surname":"Cha"},{"affiliation":null,"fullname":"Choi, Yung-Hyun","name":"Yung-Hyun","pid":[{"dataInfo":{"deletedbyinference":false,"inferenceprovenance":"","inferred":false,"invisible":false,"provenanceaction":{"classid":"sysimport:crosswalk","classname":"sysimport:crosswalk","schemeid":"dnet:provenanceActions","schemename":"dnet:provenanceActions"},"trust":"0.9"},"qualifier":{"classid":"ORCID","classname":"ORCID","schemeid":"dnet:pid_types","schemename":"dnet:pid_types"},"value":"0000-0002-1454-3124"}],"rank":25,"surname":"Choi"},{"affiliation":null,"fullname":"Cha, Eun-Jong","name":"Eun-Jong","pid":[],"rank":26,"surname":"Cha"},{"affiliation":null,"fullname":"Kim, Wun-Jae","name":"Wun-Jae","pid":[{"dataInfo":{"deletedbyinference":false,"inferenceprovenance":"","inferred":false,"invisible":false,"provenanceaction":{"classid":"sysimport:crosswalk","classname":"sysimport:crosswalk","schemeid":"dnet:provenanceActions","schemename":"dnet:provenanceActions"},"trust":"0.9"},"qualifier":{"classid":"ORCID","classname":"ORCID","schemeid":"dnet:pid_types","schemename":"dnet:pid_types"},"value":"0000-0002-8060-8926"}],"rank":27,"surname":"Kim"}],"resulttype":{"classid":"publication","classname":"publication","schemeid":"dnet:result_typologies","schemename":"dnet:result_typologies"},"language":{"classid":"eng","classname":"English","schemeid":"dnet:languages","schemename":"dnet:languages"},"country":[],"subject":[{"dataInfo":{"deletedbyinference":false,"inferenceprovenance":"","inferred":false,"invisible":false,"provenanceaction":{"classid":"sysimport:crosswalk","classname":"sysimport:crosswalk","schemeid":"dnet:provenanceActions","schemename":"dnet:provenanceActions"},"trust":"0.9"},"qualifier":{"classid":"","classname":"","schemeid":"","schemename":""},"value":"Original Article"},{"dataInfo":{"deletedbyinference":false,"inferenceprovenance":"","inferred":false,"invisible":false,"provenanceaction":{"classid":"sysimport:crosswalk","classname":"sysimport:crosswalk","schemeid":"dnet:provenanceActions","schemename":"dnet:provenanceActions"},"trust":"0.9"},"qualifier":{"classid":"","classname":"","schemeid":"","schemename":""},"value":"Fundamental Science for Neurourology"},{"dataInfo":{"deletedbyinference":false,"inferenceprovenance":"","inferred":false,"invisible":false,"provenanceaction":{"classid":"sysimport:crosswalk","classname":"sysimport:crosswalk","schemeid":"dnet:provenanceActions","schemename":"dnet:provenanceActions"},"trust":"0.9"},"qualifier":{"classid":"","classname":"","schemeid":"","schemename":""},"value":"MicroRNAs"},{"dataInfo":{"deletedbyinference":false,"inferenceprovenance":"","inferred":false,"invisible":false,"provenanceaction":{"classid":"sysimport:crosswalk","classname":"sysimport:crosswalk","schemeid":"dnet:provenanceActions","schemename":"dnet:provenanceActions"},"trust":"0.9"},"qualifier":{"classid":"","classname":"","schemeid":"","schemename":""},"value":"Prostate Neoplasms"},{"dataInfo":{"deletedbyinference":false,"inferenceprovenance":"","inferred":false,"invisible":false,"provenanceaction":{"classid":"sysimport:crosswalk","classname":"sysimport:crosswalk","schemeid":"dnet:provenanceActions","schemename":"dnet:provenanceActions"},"trust":"0.9"},"qualifier":{"classid":"","classname":"","schemeid":"","schemename":""},"value":"Herpesviridae"},{"dataInfo":{"deletedbyinference":false,"inferenceprovenance":"","inferred":false,"invisible":false,"provenanceaction":{"classid":"sysimport:crosswalk","classname":"sysimport:crosswalk","schemeid":"dnet:provenanceActions","schemename":"dnet:provenanceActions"},"trust":"0.9"},"qualifier":{"classid":"","classname":"","schemeid":"","schemename":""},"value":"Prostate Hyperplasia"}],"description":[{"dataInfo":{"deletedbyinference":false,"inferenceprovenance":"","inferred":false,"invisible":false,"provenanceaction":{"classid":"sysimport:crosswalk","classname":"sysimport:crosswalk","schemeid":"dnet:provenanceActions","schemename":"dnet:provenanceActions"},"trust":"0.9"},"value":"Purpose: Previously, we reported the presence of virus-encoded microRNAs (miRNAs) in the urine of prostate cancer (CaP) patients. In this study, we investigated the expression of two herpes virus-encoded miRNAs in prostate tissue. Methods: A total of 175 tissue samples from noncancerous benign prostatic hyperplasia (BPH), 248 tissue samples from patients with CaP and BPH, and 50 samples from noncancerous surrounding tissues from these same patients were analyzed for the expression of two herpes virus-encoded miRNAs by real-time polymerase chain reaction (PCR) and immunocytochemistry using nanoparticles as molecular beacons. Results: Real-time reverse transcription-PCR results revealed significantly higher expression of hsv1-miR-H18 and hsv2-miRH9- 5p in surrounding noncancerous and CaP tissues than that in BPH tissue (each comparison, P<0.001). Of note, these miRNA were expressed equivalently in the CaP tissues and surrounding noncancerous tissues. Moreover, immunocytochemistry clearly demonstrated a significant enrichment of both hsv1-miR-H18 and hsv2-miR-H9 beacon-labeled cells in CaP and surrounding noncancerous tissue compared to that in BPH tissue (each comparison, P<0.05 for hsv1-miR-H18 and hsv2- miR-H9). Conclusions: These results suggest that increased expression of hsv1-miR-H18 and hsv2-miR-H95p might be associated with tumorigenesis in the prostate. Further studies will be required to elucidate the role of these miRNAs with respect to CaP and herpes viral infections."}],"dateofacceptance":{"dataInfo":{"deletedbyinference":false,"inferenceprovenance":"","inferred":false,"invisible":false,"provenanceaction":{"classid":"sysimport:crosswalk","classname":"sysimport:crosswalk","schemeid":"dnet:provenanceActions","schemename":"dnet:provenanceActions"},"trust":"0.9"},"value":"2016-06-01"},"embargoenddate":null,"resourcetype":null,"context":[],"instance":[{"accessright":{"classid":"OPEN","classname":"Open Access","schemeid":"dnet:access_modes","schemename":"dnet:access_modes"},"collectedfrom":{"dataInfo":null,"key":"10|opendoar____::eda80a3d5b344bc40f3bc04f65b7a357","value":"PubMed Central"},"dateofacceptance":{"dataInfo":{"deletedbyinference":false,"inferenceprovenance":"","inferred":false,"invisible":false,"provenanceaction":{"classid":"sysimport:crosswalk","classname":"sysimport:crosswalk","schemeid":"dnet:provenanceActions","schemename":"dnet:provenanceActions"},"trust":"0.9"},"value":"2016-06-01"},"distributionlocation":"","hostedby":{"dataInfo":null,"key":"10|opendoar____::8b6dd7db9af49e67306feb59a8bdc52c","value":"Europe PubMed Central"},"instancetype":{"classid":"0001","classname":"peerReviewed","schemeid":"dnet:publication_resource","schemename":"dnet:publication_resource"},"license":null,"processingchargeamount":null,"processingchargecurrency":null,"refereed":null,"url":["http://europepmc.org/articles/PMC4932644"]}]} +{"id":"50|doiboost____::0ca46ff10b2b4c756191719d85302b14","dateofcollection":"2019-02-15","title":[{"dataInfo":{"deletedbyinference":false,"inferenceprovenance":"","inferred":false,"invisible":false,"provenanceaction":{"classid":"","classname":"","schemeid":"","schemename":""},"trust":""},"qualifier":{"classid":"main title","classname":"main title","schemeid":"dnet:dataCite_title","schemename":"dnet:dataCite_title"},"value":"Increased Expression of Herpes Virus-Encoded hsv1-miR-H18 and hsv2-miR-H9-5p in Cancer-Containing Prostate Tissue Compared to That in Benign Prostate Hyperplasia Tissue"}],"publisher":{"dataInfo":{"deletedbyinference":false,"inferenceprovenance":"","inferred":false,"invisible":false,"provenanceaction":{"classid":"","classname":"","schemeid":"","schemename":""},"trust":""},"value":""},"bestaccessright":{"classid":"OPEN","classname":"Open Access","schemeid":"dnet:access_modes","schemename":"dnet:access_modes"},"dataInfo":{"deletedbyinference":true,"inferenceprovenance":"","inferred":false,"invisible":false,"provenanceaction":{"classid":"sysimport:actionset","classname":"sysimport:actionset","schemeid":"dnet:provenanceActions","schemename":"dnet:provenanceActions"},"trust":"0.9"},"collectedfrom":[{"dataInfo":{"deletedbyinference":false,"inferenceprovenance":"","inferred":false,"invisible":false,"provenanceaction":{"classid":"","classname":"","schemeid":"","schemename":""},"trust":""},"key":"10|openaire____::081b82f96300b6a6e3d282bad31cb6e2","value":"Crossref"},{"dataInfo":{"deletedbyinference":false,"inferenceprovenance":"","inferred":false,"invisible":false,"provenanceaction":{"classid":"","classname":"","schemeid":"","schemename":""},"trust":""},"key":"10|openaire____::5f532a3fc4f1ea403f37070f59a7a53a","value":"Microsoft Academic Graph"},{"dataInfo":{"deletedbyinference":false,"inferenceprovenance":"","inferred":false,"invisible":false,"provenanceaction":{"classid":"","classname":"","schemeid":"","schemename":""},"trust":""},"key":"10|openaire____::8ac8380272269217cb09a928c8caa993","value":"UnpayWall"}],"pid":[],"author":[{"affiliation":[{"dataInfo":{"deletedbyinference":false,"inferenceprovenance":"","inferred":false,"invisible":false,"provenanceaction":{"classid":"","classname":"","schemeid":"","schemename":""},"trust":""},"value":"Chungbuk National University"}],"fullname":"Seok Joong Yun","name":"Seok Joong","pid":[{"dataInfo":null,"qualifier":{"classid":"MAG Identifier","classname":"MAG Identifier","schemeid":null,"schemename":null},"value":"2105974574"}],"rank":1,"surname":"Yun"},{"affiliation":[{"dataInfo":{"deletedbyinference":false,"inferenceprovenance":"","inferred":false,"invisible":false,"provenanceaction":{"classid":"","classname":"","schemeid":"","schemename":""},"trust":""},"value":"Chungbuk National University"}],"fullname":"Pildu Jeong","name":"Pildu","pid":[{"dataInfo":null,"qualifier":{"classid":"MAG Identifier","classname":"MAG Identifier","schemeid":null,"schemename":null},"value":"2041919263"}],"rank":2,"surname":"Jeong"},{"affiliation":[{"dataInfo":{"deletedbyinference":false,"inferenceprovenance":"","inferred":false,"invisible":false,"provenanceaction":{"classid":"","classname":"","schemeid":"","schemename":""},"trust":""},"value":"Chungbuk National University"}],"fullname":"Ho Won Kang","name":"Ho Won","pid":[{"dataInfo":null,"qualifier":{"classid":"MAG Identifier","classname":"MAG Identifier","schemeid":null,"schemename":null},"value":"2164408067"}],"rank":3,"surname":"Kang"},{"affiliation":[{"dataInfo":{"deletedbyinference":false,"inferenceprovenance":"","inferred":false,"invisible":false,"provenanceaction":{"classid":"","classname":"","schemeid":"","schemename":""},"trust":""},"value":"Inha University"}],"fullname":"Helen Ki Shinn","name":"Helen Ki","pid":[{"dataInfo":null,"qualifier":{"classid":"MAG Identifier","classname":"MAG Identifier","schemeid":null,"schemename":null},"value":"2045077081"}],"rank":4,"surname":"Shinn"},{"affiliation":[{"dataInfo":{"deletedbyinference":false,"inferenceprovenance":"","inferred":false,"invisible":false,"provenanceaction":{"classid":"","classname":"","schemeid":"","schemename":""},"trust":""},"value":"Chungbuk National University"}],"fullname":"Ye-Hwan Kim","name":"Ye-Hwan","pid":[{"dataInfo":null,"qualifier":{"classid":"MAG Identifier","classname":"MAG Identifier","schemeid":null,"schemename":null},"value":"2276303457"}],"rank":5,"surname":"Kim"},{"affiliation":[{"dataInfo":{"deletedbyinference":false,"inferenceprovenance":"","inferred":false,"invisible":false,"provenanceaction":{"classid":"","classname":"","schemeid":"","schemename":""},"trust":""},"value":"Chungbuk National University"}],"fullname":"Chunri Yan","name":"Chunri","pid":[{"dataInfo":null,"qualifier":{"classid":"MAG Identifier","classname":"MAG Identifier","schemeid":null,"schemename":null},"value":"2186750404"}],"rank":6,"surname":"Yan"},{"affiliation":[{"dataInfo":{"deletedbyinference":false,"inferenceprovenance":"","inferred":false,"invisible":false,"provenanceaction":{"classid":"","classname":"","schemeid":"","schemename":""},"trust":""},"value":"Chungbuk National University"}],"fullname":"Young-Ki Choi","name":"Young-Ki","pid":[{"dataInfo":null,"qualifier":{"classid":"MAG Identifier","classname":"MAG Identifier","schemeid":null,"schemename":null},"value":"2311466124"}],"rank":7,"surname":"Choi"},{"affiliation":[],"fullname":"Dongho Kim","name":"Dongho","pid":[{"dataInfo":null,"qualifier":{"classid":"MAG Identifier","classname":"MAG Identifier","schemeid":null,"schemename":null},"value":"2644843893"}],"rank":8,"surname":"Kim"},{"affiliation":[{"dataInfo":{"deletedbyinference":false,"inferenceprovenance":"","inferred":false,"invisible":false,"provenanceaction":{"classid":"","classname":"","schemeid":"","schemename":""},"trust":""},"value":"Chungbuk National University"}],"fullname":"Dong Hee Ryu","name":"Dong Hee","pid":[{"dataInfo":null,"qualifier":{"classid":"MAG Identifier","classname":"MAG Identifier","schemeid":null,"schemename":null},"value":"2117604941"}],"rank":9,"surname":"Ryu"},{"affiliation":[{"dataInfo":{"deletedbyinference":false,"inferenceprovenance":"","inferred":false,"invisible":false,"provenanceaction":{"classid":"","classname":"","schemeid":"","schemename":""},"trust":""},"value":"Kyungpook National University"}],"fullname":"Yun-Sok Ha","name":"Yun-Sok","pid":[{"dataInfo":null,"qualifier":{"classid":"MAG Identifier","classname":"MAG Identifier","schemeid":null,"schemename":null},"value":"2145233282"}],"rank":10,"surname":"Ha"},{"affiliation":[{"dataInfo":{"deletedbyinference":false,"inferenceprovenance":"","inferred":false,"invisible":false,"provenanceaction":{"classid":"","classname":"","schemeid":"","schemename":""},"trust":""},"value":"Kyungpook National University"}],"fullname":"Tae-Hwan Kim","name":"Tae-Hwan","pid":[{"dataInfo":null,"qualifier":{"classid":"MAG Identifier","classname":"MAG Identifier","schemeid":null,"schemename":null},"value":"2509096378"}],"rank":11,"surname":"Kim"},{"affiliation":[{"dataInfo":{"deletedbyinference":false,"inferenceprovenance":"","inferred":false,"invisible":false,"provenanceaction":{"classid":"","classname":"","schemeid":"","schemename":""},"trust":""},"value":"Kyungpook National University"}],"fullname":"Tae Gyun Kwon","name":"Tae Gyun","pid":[{"dataInfo":null,"qualifier":{"classid":"MAG Identifier","classname":"MAG Identifier","schemeid":null,"schemename":null},"value":"1978978081"}],"rank":12,"surname":"Kwon"},{"affiliation":[{"dataInfo":{"deletedbyinference":false,"inferenceprovenance":"","inferred":false,"invisible":false,"provenanceaction":{"classid":"","classname":"","schemeid":"","schemename":""},"trust":""},"value":"Daejeon University"}],"fullname":"Jung Min Kim","name":"Jung Min","pid":[{"dataInfo":null,"qualifier":{"classid":"MAG Identifier","classname":"MAG Identifier","schemeid":null,"schemename":null},"value":"2265841962"}],"rank":13,"surname":"Kim"},{"affiliation":[{"dataInfo":{"deletedbyinference":false,"inferenceprovenance":"","inferred":false,"invisible":false,"provenanceaction":{"classid":"","classname":"","schemeid":"","schemename":""},"trust":""},"value":"KAIST"}],"fullname":"Sang Heon Suh","name":"Sang Heon","pid":[{"dataInfo":null,"qualifier":{"classid":"MAG Identifier","classname":"MAG Identifier","schemeid":null,"schemename":null},"value":"2890693470"}],"rank":14,"surname":"Suh"},{"affiliation":[{"dataInfo":{"deletedbyinference":false,"inferenceprovenance":"","inferred":false,"invisible":false,"provenanceaction":{"classid":"","classname":"","schemeid":"","schemename":""},"trust":""},"value":"Korea Research Institute of Bioscience and Biotechnology"}],"fullname":"Seon-Kyu Kim","name":"Seon-Kyu","pid":[{"dataInfo":null,"qualifier":{"classid":"MAG Identifier","classname":"MAG Identifier","schemeid":null,"schemename":null},"value":"2162364977"}],"rank":15,"surname":"Kim"},{"affiliation":[{"dataInfo":{"deletedbyinference":false,"inferenceprovenance":"","inferred":false,"invisible":false,"provenanceaction":{"classid":"","classname":"","schemeid":"","schemename":""},"trust":""},"value":"Korea Research Institute of Bioscience and Biotechnology"}],"fullname":"Seon-Young Kim","name":"Seon-Young","pid":[{"dataInfo":null,"qualifier":{"classid":"MAG Identifier","classname":"MAG Identifier","schemeid":null,"schemename":null},"value":"2344797375"}],"rank":16,"surname":"Kim"},{"affiliation":[{"dataInfo":{"deletedbyinference":false,"inferenceprovenance":"","inferred":false,"invisible":false,"provenanceaction":{"classid":"","classname":"","schemeid":"","schemename":""},"trust":""},"value":"Seoul National University Bundang Hospital"}],"fullname":"Sang Tae Kim","name":"Sang Tae","pid":[{"dataInfo":null,"qualifier":{"classid":"MAG Identifier","classname":"MAG Identifier","schemeid":null,"schemename":null},"value":"2257827509"}],"rank":17,"surname":"Kim"},{"affiliation":[{"dataInfo":{"deletedbyinference":false,"inferenceprovenance":"","inferred":false,"invisible":false,"provenanceaction":{"classid":"","classname":"","schemeid":"","schemename":""},"trust":""},"value":"Chungbuk National University"}],"fullname":"Won Tae Kim","name":"Won Tae","pid":[{"dataInfo":null,"qualifier":{"classid":"MAG Identifier","classname":"MAG Identifier","schemeid":null,"schemename":null},"value":"2617237649"}],"rank":18,"surname":"Kim"},{"affiliation":[{"dataInfo":{"deletedbyinference":false,"inferenceprovenance":"","inferred":false,"invisible":false,"provenanceaction":{"classid":"","classname":"","schemeid":"","schemename":""},"trust":""},"value":"Chungbuk National University"}],"fullname":"Ok-Jun Lee","name":"Ok-Jun","pid":[{"dataInfo":null,"qualifier":{"classid":"MAG Identifier","classname":"MAG Identifier","schemeid":null,"schemename":null},"value":"2112231548"}],"rank":19,"surname":"Lee"},{"affiliation":[{"dataInfo":{"deletedbyinference":false,"inferenceprovenance":"","inferred":false,"invisible":false,"provenanceaction":{"classid":"","classname":"","schemeid":"","schemename":""},"trust":""},"value":"Chung-Ang University"}],"fullname":"Sung-Kwon Moon","name":"Sung-Kwon","pid":[{"dataInfo":null,"qualifier":{"classid":"MAG Identifier","classname":"MAG Identifier","schemeid":null,"schemename":null},"value":"2796689429"}],"rank":20,"surname":"Moon"},{"affiliation":[{"dataInfo":{"deletedbyinference":false,"inferenceprovenance":"","inferred":false,"invisible":false,"provenanceaction":{"classid":"","classname":"","schemeid":"","schemename":""},"trust":""},"value":"Chungbuk National University"}],"fullname":"Nam-Hyung Kim","name":"Nam-Hyung","pid":[{"dataInfo":null,"qualifier":{"classid":"MAG Identifier","classname":"MAG Identifier","schemeid":null,"schemename":null},"value":"2136287741"}],"rank":21,"surname":"Kim"},{"affiliation":[{"dataInfo":{"deletedbyinference":false,"inferenceprovenance":"","inferred":false,"invisible":false,"provenanceaction":{"classid":"","classname":"","schemeid":"","schemename":""},"trust":""},"value":"Rutgers University"}],"fullname":"Isaac Yi Kim","name":"Isaac Yi","pid":[{"dataInfo":null,"qualifier":{"classid":"MAG Identifier","classname":"MAG Identifier","schemeid":null,"schemename":null},"value":"2015295992"}],"rank":22,"surname":"Kim"},{"affiliation":[{"dataInfo":{"deletedbyinference":false,"inferenceprovenance":"","inferred":false,"invisible":false,"provenanceaction":{"classid":"","classname":"","schemeid":"","schemename":""},"trust":""},"value":"Harvard University"}],"fullname":"Jayoung Kim","name":"Jayoung","pid":[{"dataInfo":null,"qualifier":{"classid":"MAG Identifier","classname":"MAG Identifier","schemeid":null,"schemename":null},"value":"2130848131"}],"rank":23,"surname":"Kim"},{"affiliation":[{"dataInfo":{"deletedbyinference":false,"inferenceprovenance":"","inferred":false,"invisible":false,"provenanceaction":{"classid":"","classname":"","schemeid":"","schemename":""},"trust":""},"value":"Kosin University"}],"fullname":"Hee-Jae Cha","name":"Hee-Jae","pid":[{"dataInfo":null,"qualifier":{"classid":"MAG Identifier","classname":"MAG Identifier","schemeid":null,"schemename":null},"value":"2113489867"}],"rank":24,"surname":"Cha"},{"affiliation":[],"fullname":"Yung-Hyun Choi","name":"Yung-Hyun","pid":[{"dataInfo":null,"qualifier":{"classid":"MAG Identifier","classname":"MAG Identifier","schemeid":null,"schemename":null},"value":"2151282194"}],"rank":25,"surname":"Choi"},{"affiliation":[{"dataInfo":{"deletedbyinference":false,"inferenceprovenance":"","inferred":false,"invisible":false,"provenanceaction":{"classid":"","classname":"","schemeid":"","schemename":""},"trust":""},"value":"Chungbuk National University"}],"fullname":"Eun-Jong Cha","name":"Eun-Jong","pid":[{"dataInfo":null,"qualifier":{"classid":"MAG Identifier","classname":"MAG Identifier","schemeid":null,"schemename":null},"value":"2109572239"}],"rank":26,"surname":"Cha"},{"affiliation":[{"dataInfo":{"deletedbyinference":false,"inferenceprovenance":"","inferred":false,"invisible":false,"provenanceaction":{"classid":"","classname":"","schemeid":"","schemename":""},"trust":""},"value":"Chungbuk National University"}],"fullname":"Wun-Jae Kim","name":"Wun-Jae","pid":[{"dataInfo":null,"qualifier":{"classid":"MAG Identifier","classname":"MAG Identifier","schemeid":null,"schemename":null},"value":"2113339670"}],"rank":27,"surname":"Kim"}],"resulttype":{"classid":"publication","classname":"publication","schemeid":"dnet:result_typologies","schemename":"dnet:result_typologies"},"language":{"classid":"und","classname":"Undetermined","schemeid":"dnet:languages","schemename":"dnet:languages"},"country":[],"subject":[],"description":[{"dataInfo":{"deletedbyinference":false,"inferenceprovenance":"","inferred":false,"invisible":false,"provenanceaction":{"classid":"","classname":"","schemeid":"","schemename":""},"trust":""},"value":"Purpose:"}],"dateofacceptance":null,"embargoenddate":null,"resourcetype":null,"context":null,"instance":null} \ No newline at end of file diff --git a/dhp-workflows/dhp-dedup-openaire/src/test/resources/eu/dnetlib/dhp/dedup/json/publication_merge5.json b/dhp-workflows/dhp-dedup-openaire/src/test/resources/eu/dnetlib/dhp/dedup/json/publication_merge5.json new file mode 100644 index 000000000..416b75a9b --- /dev/null +++ b/dhp-workflows/dhp-dedup-openaire/src/test/resources/eu/dnetlib/dhp/dedup/json/publication_merge5.json @@ -0,0 +1,3 @@ +{"id":"50|doajarticles::842fa3b99fcdccafb4d5c8a815f56efa","dateofcollection":"2020-04-06T12:22:31.216Z","title":[{"dataInfo":{"deletedbyinference":false,"inferenceprovenance":"","inferred":false,"invisible":false,"provenanceaction":{"classid":"sysimport:crosswalk:repository","classname":"sysimport:crosswalk:repository","schemeid":"dnet:provenanceActions","schemename":"dnet:provenanceActions"},"trust":"0.9"},"qualifier":{"classid":"main title","classname":"main title","schemeid":"dnet:dataCite_title","schemename":"dnet:dataCite_title"},"value":"Increased Expression of Herpes Virus-Encoded hsv1-miR-H18 and hsv2-miR-H9-5p in Cancer-Containing Prostate Tissue Compared to That in Benign Prostate Hyperplasia Tissue"}],"publisher":{"dataInfo":{"deletedbyinference":false,"inferenceprovenance":"","inferred":false,"invisible":false,"provenanceaction":{"classid":"sysimport:crosswalk:repository","classname":"sysimport:crosswalk:repository","schemeid":"dnet:provenanceActions","schemename":"dnet:provenanceActions"},"trust":"0.9"},"value":"Korean Continence Society"},"bestaccessright":null,"dataInfo":{"deletedbyinference":true,"inferenceprovenance":"","inferred":false,"invisible":false,"provenanceaction":{"classid":"sysimport:crosswalk:repository","classname":"sysimport:crosswalk:repository","schemeid":"dnet:provenanceActions","schemename":"dnet:provenanceActions"},"trust":"0.9"},"collectedfrom":[{"dataInfo":null,"key":"10|driver______::bee53aa31dc2cbb538c10c2b65fa5824","value":"DOAJ-Articles"}],"pid":[],"author":[{"affiliation":null,"fullname":"Seok Joong Yun","name":null,"pid":[],"rank":1,"surname":null},{"affiliation":null,"fullname":"Pildu Jeong","name":null,"pid":[],"rank":2,"surname":null},{"affiliation":null,"fullname":"Ho Won Kang","name":null,"pid":[],"rank":3,"surname":null},{"affiliation":null,"fullname":"Helen Ki Shinn","name":null,"pid":[],"rank":4,"surname":null},{"affiliation":null,"fullname":"Ye-Hwan Kim","name":null,"pid":[],"rank":5,"surname":null},{"affiliation":null,"fullname":"Chunri Yan","name":null,"pid":[],"rank":6,"surname":null},{"affiliation":null,"fullname":"Young-Ki Choi","name":null,"pid":[],"rank":7,"surname":null},{"affiliation":null,"fullname":"Dongho Kim","name":null,"pid":[],"rank":8,"surname":null},{"affiliation":null,"fullname":"Dong Hee Ryu","name":null,"pid":[],"rank":9,"surname":null},{"affiliation":null,"fullname":"Yun-Sok Ha","name":null,"pid":[],"rank":10,"surname":null},{"affiliation":null,"fullname":"Tae-Hwan Kim","name":null,"pid":[],"rank":11,"surname":null},{"affiliation":null,"fullname":"Tae Gyun Kwon","name":null,"pid":[],"rank":12,"surname":null},{"affiliation":null,"fullname":"Jung Min Kim","name":null,"pid":[],"rank":13,"surname":null},{"affiliation":null,"fullname":"Sang Heon Suh","name":null,"pid":[],"rank":14,"surname":null},{"affiliation":null,"fullname":"Seon-Kyu Kim","name":null,"pid":[],"rank":15,"surname":null},{"affiliation":null,"fullname":"Seon-Young Kim","name":null,"pid":[],"rank":16,"surname":null},{"affiliation":null,"fullname":"Sang Tae Kim","name":null,"pid":[],"rank":17,"surname":null},{"affiliation":null,"fullname":"Won Tae Kim","name":null,"pid":[],"rank":18,"surname":null},{"affiliation":null,"fullname":"Ok-Jun Lee","name":null,"pid":[],"rank":19,"surname":null},{"affiliation":null,"fullname":"Sung-Kwon Moon","name":null,"pid":[],"rank":20,"surname":null},{"affiliation":null,"fullname":"Nam-Hyung Kim","name":null,"pid":[],"rank":21,"surname":null},{"affiliation":null,"fullname":"Isaac Yi Kim","name":null,"pid":[],"rank":22,"surname":null},{"affiliation":null,"fullname":"Jayoung Kim","name":null,"pid":[],"rank":23,"surname":null},{"affiliation":null,"fullname":"Hee-Jae Cha","name":null,"pid":[],"rank":24,"surname":null},{"affiliation":null,"fullname":"Yung-Hyun Choi","name":null,"pid":[],"rank":25,"surname":null},{"affiliation":null,"fullname":"Eun-Jong Cha","name":null,"pid":[],"rank":26,"surname":null},{"affiliation":null,"fullname":"Wun-Jae Kim","name":null,"pid":[],"rank":27,"surname":null}],"resulttype":{"classid":"publication","classname":"publication","schemeid":"dnet:result_typologies","schemename":"dnet:result_typologies"},"language":{"classid":"eng","classname":"English","schemeid":"dnet:languages","schemename":"dnet:languages"},"country":[],"subject":[{"dataInfo":{"deletedbyinference":false,"inferenceprovenance":"","inferred":false,"invisible":false,"provenanceaction":{"classid":"sysimport:crosswalk:repository","classname":"sysimport:crosswalk:repository","schemeid":"dnet:provenanceActions","schemename":"dnet:provenanceActions"},"trust":"0.9"},"qualifier":{"classid":"","classname":"","schemeid":"","schemename":""},"value":"MicroRNAs"},{"dataInfo":{"deletedbyinference":false,"inferenceprovenance":"","inferred":false,"invisible":false,"provenanceaction":{"classid":"sysimport:crosswalk:repository","classname":"sysimport:crosswalk:repository","schemeid":"dnet:provenanceActions","schemename":"dnet:provenanceActions"},"trust":"0.9"},"qualifier":{"classid":"","classname":"","schemeid":"","schemename":""},"value":"Prostate Neoplasms"},{"dataInfo":{"deletedbyinference":false,"inferenceprovenance":"","inferred":false,"invisible":false,"provenanceaction":{"classid":"sysimport:crosswalk:repository","classname":"sysimport:crosswalk:repository","schemeid":"dnet:provenanceActions","schemename":"dnet:provenanceActions"},"trust":"0.9"},"qualifier":{"classid":"","classname":"","schemeid":"","schemename":""},"value":"Herpesviridae"},{"dataInfo":{"deletedbyinference":false,"inferenceprovenance":"","inferred":false,"invisible":false,"provenanceaction":{"classid":"sysimport:crosswalk:repository","classname":"sysimport:crosswalk:repository","schemeid":"dnet:provenanceActions","schemename":"dnet:provenanceActions"},"trust":"0.9"},"qualifier":{"classid":"","classname":"","schemeid":"","schemename":""},"value":"Prostate Hyperplasia"},{"dataInfo":{"deletedbyinference":false,"inferenceprovenance":"","inferred":false,"invisible":false,"provenanceaction":{"classid":"sysimport:crosswalk:repository","classname":"sysimport:crosswalk:repository","schemeid":"dnet:provenanceActions","schemename":"dnet:provenanceActions"},"trust":"0.9"},"qualifier":{"classid":"","classname":"","schemeid":"","schemename":""},"value":"Diseases of the genitourinary system. Urology"},{"dataInfo":{"deletedbyinference":false,"inferenceprovenance":"","inferred":false,"invisible":false,"provenanceaction":{"classid":"sysimport:crosswalk:repository","classname":"sysimport:crosswalk:repository","schemeid":"dnet:provenanceActions","schemename":"dnet:provenanceActions"},"trust":"0.9"},"qualifier":{"classid":"","classname":"","schemeid":"","schemename":""},"value":"RC870-923"}],"description":[{"dataInfo":{"deletedbyinference":false,"inferenceprovenance":"","inferred":false,"invisible":false,"provenanceaction":{"classid":"sysimport:crosswalk:repository","classname":"sysimport:crosswalk:repository","schemeid":"dnet:provenanceActions","schemename":"dnet:provenanceActions"},"trust":"0.9"},"value":"Purpose: Previously, we reported the presence of virus-encoded microRNAs (miRNAs) in the urine of prostate cancer (CaP) patients. In this study, we investigated the expression of two herpes virus-encoded miRNAs in prostate tissue. Methods: A total of 175 tissue samples from noncancerous benign prostatic hyperplasia (BPH), 248 tissue samples from patients with CaP and BPH, and 50 samples from noncancerous surrounding tissues from these same patients were analyzed for the expression of two herpes virus-encoded miRNAs by real-time polymerase chain reaction (PCR) and immunocytochemistry using nanoparticles as molecular beacons. Results: Real-time reverse transcription-PCR results revealed significantly higher expression of hsv1-miR-H18 and hsv2-miRH9- 5p in surrounding noncancerous and CaP tissues than that in BPH tissue (each comparison, P<0.001). Of note, these miRNA were expressed equivalently in the CaP tissues and surrounding noncancerous tissues. Moreover, immunocytochemistry clearly demonstrated a significant enrichment of both hsv1-miR-H18 and hsv2-miR-H9 beacon-labeled cells in CaP and surrounding noncancerous tissue compared to that in BPH tissue (each comparison, P<0.05 for hsv1-miR-H18 and hsv2- miR-H9). Conclusions: These results suggest that increased expression of hsv1-miR-H18 and hsv2-miR-H95p might be associated with tumorigenesis in the prostate. Further studies will be required to elucidate the role of these miRNAs with respect to CaP and herpes viral infections."}],"dateofacceptance":{"dataInfo":{"deletedbyinference":false,"inferenceprovenance":"","inferred":false,"invisible":false,"provenanceaction":{"classid":"sysimport:crosswalk:repository","classname":"sysimport:crosswalk:repository","schemeid":"dnet:provenanceActions","schemename":"dnet:provenanceActions"},"trust":"0.9"},"value":"2016-06-01"},"embargoenddate":null,"resourcetype":null,"context":[],"instance":[{"accessright":{"classid":"OPEN","classname":"Open Access","schemeid":"dnet:access_modes","schemename":"dnet:access_modes"},"collectedfrom":{"dataInfo":null,"key":"10|driver______::bee53aa31dc2cbb538c10c2b65fa5824","value":"DOAJ-Articles"},"dateofacceptance":{"dataInfo":{"deletedbyinference":false,"inferenceprovenance":"","inferred":false,"invisible":false,"provenanceaction":{"classid":"sysimport:crosswalk:repository","classname":"sysimport:crosswalk:repository","schemeid":"dnet:provenanceActions","schemename":"dnet:provenanceActions"},"trust":"0.9"},"value":"2016-06-01"},"distributionlocation":"","hostedby":{"dataInfo":null,"key":"10|doajarticles::52db9a4f8e176f6e8e1d9f0c1e0a2de0","value":"International Neurourology Journal"},"instancetype":{"classid":"0001","classname":"peerReviewed","schemeid":"dnet:publication_resource","schemename":"dnet:publication_resource"},"license":null,"processingchargeamount":null,"processingchargecurrency":null,"refereed":null,"url":["http://www.einj.org/upload/pdf/inj-1632552-276.pdf","https://doaj.org/toc/2093-4777","https://doaj.org/toc/2093-6931"]}]} +{"id":"50|od_______267::b5f5da11a8239ef57655cea8675cb466","dateofcollection":"","title":[{"dataInfo":{"deletedbyinference":false,"inferenceprovenance":"","inferred":false,"invisible":false,"provenanceaction":{"classid":"sysimport:crosswalk","classname":"sysimport:crosswalk","schemeid":"dnet:provenanceActions","schemename":"dnet:provenanceActions"},"trust":"0.9"},"qualifier":{"classid":"main title","classname":"main title","schemeid":"dnet:dataCite_title","schemename":"dnet:dataCite_title"},"value":"Increased Expression of Herpes Virus-Encoded hsv1-miR-H18 and hsv2-miR-H9-5p in Cancer-Containing Prostate Tissue Compared to That in Benign Prostate Hyperplasia Tissue"}],"publisher":{"dataInfo":{"deletedbyinference":false,"inferenceprovenance":"","inferred":false,"invisible":false,"provenanceaction":{"classid":"sysimport:crosswalk","classname":"sysimport:crosswalk","schemeid":"dnet:provenanceActions","schemename":"dnet:provenanceActions"},"trust":"0.9"},"value":"Korean Continence Society"},"bestaccessright":null,"dataInfo":{"deletedbyinference":true,"inferenceprovenance":"","inferred":false,"invisible":false,"provenanceaction":{"classid":"sysimport:crosswalk","classname":"sysimport:crosswalk","schemeid":"dnet:provenanceActions","schemename":"dnet:provenanceActions"},"trust":"0.9"},"collectedfrom":[{"dataInfo":null,"key":"10|opendoar____::eda80a3d5b344bc40f3bc04f65b7a357","value":"PubMed Central"}],"pid":[],"author":[{"affiliation":null,"fullname":"Yun, Seok Joong","name":"Seok Joong","pid":[{"dataInfo":{"deletedbyinference":false,"inferenceprovenance":"","inferred":false,"invisible":false,"provenanceaction":{"classid":"sysimport:crosswalk","classname":"sysimport:crosswalk","schemeid":"dnet:provenanceActions","schemename":"dnet:provenanceActions"},"trust":"0.9"},"qualifier":{"classid":"ORCID","classname":"ORCID","schemeid":"dnet:pid_types","schemename":"dnet:pid_types"},"value":"0000-0001-7737-4746"}],"rank":1,"surname":"Yun"},{"affiliation":null,"fullname":"Jeong, Pildu","name":"Pildu","pid":[{"dataInfo":{"deletedbyinference":false,"inferenceprovenance":"","inferred":false,"invisible":false,"provenanceaction":{"classid":"sysimport:crosswalk","classname":"sysimport:crosswalk","schemeid":"dnet:provenanceActions","schemename":"dnet:provenanceActions"},"trust":"0.9"},"qualifier":{"classid":"ORCID","classname":"ORCID","schemeid":"dnet:pid_types","schemename":"dnet:pid_types"},"value":"0000-0002-5602-5376"}],"rank":2,"surname":"Jeong"},{"affiliation":null,"fullname":"Kang, Ho Won","name":"Ho Won","pid":[{"dataInfo":{"deletedbyinference":false,"inferenceprovenance":"","inferred":false,"invisible":false,"provenanceaction":{"classid":"sysimport:crosswalk","classname":"sysimport:crosswalk","schemeid":"dnet:provenanceActions","schemename":"dnet:provenanceActions"},"trust":"0.9"},"qualifier":{"classid":"ORCID","classname":"ORCID","schemeid":"dnet:pid_types","schemename":"dnet:pid_types"},"value":"0000-0002-8164-4427"}],"rank":3,"surname":"Kang"},{"affiliation":null,"fullname":"Shinn, Helen Ki","name":"Helen Ki","pid":[],"rank":4,"surname":"Shinn"},{"affiliation":null,"fullname":"Kim, Ye-Hwan","name":"Ye-Hwan","pid":[{"dataInfo":{"deletedbyinference":false,"inferenceprovenance":"","inferred":false,"invisible":false,"provenanceaction":{"classid":"sysimport:crosswalk","classname":"sysimport:crosswalk","schemeid":"dnet:provenanceActions","schemename":"dnet:provenanceActions"},"trust":"0.9"},"qualifier":{"classid":"ORCID","classname":"ORCID","schemeid":"dnet:pid_types","schemename":"dnet:pid_types"},"value":"0000-0002-8676-7119"}],"rank":5,"surname":"Kim"},{"affiliation":null,"fullname":"Yan, Chunri","name":"Chunri","pid":[],"rank":6,"surname":"Yan"},{"affiliation":null,"fullname":"Choi, Young-Ki","name":"Young-Ki","pid":[{"dataInfo":{"deletedbyinference":false,"inferenceprovenance":"","inferred":false,"invisible":false,"provenanceaction":{"classid":"sysimport:crosswalk","classname":"sysimport:crosswalk","schemeid":"dnet:provenanceActions","schemename":"dnet:provenanceActions"},"trust":"0.9"},"qualifier":{"classid":"ORCID","classname":"ORCID","schemeid":"dnet:pid_types","schemename":"dnet:pid_types"},"value":"0000-0002-1894-9869"}],"rank":7,"surname":"Choi"},{"affiliation":null,"fullname":"Kim, Dongho","name":"Dongho","pid":[{"dataInfo":{"deletedbyinference":false,"inferenceprovenance":"","inferred":false,"invisible":false,"provenanceaction":{"classid":"sysimport:crosswalk","classname":"sysimport:crosswalk","schemeid":"dnet:provenanceActions","schemename":"dnet:provenanceActions"},"trust":"0.9"},"qualifier":{"classid":"ORCID","classname":"ORCID","schemeid":"dnet:pid_types","schemename":"dnet:pid_types"},"value":"0000-0002-1409-3311"}],"rank":8,"surname":"Kim"},{"affiliation":null,"fullname":"Ryu, Dong Hee","name":"Dong Hee","pid":[{"dataInfo":{"deletedbyinference":false,"inferenceprovenance":"","inferred":false,"invisible":false,"provenanceaction":{"classid":"sysimport:crosswalk","classname":"sysimport:crosswalk","schemeid":"dnet:provenanceActions","schemename":"dnet:provenanceActions"},"trust":"0.9"},"qualifier":{"classid":"ORCID","classname":"ORCID","schemeid":"dnet:pid_types","schemename":"dnet:pid_types"},"value":"0000-0001-6088-298X"}],"rank":9,"surname":"Ryu"},{"affiliation":null,"fullname":"Ha, Yun-Sok","name":"Yun-Sok","pid":[{"dataInfo":{"deletedbyinference":false,"inferenceprovenance":"","inferred":false,"invisible":false,"provenanceaction":{"classid":"sysimport:crosswalk","classname":"sysimport:crosswalk","schemeid":"dnet:provenanceActions","schemename":"dnet:provenanceActions"},"trust":"0.9"},"qualifier":{"classid":"ORCID","classname":"ORCID","schemeid":"dnet:pid_types","schemename":"dnet:pid_types"},"value":"0000-0003-3732-9814"}],"rank":10,"surname":"Ha"},{"affiliation":null,"fullname":"Kim, Tae-Hwan","name":"Tae-Hwan","pid":[],"rank":11,"surname":"Kim"},{"affiliation":null,"fullname":"Kwon, Tae Gyun","name":"Tae Gyun","pid":[{"dataInfo":{"deletedbyinference":false,"inferenceprovenance":"","inferred":false,"invisible":false,"provenanceaction":{"classid":"sysimport:crosswalk","classname":"sysimport:crosswalk","schemeid":"dnet:provenanceActions","schemename":"dnet:provenanceActions"},"trust":"0.9"},"qualifier":{"classid":"ORCID","classname":"ORCID","schemeid":"dnet:pid_types","schemename":"dnet:pid_types"},"value":"0000-0002-4390-0952"}],"rank":12,"surname":"Kwon"},{"affiliation":null,"fullname":"Kim, Jung Min","name":"Jung Min","pid":[{"dataInfo":{"deletedbyinference":false,"inferenceprovenance":"","inferred":false,"invisible":false,"provenanceaction":{"classid":"sysimport:crosswalk","classname":"sysimport:crosswalk","schemeid":"dnet:provenanceActions","schemename":"dnet:provenanceActions"},"trust":"0.9"},"qualifier":{"classid":"ORCID","classname":"ORCID","schemeid":"dnet:pid_types","schemename":"dnet:pid_types"},"value":"0000-0001-6319-0217"}],"rank":13,"surname":"Kim"},{"affiliation":null,"fullname":"Suh, Sang Heon","name":"Sang Heon","pid":[{"dataInfo":{"deletedbyinference":false,"inferenceprovenance":"","inferred":false,"invisible":false,"provenanceaction":{"classid":"sysimport:crosswalk","classname":"sysimport:crosswalk","schemeid":"dnet:provenanceActions","schemename":"dnet:provenanceActions"},"trust":"0.9"},"qualifier":{"classid":"ORCID","classname":"ORCID","schemeid":"dnet:pid_types","schemename":"dnet:pid_types"},"value":"0000-0003-4560-8880"}],"rank":14,"surname":"Suh"},{"affiliation":null,"fullname":"Kim, Seon-Kyu","name":"Seon-Kyu","pid":[{"dataInfo":{"deletedbyinference":false,"inferenceprovenance":"","inferred":false,"invisible":false,"provenanceaction":{"classid":"sysimport:crosswalk","classname":"sysimport:crosswalk","schemeid":"dnet:provenanceActions","schemename":"dnet:provenanceActions"},"trust":"0.9"},"qualifier":{"classid":"ORCID","classname":"ORCID","schemeid":"dnet:pid_types","schemename":"dnet:pid_types"},"value":"0000-0002-4176-5187"}],"rank":15,"surname":"Kim"},{"affiliation":null,"fullname":"Kim, Seon-Young","name":"Seon-Young","pid":[{"dataInfo":{"deletedbyinference":false,"inferenceprovenance":"","inferred":false,"invisible":false,"provenanceaction":{"classid":"sysimport:crosswalk","classname":"sysimport:crosswalk","schemeid":"dnet:provenanceActions","schemename":"dnet:provenanceActions"},"trust":"0.9"},"qualifier":{"classid":"ORCID","classname":"ORCID","schemeid":"dnet:pid_types","schemename":"dnet:pid_types"},"value":"0000-0002-1030-7730"}],"rank":16,"surname":"Kim"},{"affiliation":null,"fullname":"Kim, Sang Tae","name":"Sang Tae","pid":[],"rank":17,"surname":"Kim"},{"affiliation":null,"fullname":"Kim, Won Tae","name":"Won Tae","pid":[],"rank":18,"surname":"Kim"},{"affiliation":null,"fullname":"Lee, Ok-Jun","name":"Ok-Jun","pid":[],"rank":19,"surname":"Lee"},{"affiliation":null,"fullname":"Moon, Sung-Kwon","name":"Sung-Kwon","pid":[],"rank":20,"surname":"Moon"},{"affiliation":null,"fullname":"Kim, Nam-Hyung","name":"Nam-Hyung","pid":[],"rank":21,"surname":"Kim"},{"affiliation":null,"fullname":"Kim, Isaac Yi","name":"Isaac Yi","pid":[{"dataInfo":{"deletedbyinference":false,"inferenceprovenance":"","inferred":false,"invisible":false,"provenanceaction":{"classid":"sysimport:crosswalk","classname":"sysimport:crosswalk","schemeid":"dnet:provenanceActions","schemename":"dnet:provenanceActions"},"trust":"0.9"},"qualifier":{"classid":"ORCID","classname":"ORCID","schemeid":"dnet:pid_types","schemename":"dnet:pid_types"},"value":"0000-0002-1967-5281"}],"rank":22,"surname":"Kim"},{"affiliation":null,"fullname":"Kim, Jayoung","name":"Jayoung","pid":[],"rank":23,"surname":"Kim"},{"affiliation":null,"fullname":"Cha, Hee-Jae","name":"Hee-Jae","pid":[{"dataInfo":{"deletedbyinference":false,"inferenceprovenance":"","inferred":false,"invisible":false,"provenanceaction":{"classid":"sysimport:crosswalk","classname":"sysimport:crosswalk","schemeid":"dnet:provenanceActions","schemename":"dnet:provenanceActions"},"trust":"0.9"},"qualifier":{"classid":"ORCID","classname":"ORCID","schemeid":"dnet:pid_types","schemename":"dnet:pid_types"},"value":"0000-0002-6963-2685"}],"rank":24,"surname":"Cha"},{"affiliation":null,"fullname":"Choi, Yung-Hyun","name":"Yung-Hyun","pid":[{"dataInfo":{"deletedbyinference":false,"inferenceprovenance":"","inferred":false,"invisible":false,"provenanceaction":{"classid":"sysimport:crosswalk","classname":"sysimport:crosswalk","schemeid":"dnet:provenanceActions","schemename":"dnet:provenanceActions"},"trust":"0.9"},"qualifier":{"classid":"ORCID","classname":"ORCID","schemeid":"dnet:pid_types","schemename":"dnet:pid_types"},"value":"0000-0002-1454-3124"}],"rank":25,"surname":"Choi"},{"affiliation":null,"fullname":"Cha, Eun-Jong","name":"Eun-Jong","pid":[],"rank":26,"surname":"Cha"},{"affiliation":null,"fullname":"Kim, Wun-Jae","name":"Wun-Jae","pid":[{"dataInfo":{"deletedbyinference":false,"inferenceprovenance":"","inferred":false,"invisible":false,"provenanceaction":{"classid":"sysimport:crosswalk","classname":"sysimport:crosswalk","schemeid":"dnet:provenanceActions","schemename":"dnet:provenanceActions"},"trust":"0.9"},"qualifier":{"classid":"ORCID","classname":"ORCID","schemeid":"dnet:pid_types","schemename":"dnet:pid_types"},"value":"0000-0002-8060-8926"}],"rank":27,"surname":"Kim"}],"resulttype":{"classid":"publication","classname":"publication","schemeid":"dnet:result_typologies","schemename":"dnet:result_typologies"},"language":{"classid":"eng","classname":"English","schemeid":"dnet:languages","schemename":"dnet:languages"},"country":[],"subject":[{"dataInfo":{"deletedbyinference":false,"inferenceprovenance":"","inferred":false,"invisible":false,"provenanceaction":{"classid":"sysimport:crosswalk","classname":"sysimport:crosswalk","schemeid":"dnet:provenanceActions","schemename":"dnet:provenanceActions"},"trust":"0.9"},"qualifier":{"classid":"","classname":"","schemeid":"","schemename":""},"value":"Original Article"},{"dataInfo":{"deletedbyinference":false,"inferenceprovenance":"","inferred":false,"invisible":false,"provenanceaction":{"classid":"sysimport:crosswalk","classname":"sysimport:crosswalk","schemeid":"dnet:provenanceActions","schemename":"dnet:provenanceActions"},"trust":"0.9"},"qualifier":{"classid":"","classname":"","schemeid":"","schemename":""},"value":"Fundamental Science for Neurourology"},{"dataInfo":{"deletedbyinference":false,"inferenceprovenance":"","inferred":false,"invisible":false,"provenanceaction":{"classid":"sysimport:crosswalk","classname":"sysimport:crosswalk","schemeid":"dnet:provenanceActions","schemename":"dnet:provenanceActions"},"trust":"0.9"},"qualifier":{"classid":"","classname":"","schemeid":"","schemename":""},"value":"MicroRNAs"},{"dataInfo":{"deletedbyinference":false,"inferenceprovenance":"","inferred":false,"invisible":false,"provenanceaction":{"classid":"sysimport:crosswalk","classname":"sysimport:crosswalk","schemeid":"dnet:provenanceActions","schemename":"dnet:provenanceActions"},"trust":"0.9"},"qualifier":{"classid":"","classname":"","schemeid":"","schemename":""},"value":"Prostate Neoplasms"},{"dataInfo":{"deletedbyinference":false,"inferenceprovenance":"","inferred":false,"invisible":false,"provenanceaction":{"classid":"sysimport:crosswalk","classname":"sysimport:crosswalk","schemeid":"dnet:provenanceActions","schemename":"dnet:provenanceActions"},"trust":"0.9"},"qualifier":{"classid":"","classname":"","schemeid":"","schemename":""},"value":"Herpesviridae"},{"dataInfo":{"deletedbyinference":false,"inferenceprovenance":"","inferred":false,"invisible":false,"provenanceaction":{"classid":"sysimport:crosswalk","classname":"sysimport:crosswalk","schemeid":"dnet:provenanceActions","schemename":"dnet:provenanceActions"},"trust":"0.9"},"qualifier":{"classid":"","classname":"","schemeid":"","schemename":""},"value":"Prostate Hyperplasia"}],"description":[{"dataInfo":{"deletedbyinference":false,"inferenceprovenance":"","inferred":false,"invisible":false,"provenanceaction":{"classid":"sysimport:crosswalk","classname":"sysimport:crosswalk","schemeid":"dnet:provenanceActions","schemename":"dnet:provenanceActions"},"trust":"0.9"},"value":"Purpose: Previously, we reported the presence of virus-encoded microRNAs (miRNAs) in the urine of prostate cancer (CaP) patients. In this study, we investigated the expression of two herpes virus-encoded miRNAs in prostate tissue. Methods: A total of 175 tissue samples from noncancerous benign prostatic hyperplasia (BPH), 248 tissue samples from patients with CaP and BPH, and 50 samples from noncancerous surrounding tissues from these same patients were analyzed for the expression of two herpes virus-encoded miRNAs by real-time polymerase chain reaction (PCR) and immunocytochemistry using nanoparticles as molecular beacons. Results: Real-time reverse transcription-PCR results revealed significantly higher expression of hsv1-miR-H18 and hsv2-miRH9- 5p in surrounding noncancerous and CaP tissues than that in BPH tissue (each comparison, P<0.001). Of note, these miRNA were expressed equivalently in the CaP tissues and surrounding noncancerous tissues. Moreover, immunocytochemistry clearly demonstrated a significant enrichment of both hsv1-miR-H18 and hsv2-miR-H9 beacon-labeled cells in CaP and surrounding noncancerous tissue compared to that in BPH tissue (each comparison, P<0.05 for hsv1-miR-H18 and hsv2- miR-H9). Conclusions: These results suggest that increased expression of hsv1-miR-H18 and hsv2-miR-H95p might be associated with tumorigenesis in the prostate. Further studies will be required to elucidate the role of these miRNAs with respect to CaP and herpes viral infections."}],"dateofacceptance":{"dataInfo":{"deletedbyinference":false,"inferenceprovenance":"","inferred":false,"invisible":false,"provenanceaction":{"classid":"sysimport:crosswalk","classname":"sysimport:crosswalk","schemeid":"dnet:provenanceActions","schemename":"dnet:provenanceActions"},"trust":"0.9"},"value":"2016-06-01"},"embargoenddate":null,"resourcetype":null,"context":[],"instance":[{"accessright":{"classid":"OPEN","classname":"Open Access","schemeid":"dnet:access_modes","schemename":"dnet:access_modes"},"collectedfrom":{"dataInfo":null,"key":"10|opendoar____::eda80a3d5b344bc40f3bc04f65b7a357","value":"PubMed Central"},"dateofacceptance":{"dataInfo":{"deletedbyinference":false,"inferenceprovenance":"","inferred":false,"invisible":false,"provenanceaction":{"classid":"sysimport:crosswalk","classname":"sysimport:crosswalk","schemeid":"dnet:provenanceActions","schemename":"dnet:provenanceActions"},"trust":"0.9"},"value":"2016-06-01"},"distributionlocation":"","hostedby":{"dataInfo":null,"key":"10|opendoar____::8b6dd7db9af49e67306feb59a8bdc52c","value":"Europe PubMed Central"},"instancetype":{"classid":"0001","classname":"peerReviewed","schemeid":"dnet:publication_resource","schemename":"dnet:publication_resource"},"license":null,"processingchargeamount":null,"processingchargecurrency":null,"refereed":null,"url":["http://europepmc.org/articles/PMC4932644"]}]} +{"id":"50|doiboost____::0ca46ff10b2b4c756191719d85302b14","dateofcollection":"2019-02-15","title":[{"dataInfo":{"deletedbyinference":false,"inferenceprovenance":"","inferred":false,"invisible":false,"provenanceaction":{"classid":"","classname":"","schemeid":"","schemename":""},"trust":""},"qualifier":{"classid":"main title","classname":"main title","schemeid":"dnet:dataCite_title","schemename":"dnet:dataCite_title"},"value":"Increased Expression of Herpes Virus-Encoded hsv1-miR-H18 and hsv2-miR-H9-5p in Cancer-Containing Prostate Tissue Compared to That in Benign Prostate Hyperplasia Tissue"}],"publisher":{"dataInfo":{"deletedbyinference":false,"inferenceprovenance":"","inferred":false,"invisible":false,"provenanceaction":{"classid":"","classname":"","schemeid":"","schemename":""},"trust":""},"value":""},"bestaccessright":{"classid":"OPEN","classname":"Open Access","schemeid":"dnet:access_modes","schemename":"dnet:access_modes"},"dataInfo":{"deletedbyinference":true,"inferenceprovenance":"","inferred":false,"invisible":false,"provenanceaction":{"classid":"sysimport:actionset","classname":"sysimport:actionset","schemeid":"dnet:provenanceActions","schemename":"dnet:provenanceActions"},"trust":"0.9"},"collectedfrom":[{"dataInfo":{"deletedbyinference":false,"inferenceprovenance":"","inferred":false,"invisible":false,"provenanceaction":{"classid":"","classname":"","schemeid":"","schemename":""},"trust":""},"key":"10|openaire____::5f532a3fc4f1ea403f37070f59a7a53a","value":"Microsoft Academic Graph"},{"dataInfo":{"deletedbyinference":false,"inferenceprovenance":"","inferred":false,"invisible":false,"provenanceaction":{"classid":"","classname":"","schemeid":"","schemename":""},"trust":""},"key":"10|openaire____::8ac8380272269217cb09a928c8caa993","value":"UnpayWall"}],"pid":[],"author":[{"affiliation":[{"dataInfo":{"deletedbyinference":false,"inferenceprovenance":"","inferred":false,"invisible":false,"provenanceaction":{"classid":"","classname":"","schemeid":"","schemename":""},"trust":""},"value":"Chungbuk National University"}],"fullname":"Seok Joong Yun","name":"Seok Joong","pid":[{"dataInfo":null,"qualifier":{"classid":"MAG Identifier","classname":"MAG Identifier","schemeid":null,"schemename":null},"value":"2105974574"}],"rank":1,"surname":"Yun"},{"affiliation":[{"dataInfo":{"deletedbyinference":false,"inferenceprovenance":"","inferred":false,"invisible":false,"provenanceaction":{"classid":"","classname":"","schemeid":"","schemename":""},"trust":""},"value":"Chungbuk National University"}],"fullname":"Pildu Jeong","name":"Pildu","pid":[{"dataInfo":null,"qualifier":{"classid":"MAG Identifier","classname":"MAG Identifier","schemeid":null,"schemename":null},"value":"2041919263"}],"rank":2,"surname":"Jeong"},{"affiliation":[{"dataInfo":{"deletedbyinference":false,"inferenceprovenance":"","inferred":false,"invisible":false,"provenanceaction":{"classid":"","classname":"","schemeid":"","schemename":""},"trust":""},"value":"Chungbuk National University"}],"fullname":"Ho Won Kang","name":"Ho Won","pid":[{"dataInfo":null,"qualifier":{"classid":"MAG Identifier","classname":"MAG Identifier","schemeid":null,"schemename":null},"value":"2164408067"}],"rank":3,"surname":"Kang"},{"affiliation":[{"dataInfo":{"deletedbyinference":false,"inferenceprovenance":"","inferred":false,"invisible":false,"provenanceaction":{"classid":"","classname":"","schemeid":"","schemename":""},"trust":""},"value":"Inha University"}],"fullname":"Helen Ki Shinn","name":"Helen Ki","pid":[{"dataInfo":null,"qualifier":{"classid":"MAG Identifier","classname":"MAG Identifier","schemeid":null,"schemename":null},"value":"2045077081"}],"rank":4,"surname":"Shinn"},{"affiliation":[{"dataInfo":{"deletedbyinference":false,"inferenceprovenance":"","inferred":false,"invisible":false,"provenanceaction":{"classid":"","classname":"","schemeid":"","schemename":""},"trust":""},"value":"Chungbuk National University"}],"fullname":"Ye-Hwan Kim","name":"Ye-Hwan","pid":[{"dataInfo":null,"qualifier":{"classid":"MAG Identifier","classname":"MAG Identifier","schemeid":null,"schemename":null},"value":"2276303457"}],"rank":5,"surname":"Kim"},{"affiliation":[{"dataInfo":{"deletedbyinference":false,"inferenceprovenance":"","inferred":false,"invisible":false,"provenanceaction":{"classid":"","classname":"","schemeid":"","schemename":""},"trust":""},"value":"Chungbuk National University"}],"fullname":"Chunri Yan","name":"Chunri","pid":[{"dataInfo":null,"qualifier":{"classid":"MAG Identifier","classname":"MAG Identifier","schemeid":null,"schemename":null},"value":"2186750404"}],"rank":6,"surname":"Yan"},{"affiliation":[{"dataInfo":{"deletedbyinference":false,"inferenceprovenance":"","inferred":false,"invisible":false,"provenanceaction":{"classid":"","classname":"","schemeid":"","schemename":""},"trust":""},"value":"Chungbuk National University"}],"fullname":"Young-Ki Choi","name":"Young-Ki","pid":[{"dataInfo":null,"qualifier":{"classid":"MAG Identifier","classname":"MAG Identifier","schemeid":null,"schemename":null},"value":"2311466124"}],"rank":7,"surname":"Choi"},{"affiliation":[],"fullname":"Dongho Kim","name":"Dongho","pid":[{"dataInfo":null,"qualifier":{"classid":"MAG Identifier","classname":"MAG Identifier","schemeid":null,"schemename":null},"value":"2644843893"}],"rank":8,"surname":"Kim"},{"affiliation":[{"dataInfo":{"deletedbyinference":false,"inferenceprovenance":"","inferred":false,"invisible":false,"provenanceaction":{"classid":"","classname":"","schemeid":"","schemename":""},"trust":""},"value":"Chungbuk National University"}],"fullname":"Dong Hee Ryu","name":"Dong Hee","pid":[{"dataInfo":null,"qualifier":{"classid":"MAG Identifier","classname":"MAG Identifier","schemeid":null,"schemename":null},"value":"2117604941"}],"rank":9,"surname":"Ryu"},{"affiliation":[{"dataInfo":{"deletedbyinference":false,"inferenceprovenance":"","inferred":false,"invisible":false,"provenanceaction":{"classid":"","classname":"","schemeid":"","schemename":""},"trust":""},"value":"Kyungpook National University"}],"fullname":"Yun-Sok Ha","name":"Yun-Sok","pid":[{"dataInfo":null,"qualifier":{"classid":"MAG Identifier","classname":"MAG Identifier","schemeid":null,"schemename":null},"value":"2145233282"}],"rank":10,"surname":"Ha"},{"affiliation":[{"dataInfo":{"deletedbyinference":false,"inferenceprovenance":"","inferred":false,"invisible":false,"provenanceaction":{"classid":"","classname":"","schemeid":"","schemename":""},"trust":""},"value":"Kyungpook National University"}],"fullname":"Tae-Hwan Kim","name":"Tae-Hwan","pid":[{"dataInfo":null,"qualifier":{"classid":"MAG Identifier","classname":"MAG Identifier","schemeid":null,"schemename":null},"value":"2509096378"}],"rank":11,"surname":"Kim"},{"affiliation":[{"dataInfo":{"deletedbyinference":false,"inferenceprovenance":"","inferred":false,"invisible":false,"provenanceaction":{"classid":"","classname":"","schemeid":"","schemename":""},"trust":""},"value":"Kyungpook National University"}],"fullname":"Tae Gyun Kwon","name":"Tae Gyun","pid":[{"dataInfo":null,"qualifier":{"classid":"MAG Identifier","classname":"MAG Identifier","schemeid":null,"schemename":null},"value":"1978978081"}],"rank":12,"surname":"Kwon"},{"affiliation":[{"dataInfo":{"deletedbyinference":false,"inferenceprovenance":"","inferred":false,"invisible":false,"provenanceaction":{"classid":"","classname":"","schemeid":"","schemename":""},"trust":""},"value":"Daejeon University"}],"fullname":"Jung Min Kim","name":"Jung Min","pid":[{"dataInfo":null,"qualifier":{"classid":"MAG Identifier","classname":"MAG Identifier","schemeid":null,"schemename":null},"value":"2265841962"}],"rank":13,"surname":"Kim"},{"affiliation":[{"dataInfo":{"deletedbyinference":false,"inferenceprovenance":"","inferred":false,"invisible":false,"provenanceaction":{"classid":"","classname":"","schemeid":"","schemename":""},"trust":""},"value":"KAIST"}],"fullname":"Sang Heon Suh","name":"Sang Heon","pid":[{"dataInfo":null,"qualifier":{"classid":"MAG Identifier","classname":"MAG Identifier","schemeid":null,"schemename":null},"value":"2890693470"}],"rank":14,"surname":"Suh"},{"affiliation":[{"dataInfo":{"deletedbyinference":false,"inferenceprovenance":"","inferred":false,"invisible":false,"provenanceaction":{"classid":"","classname":"","schemeid":"","schemename":""},"trust":""},"value":"Korea Research Institute of Bioscience and Biotechnology"}],"fullname":"Seon-Kyu Kim","name":"Seon-Kyu","pid":[{"dataInfo":null,"qualifier":{"classid":"MAG Identifier","classname":"MAG Identifier","schemeid":null,"schemename":null},"value":"2162364977"}],"rank":15,"surname":"Kim"},{"affiliation":[{"dataInfo":{"deletedbyinference":false,"inferenceprovenance":"","inferred":false,"invisible":false,"provenanceaction":{"classid":"","classname":"","schemeid":"","schemename":""},"trust":""},"value":"Korea Research Institute of Bioscience and Biotechnology"}],"fullname":"Seon-Young Kim","name":"Seon-Young","pid":[{"dataInfo":null,"qualifier":{"classid":"MAG Identifier","classname":"MAG Identifier","schemeid":null,"schemename":null},"value":"2344797375"}],"rank":16,"surname":"Kim"},{"affiliation":[{"dataInfo":{"deletedbyinference":false,"inferenceprovenance":"","inferred":false,"invisible":false,"provenanceaction":{"classid":"","classname":"","schemeid":"","schemename":""},"trust":""},"value":"Seoul National University Bundang Hospital"}],"fullname":"Sang Tae Kim","name":"Sang Tae","pid":[{"dataInfo":null,"qualifier":{"classid":"MAG Identifier","classname":"MAG Identifier","schemeid":null,"schemename":null},"value":"2257827509"}],"rank":17,"surname":"Kim"},{"affiliation":[{"dataInfo":{"deletedbyinference":false,"inferenceprovenance":"","inferred":false,"invisible":false,"provenanceaction":{"classid":"","classname":"","schemeid":"","schemename":""},"trust":""},"value":"Chungbuk National University"}],"fullname":"Won Tae Kim","name":"Won Tae","pid":[{"dataInfo":null,"qualifier":{"classid":"MAG Identifier","classname":"MAG Identifier","schemeid":null,"schemename":null},"value":"2617237649"}],"rank":18,"surname":"Kim"},{"affiliation":[{"dataInfo":{"deletedbyinference":false,"inferenceprovenance":"","inferred":false,"invisible":false,"provenanceaction":{"classid":"","classname":"","schemeid":"","schemename":""},"trust":""},"value":"Chungbuk National University"}],"fullname":"Ok-Jun Lee","name":"Ok-Jun","pid":[{"dataInfo":null,"qualifier":{"classid":"MAG Identifier","classname":"MAG Identifier","schemeid":null,"schemename":null},"value":"2112231548"}],"rank":19,"surname":"Lee"},{"affiliation":[{"dataInfo":{"deletedbyinference":false,"inferenceprovenance":"","inferred":false,"invisible":false,"provenanceaction":{"classid":"","classname":"","schemeid":"","schemename":""},"trust":""},"value":"Chung-Ang University"}],"fullname":"Sung-Kwon Moon","name":"Sung-Kwon","pid":[{"dataInfo":null,"qualifier":{"classid":"MAG Identifier","classname":"MAG Identifier","schemeid":null,"schemename":null},"value":"2796689429"}],"rank":20,"surname":"Moon"},{"affiliation":[{"dataInfo":{"deletedbyinference":false,"inferenceprovenance":"","inferred":false,"invisible":false,"provenanceaction":{"classid":"","classname":"","schemeid":"","schemename":""},"trust":""},"value":"Chungbuk National University"}],"fullname":"Nam-Hyung Kim","name":"Nam-Hyung","pid":[{"dataInfo":null,"qualifier":{"classid":"MAG Identifier","classname":"MAG Identifier","schemeid":null,"schemename":null},"value":"2136287741"}],"rank":21,"surname":"Kim"},{"affiliation":[{"dataInfo":{"deletedbyinference":false,"inferenceprovenance":"","inferred":false,"invisible":false,"provenanceaction":{"classid":"","classname":"","schemeid":"","schemename":""},"trust":""},"value":"Rutgers University"}],"fullname":"Isaac Yi Kim","name":"Isaac Yi","pid":[{"dataInfo":null,"qualifier":{"classid":"MAG Identifier","classname":"MAG Identifier","schemeid":null,"schemename":null},"value":"2015295992"}],"rank":22,"surname":"Kim"},{"affiliation":[{"dataInfo":{"deletedbyinference":false,"inferenceprovenance":"","inferred":false,"invisible":false,"provenanceaction":{"classid":"","classname":"","schemeid":"","schemename":""},"trust":""},"value":"Harvard University"}],"fullname":"Jayoung Kim","name":"Jayoung","pid":[{"dataInfo":null,"qualifier":{"classid":"MAG Identifier","classname":"MAG Identifier","schemeid":null,"schemename":null},"value":"2130848131"}],"rank":23,"surname":"Kim"},{"affiliation":[{"dataInfo":{"deletedbyinference":false,"inferenceprovenance":"","inferred":false,"invisible":false,"provenanceaction":{"classid":"","classname":"","schemeid":"","schemename":""},"trust":""},"value":"Kosin University"}],"fullname":"Hee-Jae Cha","name":"Hee-Jae","pid":[{"dataInfo":null,"qualifier":{"classid":"MAG Identifier","classname":"MAG Identifier","schemeid":null,"schemename":null},"value":"2113489867"}],"rank":24,"surname":"Cha"},{"affiliation":[],"fullname":"Yung-Hyun Choi","name":"Yung-Hyun","pid":[{"dataInfo":null,"qualifier":{"classid":"MAG Identifier","classname":"MAG Identifier","schemeid":null,"schemename":null},"value":"2151282194"}],"rank":25,"surname":"Choi"},{"affiliation":[{"dataInfo":{"deletedbyinference":false,"inferenceprovenance":"","inferred":false,"invisible":false,"provenanceaction":{"classid":"","classname":"","schemeid":"","schemename":""},"trust":""},"value":"Chungbuk National University"}],"fullname":"Eun-Jong Cha","name":"Eun-Jong","pid":[{"dataInfo":null,"qualifier":{"classid":"MAG Identifier","classname":"MAG Identifier","schemeid":null,"schemename":null},"value":"2109572239"}],"rank":26,"surname":"Cha"},{"affiliation":[{"dataInfo":{"deletedbyinference":false,"inferenceprovenance":"","inferred":false,"invisible":false,"provenanceaction":{"classid":"","classname":"","schemeid":"","schemename":""},"trust":""},"value":"Chungbuk National University"}],"fullname":"Wun-Jae Kim","name":"Wun-Jae","pid":[{"dataInfo":null,"qualifier":{"classid":"MAG Identifier","classname":"MAG Identifier","schemeid":null,"schemename":null},"value":"2113339670"}],"rank":27,"surname":"Kim"}],"resulttype":{"classid":"publication","classname":"publication","schemeid":"dnet:result_typologies","schemename":"dnet:result_typologies"},"language":{"classid":"und","classname":"Undetermined","schemeid":"dnet:languages","schemename":"dnet:languages"},"country":[],"subject":[],"description":[{"dataInfo":{"deletedbyinference":false,"inferenceprovenance":"","inferred":false,"invisible":false,"provenanceaction":{"classid":"","classname":"","schemeid":"","schemename":""},"trust":""},"value":"Purpose:"}],"dateofacceptance":null,"embargoenddate":null,"resourcetype":null,"context":null,"instance":null} \ No newline at end of file From 259362ef47d7a2a754fa0d5a8a29902fca6435b8 Mon Sep 17 00:00:00 2001 From: miconis Date: Tue, 22 Sep 2020 09:43:27 +0200 Subject: [PATCH 03/12] implementation of the job to collect simrels from postgres db --- .../dhp/oa/dedup/SparkCollectSimRels.java | 167 ++++++++++++++++++ .../dhp/oa/dedup/SparkCreateMergeRels.java | 16 +- .../dhp/oa/dedup/SparkCreateSimRels.java | 17 +- .../oa/dedup/collectSimRels_parameters.json | 44 +++++ .../dnetlib/dhp/oa/dedup/SparkDedupTest.java | 140 +++++++++++---- .../dhp/dedup/assertions/groups/._SUCCESS.crc | Bin 0 -> 8 bytes ...-9cf4-eae22806175b-c000.snappy.parquet.crc | Bin 0 -> 612 bytes .../dhp/dedup/assertions/groups/_SUCCESS | 0 ...4d26-9cf4-eae22806175b-c000.snappy.parquet | Bin 0 -> 77026 bytes .../similarity_groups/._SUCCESS.crc | Bin 0 -> 8 bytes ...-a215-1619e7bb4e5d-c000.snappy.parquet.crc | Bin 0 -> 3904 bytes .../assertions/similarity_groups/_SUCCESS | 0 ...42f1-a215-1619e7bb4e5d-c000.snappy.parquet | Bin 0 -> 498300 bytes 13 files changed, 332 insertions(+), 52 deletions(-) create mode 100644 dhp-workflows/dhp-dedup-openaire/src/main/java/eu/dnetlib/dhp/oa/dedup/SparkCollectSimRels.java create mode 100644 dhp-workflows/dhp-dedup-openaire/src/main/resources/eu/dnetlib/dhp/oa/dedup/collectSimRels_parameters.json create mode 100644 dhp-workflows/dhp-dedup-openaire/src/test/resources/eu/dnetlib/dhp/dedup/assertions/groups/._SUCCESS.crc create mode 100644 dhp-workflows/dhp-dedup-openaire/src/test/resources/eu/dnetlib/dhp/dedup/assertions/groups/.part-00000-4bafcd13-3995-4d26-9cf4-eae22806175b-c000.snappy.parquet.crc create mode 100644 dhp-workflows/dhp-dedup-openaire/src/test/resources/eu/dnetlib/dhp/dedup/assertions/groups/_SUCCESS create mode 100644 dhp-workflows/dhp-dedup-openaire/src/test/resources/eu/dnetlib/dhp/dedup/assertions/groups/part-00000-4bafcd13-3995-4d26-9cf4-eae22806175b-c000.snappy.parquet create mode 100644 dhp-workflows/dhp-dedup-openaire/src/test/resources/eu/dnetlib/dhp/dedup/assertions/similarity_groups/._SUCCESS.crc create mode 100644 dhp-workflows/dhp-dedup-openaire/src/test/resources/eu/dnetlib/dhp/dedup/assertions/similarity_groups/.part-00000-ad5faba8-5922-42f1-a215-1619e7bb4e5d-c000.snappy.parquet.crc create mode 100644 dhp-workflows/dhp-dedup-openaire/src/test/resources/eu/dnetlib/dhp/dedup/assertions/similarity_groups/_SUCCESS create mode 100644 dhp-workflows/dhp-dedup-openaire/src/test/resources/eu/dnetlib/dhp/dedup/assertions/similarity_groups/part-00000-ad5faba8-5922-42f1-a215-1619e7bb4e5d-c000.snappy.parquet diff --git a/dhp-workflows/dhp-dedup-openaire/src/main/java/eu/dnetlib/dhp/oa/dedup/SparkCollectSimRels.java b/dhp-workflows/dhp-dedup-openaire/src/main/java/eu/dnetlib/dhp/oa/dedup/SparkCollectSimRels.java new file mode 100644 index 000000000..7c1e6550e --- /dev/null +++ b/dhp-workflows/dhp-dedup-openaire/src/main/java/eu/dnetlib/dhp/oa/dedup/SparkCollectSimRels.java @@ -0,0 +1,167 @@ +package eu.dnetlib.dhp.oa.dedup; + +import eu.dnetlib.dhp.application.ArgumentApplicationParser; +import eu.dnetlib.dhp.schema.oaf.DataInfo; +import eu.dnetlib.dhp.schema.oaf.Relation; +import eu.dnetlib.dhp.utils.ISLookupClientFactory; +import eu.dnetlib.enabling.is.lookup.rmi.ISLookUpService; +import org.apache.commons.io.IOUtils; +import org.apache.spark.SparkConf; +import org.apache.spark.api.java.JavaPairRDD; +import org.apache.spark.api.java.JavaRDD; +import org.apache.spark.sql.*; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import scala.Tuple2; + +import java.util.ArrayList; +import java.util.List; +import java.util.Optional; +import java.util.stream.Collectors; +import java.util.stream.StreamSupport; + +public class SparkCollectSimRels extends AbstractSparkAction { + + private static final Logger log = LoggerFactory.getLogger(SparkCollectSimRels.class); + + Dataset simGroupsDS; + Dataset groupsDS; + + public SparkCollectSimRels(ArgumentApplicationParser parser, SparkSession spark, Dataset simGroupsDS, Dataset groupsDS) { + super(parser, spark); + this.simGroupsDS = simGroupsDS; + this.groupsDS = groupsDS; + } + + public static void main(String[] args) throws Exception { + ArgumentApplicationParser parser = new ArgumentApplicationParser( + IOUtils + .toString( + SparkBlockStats.class + .getResourceAsStream( + "/eu/dnetlib/dhp/oa/dedup/collectSimRels_parameters.json"))); + parser.parseArgument(args); + + SparkConf conf = new SparkConf(); + + final String dbUrl = parser.get("postgresUrl"); + final String dbUser = parser.get("postgresUser"); + final String dbPassword = parser.get("postgresPassword"); + + SparkSession spark = getSparkSession(conf); + + DataFrameReader readOptions = spark.read() + .format("jdbc") + .option("url", dbUrl) + .option("user", dbUser) + .option("password", dbPassword); + + new SparkCollectSimRels( + parser, + spark, + readOptions.option("dbtable", "similarity_groups").load(), + readOptions.option("dbtable", "groups").load() + ).run(ISLookupClientFactory.getLookUpService(parser.get("isLookUpUrl"))); + } + + @Override + void run(ISLookUpService isLookUpService) { + + // read oozie parameters + final String isLookUpUrl = parser.get("isLookUpUrl"); + final String actionSetId = parser.get("actionSetId"); + final String workingPath = parser.get("workingPath"); + final int numPartitions = Optional + .ofNullable(parser.get("numPartitions")) + .map(Integer::valueOf) + .orElse(NUM_PARTITIONS); + final String dbUrl = parser.get("postgresUrl"); + final String dbUser = parser.get("postgresUser"); + + log.info("numPartitions: '{}'", numPartitions); + log.info("isLookUpUrl: '{}'", isLookUpUrl); + log.info("actionSetId: '{}'", actionSetId); + log.info("workingPath: '{}'", workingPath); + log.info("postgresUser: {}", dbUser); + log.info("postgresUrl: {}", dbUrl); + log.info("postgresPassword: xxx"); + + JavaPairRDD> similarityGroup = + simGroupsDS + .toJavaRDD() + .mapToPair(r -> new Tuple2<>(r.getString(0), r.getString(1))) + .groupByKey() + .mapToPair(i -> new Tuple2<>(i._1(), StreamSupport.stream(i._2().spliterator(), false) + .collect(Collectors.toList()))); + + JavaPairRDD groupIds = + groupsDS + .toJavaRDD() + .mapToPair(r -> new Tuple2<>(r.getString(0), r.getString(1))); + + JavaRDD, List>> groups = similarityGroup + .leftOuterJoin(groupIds) + .filter(g -> g._2()._2().isPresent()) + .map(g -> new Tuple2<>(new Tuple2<>(g._1(), g._2()._2().get()), g._2()._1())); + + JavaRDD relations = groups.flatMap(g -> { + String firstId = g._2().get(0); + List rels = new ArrayList<>(); + + for (String id : g._2()) { + if (!firstId.equals(id)) + rels.add(createSimRel(firstId, id, g._1()._2())); + } + + return rels.iterator(); + }); + + Dataset resultRelations = spark.createDataset( + relations.filter(r -> r.getRelType().equals("resultResult")).rdd(), + Encoders.bean(Relation.class) + ).repartition(numPartitions); + + Dataset organizationRelations = spark.createDataset( + relations.filter(r -> r.getRelType().equals("organizationOrganization")).rdd(), + Encoders.bean(Relation.class) + ).repartition(numPartitions); + + savePostgresRelation(organizationRelations, workingPath, actionSetId, "organization"); + savePostgresRelation(resultRelations, workingPath, actionSetId, "publication"); + savePostgresRelation(resultRelations, workingPath, actionSetId, "software"); + savePostgresRelation(resultRelations, workingPath, actionSetId, "otherresearchproduct"); + savePostgresRelation(resultRelations, workingPath, actionSetId, "dataset"); + + } + + private Relation createSimRel(String source, String target, String entity) { + final Relation r = new Relation(); + r.setSubRelType("dedupSimilarity"); + r.setRelClass("isSimilarTo"); + r.setDataInfo(new DataInfo()); + + switch (entity) { + case "result": + r.setSource("50|" + source); + r.setTarget("50|" + target); + r.setRelType("resultResult"); + break; + case "organization": + r.setSource("20|" + source); + r.setTarget("20|" + target); + r.setRelType("organizationOrganization"); + break; + default: + throw new IllegalArgumentException("unmanaged entity type: " + entity); + } + return r; + } + + private void savePostgresRelation(Dataset newRelations, String workingPath, String actionSetId, String entityType) { + newRelations + .write() + .mode(SaveMode.Append) + .parquet(DedupUtility.createSimRelPath(workingPath, actionSetId, entityType)); + } + +} \ No newline at end of file diff --git a/dhp-workflows/dhp-dedup-openaire/src/main/java/eu/dnetlib/dhp/oa/dedup/SparkCreateMergeRels.java b/dhp-workflows/dhp-dedup-openaire/src/main/java/eu/dnetlib/dhp/oa/dedup/SparkCreateMergeRels.java index 6d625cd11..ce6226dde 100644 --- a/dhp-workflows/dhp-dedup-openaire/src/main/java/eu/dnetlib/dhp/oa/dedup/SparkCreateMergeRels.java +++ b/dhp-workflows/dhp-dedup-openaire/src/main/java/eu/dnetlib/dhp/oa/dedup/SparkCreateMergeRels.java @@ -104,15 +104,13 @@ public class SparkCreateMergeRels extends AbstractSparkAction { .map(s -> MapDocumentUtil.getJPathString(dedupConf.getWf().getIdPath(), s)) .mapToPair((PairFunction) s -> new Tuple2<>(hash(s), s)); - final RDD> edgeRdd = spark - .read() - .textFile(DedupUtility.createSimRelPath(workingPath, actionSetId, subEntity)) - .map( - (MapFunction) r -> OBJECT_MAPPER.readValue(r, Relation.class), - Encoders.bean(Relation.class)) - .javaRDD() - .map(it -> new Edge<>(hash(it.getSource()), hash(it.getTarget()), it.getRelClass())) - .rdd(); + final RDD> edgeRdd = spark + .read() + .load(DedupUtility.createSimRelPath(workingPath, actionSetId, subEntity)) + .as(Encoders.bean(Relation.class)) + .javaRDD() + .map(it -> new Edge<>(hash(it.getSource()), hash(it.getTarget()), it.getRelClass())) + .rdd(); final Dataset mergeRels = spark .createDataset( diff --git a/dhp-workflows/dhp-dedup-openaire/src/main/java/eu/dnetlib/dhp/oa/dedup/SparkCreateSimRels.java b/dhp-workflows/dhp-dedup-openaire/src/main/java/eu/dnetlib/dhp/oa/dedup/SparkCreateSimRels.java index b3ee47bfc..babccefb4 100644 --- a/dhp-workflows/dhp-dedup-openaire/src/main/java/eu/dnetlib/dhp/oa/dedup/SparkCreateSimRels.java +++ b/dhp-workflows/dhp-dedup-openaire/src/main/java/eu/dnetlib/dhp/oa/dedup/SparkCreateSimRels.java @@ -100,12 +100,17 @@ public class SparkCreateSimRels extends AbstractSparkAction { .repartition(numPartitions); // create relations by comparing only elements in the same group - Deduper - .computeRelations(sc, blocks, dedupConf) - .map(t -> createSimRel(t._1(), t._2(), entity)) - .repartition(numPartitions) - .map(r -> OBJECT_MAPPER.writeValueAsString(r)) - .saveAsTextFile(outputPath); + spark.createDataset( + Deduper + .computeRelations(sc, blocks, dedupConf) + .map(t -> createSimRel(t._1(), t._2(), entity)) + .repartition(numPartitions) + .rdd(), + Encoders.bean(Relation.class) + ) + .write() + .mode(SaveMode.Append) + .parquet(outputPath); } } diff --git a/dhp-workflows/dhp-dedup-openaire/src/main/resources/eu/dnetlib/dhp/oa/dedup/collectSimRels_parameters.json b/dhp-workflows/dhp-dedup-openaire/src/main/resources/eu/dnetlib/dhp/oa/dedup/collectSimRels_parameters.json new file mode 100644 index 000000000..da1011371 --- /dev/null +++ b/dhp-workflows/dhp-dedup-openaire/src/main/resources/eu/dnetlib/dhp/oa/dedup/collectSimRels_parameters.json @@ -0,0 +1,44 @@ +[ + { + "paramName": "la", + "paramLongName": "isLookUpUrl", + "paramDescription": "address for the LookUp", + "paramRequired": true + }, + { + "paramName": "asi", + "paramLongName": "actionSetId", + "paramDescription": "action set identifier (name of the orchestrator)", + "paramRequired": true + }, + { + "paramName": "w", + "paramLongName": "workingPath", + "paramDescription": "path of the working directory", + "paramRequired": true + }, + { + "paramName": "np", + "paramLongName": "numPartitions", + "paramDescription": "number of partitions for the similarity relations intermediate phases", + "paramRequired": false + }, + { + "paramName": "purl", + "paramLongName": "postgresUrl", + "paramDescription": "the url of the postgres server", + "paramRequired": true + }, + { + "paramName": "pusr", + "paramLongName": "postgresUser", + "paramDescription": "the owner of the postgres database", + "paramRequired": true + }, + { + "paramName": "ppwd", + "paramLongName": "postgresPassword", + "paramDescription": "the password for the postgres user", + "paramRequired": true + } +] \ No newline at end of file diff --git a/dhp-workflows/dhp-dedup-openaire/src/test/java/eu/dnetlib/dhp/oa/dedup/SparkDedupTest.java b/dhp-workflows/dhp-dedup-openaire/src/test/java/eu/dnetlib/dhp/oa/dedup/SparkDedupTest.java index 35c4c7026..59c850591 100644 --- a/dhp-workflows/dhp-dedup-openaire/src/test/java/eu/dnetlib/dhp/oa/dedup/SparkDedupTest.java +++ b/dhp-workflows/dhp-dedup-openaire/src/test/java/eu/dnetlib/dhp/oa/dedup/SparkDedupTest.java @@ -1,4 +1,3 @@ - package eu.dnetlib.dhp.oa.dedup; import com.fasterxml.jackson.databind.ObjectMapper; @@ -16,10 +15,7 @@ import org.apache.spark.api.java.JavaSparkContext; import org.apache.spark.api.java.function.FilterFunction; import org.apache.spark.api.java.function.MapFunction; import org.apache.spark.api.java.function.PairFunction; -import org.apache.spark.sql.Dataset; -import org.apache.spark.sql.Encoders; -import org.apache.spark.sql.Row; -import org.apache.spark.sql.SparkSession; +import org.apache.spark.sql.*; import org.junit.jupiter.api.*; import org.junit.jupiter.api.extension.ExtendWith; import org.mockito.Mock; @@ -52,6 +48,7 @@ public class SparkDedupTest implements Serializable { private static String testOutputBasePath; private static String testDedupGraphBasePath; private static final String testActionSetId = "test-orchestrator"; + private static String testDedupAssertionsBasePath; @BeforeAll public static void cleanUp() throws IOException, URISyntaxException { @@ -66,6 +63,10 @@ public class SparkDedupTest implements Serializable { testDedupGraphBasePath = createTempDirectory(SparkDedupTest.class.getSimpleName() + "-") .toAbsolutePath() .toString(); + testDedupAssertionsBasePath = Paths + .get(SparkDedupTest.class.getResource("/eu/dnetlib/dhp/dedup/assertions").toURI()) + .toFile() + .getAbsolutePath(); FileUtils.deleteDirectory(new File(testOutputBasePath)); FileUtils.deleteDirectory(new File(testDedupGraphBasePath)); @@ -80,7 +81,8 @@ public class SparkDedupTest implements Serializable { .getOrCreate(); jsc = JavaSparkContext.fromSparkContext(spark.sparkContext()); - } + + } @BeforeEach public void setUp() throws IOException, ISLookUpException { @@ -150,6 +152,7 @@ public class SparkDedupTest implements Serializable { SparkCreateSimRels.class .getResourceAsStream( "/eu/dnetlib/dhp/oa/dedup/createSimRels_parameters.json"))); + parser .parseArgument( new String[] { @@ -162,30 +165,30 @@ public class SparkDedupTest implements Serializable { new SparkCreateSimRels(parser, spark).run(isLookUpService); - long orgs_simrel = spark - .read() - .textFile(testOutputBasePath + "/" + testActionSetId + "/organization_simrel") - .count(); + long orgs_simrel = spark + .read() + .load(testOutputBasePath + "/" + testActionSetId + "/organization_simrel") + .count(); - long pubs_simrel = spark - .read() - .textFile(testOutputBasePath + "/" + testActionSetId + "/publication_simrel") - .count(); + long pubs_simrel = spark + .read() + .load(testOutputBasePath + "/" + testActionSetId + "/publication_simrel") + .count(); - long sw_simrel = spark - .read() - .textFile(testOutputBasePath + "/" + testActionSetId + "/software_simrel") - .count(); + long sw_simrel = spark + .read() + .load(testOutputBasePath + "/" + testActionSetId + "/software_simrel") + .count(); - long ds_simrel = spark - .read() - .textFile(testOutputBasePath + "/" + testActionSetId + "/dataset_simrel") - .count(); + long ds_simrel = spark + .read() + .load(testOutputBasePath + "/" + testActionSetId + "/dataset_simrel") + .count(); - long orp_simrel = spark - .read() - .textFile(testOutputBasePath + "/" + testActionSetId + "/otherresearchproduct_simrel") - .count(); + long orp_simrel = spark + .read() + .load(testOutputBasePath + "/" + testActionSetId + "/otherresearchproduct_simrel") + .count(); assertEquals(3432, orgs_simrel); assertEquals(7152, pubs_simrel); @@ -194,8 +197,69 @@ public class SparkDedupTest implements Serializable { assertEquals(6750, orp_simrel); } + @Test + @Order(2) + public void collectSimRelsTest() throws Exception { + ArgumentApplicationParser parser = new ArgumentApplicationParser( + IOUtils + .toString( + SparkCreateSimRels.class + .getResourceAsStream( + "/eu/dnetlib/dhp/oa/dedup/collectSimRels_parameters.json"))); + parser + .parseArgument( + new String[] { + "-asi", testActionSetId, + "-la", "lookupurl", + "-w", testOutputBasePath, + "-np", "50", + "-purl", "jdbc:postgresql://localhost:5432/dnet_dedup", + "-pusr", "postgres_url", + "-ppwd", "" + }); + + new SparkCollectSimRels( + parser, + spark, + spark.read().load(testDedupAssertionsBasePath + "/similarity_groups"), + spark.read().load(testDedupAssertionsBasePath + "/groups") + ).run(null); + + long orgs_simrel = spark + .read() + .load(testOutputBasePath + "/" + testActionSetId + "/organization_simrel") + .count(); + + long pubs_simrel = spark + .read() + .load(testOutputBasePath + "/" + testActionSetId + "/publication_simrel") + .count(); + + long sw_simrel = spark + .read() + .load(testOutputBasePath + "/" + testActionSetId + "/software_simrel") + .count(); + + long ds_simrel = spark + .read() + .load(testOutputBasePath + "/" + testActionSetId + "/dataset_simrel") + .count(); + + long orp_simrel = spark + .read() + .load(testOutputBasePath + "/" + testActionSetId + "/otherresearchproduct_simrel") + .count(); + + assertEquals(4022, orgs_simrel); + assertEquals(10575, pubs_simrel); + assertEquals(3767, sw_simrel); + assertEquals(3881, ds_simrel); + assertEquals(10173, orp_simrel); + + } + @Test - @Order(2) + @Order(3) public void cutMergeRelsTest() throws Exception { ArgumentApplicationParser parser = new ArgumentApplicationParser( @@ -204,6 +268,7 @@ public class SparkDedupTest implements Serializable { SparkCreateMergeRels.class .getResourceAsStream( "/eu/dnetlib/dhp/oa/dedup/createCC_parameters.json"))); + parser .parseArgument( new String[] { @@ -290,7 +355,7 @@ public class SparkDedupTest implements Serializable { } @Test - @Order(3) + @Order(4) public void createMergeRelsTest() throws Exception { ArgumentApplicationParser parser = new ArgumentApplicationParser( @@ -299,6 +364,7 @@ public class SparkDedupTest implements Serializable { SparkCreateMergeRels.class .getResourceAsStream( "/eu/dnetlib/dhp/oa/dedup/createCC_parameters.json"))); + parser .parseArgument( new String[] { @@ -344,7 +410,7 @@ public class SparkDedupTest implements Serializable { } @Test - @Order(4) + @Order(5) public void createDedupRecordTest() throws Exception { ArgumentApplicationParser parser = new ArgumentApplicationParser( @@ -391,7 +457,7 @@ public class SparkDedupTest implements Serializable { } @Test - @Order(5) + @Order(6) public void updateEntityTest() throws Exception { ArgumentApplicationParser parser = new ArgumentApplicationParser( @@ -507,7 +573,7 @@ public class SparkDedupTest implements Serializable { } @Test - @Order(6) + @Order(7) public void propagateRelationTest() throws Exception { ArgumentApplicationParser parser = new ArgumentApplicationParser( @@ -557,7 +623,7 @@ public class SparkDedupTest implements Serializable { } @Test - @Order(7) + @Order(8) public void testRelations() throws Exception { testUniqueness("/eu/dnetlib/dhp/dedup/test/relation_1.json", 12, 10); testUniqueness("/eu/dnetlib/dhp/dedup/test/relation_2.json", 10, 2); @@ -575,11 +641,11 @@ public class SparkDedupTest implements Serializable { assertEquals(expected_unique, rel.distinct().count()); } - @AfterAll - public static void finalCleanUp() throws IOException { - FileUtils.deleteDirectory(new File(testOutputBasePath)); - FileUtils.deleteDirectory(new File(testDedupGraphBasePath)); - } +// @AfterAll +// public static void finalCleanUp() throws IOException { +// FileUtils.deleteDirectory(new File(testOutputBasePath)); +// FileUtils.deleteDirectory(new File(testDedupGraphBasePath)); +// } public boolean isDeletedByInference(String s) { return s.contains("\"deletedbyinference\":true"); diff --git a/dhp-workflows/dhp-dedup-openaire/src/test/resources/eu/dnetlib/dhp/dedup/assertions/groups/._SUCCESS.crc b/dhp-workflows/dhp-dedup-openaire/src/test/resources/eu/dnetlib/dhp/dedup/assertions/groups/._SUCCESS.crc new file mode 100644 index 0000000000000000000000000000000000000000..3b7b044936a890cd8d651d349a752d819d71d22c GIT binary patch literal 8 PcmYc;N@ieSU}69O2$TUk literal 0 HcmV?d00001 diff --git a/dhp-workflows/dhp-dedup-openaire/src/test/resources/eu/dnetlib/dhp/dedup/assertions/groups/.part-00000-4bafcd13-3995-4d26-9cf4-eae22806175b-c000.snappy.parquet.crc b/dhp-workflows/dhp-dedup-openaire/src/test/resources/eu/dnetlib/dhp/dedup/assertions/groups/.part-00000-4bafcd13-3995-4d26-9cf4-eae22806175b-c000.snappy.parquet.crc new file mode 100644 index 0000000000000000000000000000000000000000..de674144df42bfabdd39d794e21c52a765e06689 GIT binary patch literal 612 zcmV-q0-OC~a$^7h00ID`5)5()Yjk>!uHLO1F%$Wq|MnZOA-wde5|9&2e3U>R^GJAQ zw?fY>Q$B3m0bh)Viy)^31q8VdYhP*|YzT;!B`MO_j21`!l7WT`M4BLI$Zq(y^c9UD zd_pFX!IV>VTxg&c2qDvtcLT8?hY*x!L_!gly}1N}(R+={P~In?PTAxC^cSzGE-jPn=E~hvm)jxnUS%!tak7+fs1I$&BrfhHJ#)wWFc4rZV z)=4zY?J)>Jz=nLmEG-W3g@D5*yx(`01vmE8uKn;$E!J5gGnuaPy~_`+>ZCeUxPsmm zr@*@v&Os+rCvISobzYla(2jrAi6nEtun-YXE-i*p_-K#{fNU12_$`i#G=ccH{@O(? zvI~9fU?lK;4Q}wCKBSJyO%69;T9COt#nKTUUqyu0n$#aQcWedT6ZPJ3mo)?2+#@V` z=)R>J5-a-qL8!GHZ?{;8U@f4Y6HB)zba{@4p zu?%SebtCJ@q)fo6tykXp7HV=)g)8lq8?=c literal 0 HcmV?d00001 diff --git a/dhp-workflows/dhp-dedup-openaire/src/test/resources/eu/dnetlib/dhp/dedup/assertions/groups/_SUCCESS b/dhp-workflows/dhp-dedup-openaire/src/test/resources/eu/dnetlib/dhp/dedup/assertions/groups/_SUCCESS new file mode 100644 index 000000000..e69de29bb diff --git a/dhp-workflows/dhp-dedup-openaire/src/test/resources/eu/dnetlib/dhp/dedup/assertions/groups/part-00000-4bafcd13-3995-4d26-9cf4-eae22806175b-c000.snappy.parquet b/dhp-workflows/dhp-dedup-openaire/src/test/resources/eu/dnetlib/dhp/dedup/assertions/groups/part-00000-4bafcd13-3995-4d26-9cf4-eae22806175b-c000.snappy.parquet new file mode 100644 index 0000000000000000000000000000000000000000..ea7655139115567d5179623e49e2b5bb1d1933b2 GIT binary patch literal 77026 zcmZs^3v^s(b@o4#jFKby=+)79JRZwqd&V9)<5c3r!li1SCIp^K)-p_uXXTKR6ey+Kqu;M>Ha{h`Byyg6X6<_P(-!538)N8FgPvXe- zLOnDBOLx2^)Z-xW^enYPCr&dfjPqK{Fbva7_&YxjBHeNGfS6jc6x+YP>;f;e!rX~X zJ?w&TDJGM+q3bjQhaJ;?Z1J2!00PdwL& zO!;|+8>HNMs3(EL_hvkM6s4K&E|LZPW;f;y^xpaLCGI-FQmJFfBdE zBVK#trD+y~zG*G3Tav_%5tyl-CJ|v4xV9dK2Fsmzu^$;m7=)g@zsR>7*GzofG)(S3 zBWj2eo8@*5*UoLr@m=|Iwx8r-;BrI!I`4)53FK=JeJ_n{*LF?Ukw2FarFQOfSE)|` zx@oM3Hcu4fysjh)2#2Nhb)&@c?7-Etz~{Yqyzw9;61~JCeB&^4Q(JzXmwAMv=j(PH zvc9h8>Vd&~$xI_oi77jC!lmbMQ#Z}?Sa;nZ)SV>YJ^P-e`*!3;p6gqt|L1sdawE3f zP`3ZeT3E7w#%I z9Ug%Q;5icRAP!ScH{;l}%{a}&bZLFiA?gC8WaGjtqY(UXmzD zz0i&H#0iN%J5BX4Ak0E5GhNe;tTg=d`r3JJI9{$trY+--P-aKFy3e-+>;*rMmwt|W z^F!bD3G`Gxhe71sFl;3Ol-xJ&z&5O9r%M~HdH#9wCVu@|$?dF=@SYlrF5&$%Jd zZTXI#`h2KkUo~;`7+Q=KE(-%(>QiQolIbPxnm_(z7z-K zJ~LsZNW>xWV)?|g85(?^KFK`1{hpv;iLmg2zS7c+zMT*!CSiK6KRZ zL(_B(zQXf!ulR;hGAj9w;^7BYU}UVeU7TM0s7b9MxN<%8RGjkIXn3tWI9kmQSjAbx{tX5)2zHgjS zCcVIMS>asIy@2lwbA#0|T~eFtWMSr|j@dudcAd~qxjWwG!pSj;B^%6&bl`=ZyMgCh zsne`YrnW<};nvCQ#2Zyej{=u`Y`6ro!COfB=PKNwZyUvTl%k+HH|kLXvNWK^TPgcB zPBN!|YBCB9nN(cfn9Z9_*$L57X3ESUjqQM>*wLPp#W^5GbvvNcIix`zj$&pzly(pe z@4RD?d>NTWl*#Be16_PwDd|D;{cS7BLNoKdz{~sRnmw;~sTwkqvXQNTg$xX~mKi2w zvCNIFu(&u7MR^!eNO|w^urkV;M*+{scF!U}5|D(OvdkbLG1u3+!Mry@5;ptca4aaNl3o>>(!Ib-%5wM*`4z?pN%M9KxK%}_1iy$Tp2``t7 znHy9EFYVtq7Dk>AoTCVmWZ5DSb=PPPwQ`^i?=(%a{vpG*O^2PE>eL)}cvc3q%~ns% zz{�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 F{tt!hdt?9r literal 0 HcmV?d00001 diff --git a/dhp-workflows/dhp-dedup-openaire/src/test/resources/eu/dnetlib/dhp/dedup/assertions/similarity_groups/._SUCCESS.crc b/dhp-workflows/dhp-dedup-openaire/src/test/resources/eu/dnetlib/dhp/dedup/assertions/similarity_groups/._SUCCESS.crc new file mode 100644 index 0000000000000000000000000000000000000000..3b7b044936a890cd8d651d349a752d819d71d22c GIT binary patch literal 8 PcmYc;N@ieSU}69O2$TUk literal 0 HcmV?d00001 diff --git a/dhp-workflows/dhp-dedup-openaire/src/test/resources/eu/dnetlib/dhp/dedup/assertions/similarity_groups/.part-00000-ad5faba8-5922-42f1-a215-1619e7bb4e5d-c000.snappy.parquet.crc b/dhp-workflows/dhp-dedup-openaire/src/test/resources/eu/dnetlib/dhp/dedup/assertions/similarity_groups/.part-00000-ad5faba8-5922-42f1-a215-1619e7bb4e5d-c000.snappy.parquet.crc new file mode 100644 index 0000000000000000000000000000000000000000..9ac084585a97ad79c918cf9170380da4cbfd5c76 GIT binary patch literal 3904 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 O#tibKGZ)AyUu_J3V} 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

5GN1rVO1z8==@mCD}u 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 literal 0 HcmV?d00001 From 4cf79f32eb2b0de4afd14ade83b43abf0d5fdef0 Mon Sep 17 00:00:00 2001 From: miconis Date: Fri, 25 Sep 2020 11:29:51 +0200 Subject: [PATCH 04/12] implementation of the oozie wf to prepare the openorgs input: relations between organizations --- .../eu/dnetlib/dhp/oa/dedup/OrgSimRel.java | 83 +++++++ .../dhp/oa/dedup/SparkCollectSimRels.java | 21 +- .../dhp/oa/dedup/SparkPrepareOrgRels.java | 168 ++++++++++++++ .../orgsdedup/oozie_app/config-default.xml | 18 ++ .../oa/dedup/orgsdedup/oozie_app/workflow.xml | 212 ++++++++++++++++++ .../oa/dedup/prepareOrgRels_parameters.json | 56 +++++ 6 files changed, 552 insertions(+), 6 deletions(-) create mode 100644 dhp-workflows/dhp-dedup-openaire/src/main/java/eu/dnetlib/dhp/oa/dedup/OrgSimRel.java create mode 100644 dhp-workflows/dhp-dedup-openaire/src/main/java/eu/dnetlib/dhp/oa/dedup/SparkPrepareOrgRels.java create mode 100644 dhp-workflows/dhp-dedup-openaire/src/main/resources/eu/dnetlib/dhp/oa/dedup/orgsdedup/oozie_app/config-default.xml create mode 100644 dhp-workflows/dhp-dedup-openaire/src/main/resources/eu/dnetlib/dhp/oa/dedup/orgsdedup/oozie_app/workflow.xml create mode 100644 dhp-workflows/dhp-dedup-openaire/src/main/resources/eu/dnetlib/dhp/oa/dedup/prepareOrgRels_parameters.json diff --git a/dhp-workflows/dhp-dedup-openaire/src/main/java/eu/dnetlib/dhp/oa/dedup/OrgSimRel.java b/dhp-workflows/dhp-dedup-openaire/src/main/java/eu/dnetlib/dhp/oa/dedup/OrgSimRel.java new file mode 100644 index 000000000..a7d8ead0b --- /dev/null +++ b/dhp-workflows/dhp-dedup-openaire/src/main/java/eu/dnetlib/dhp/oa/dedup/OrgSimRel.java @@ -0,0 +1,83 @@ +package eu.dnetlib.dhp.oa.dedup; + +import java.io.Serializable; + +public class OrgSimRel implements Serializable { + + String local_id; + String oa_original_id; + String oa_name; + String oa_acronym; + String oa_country; + String oa_url; + String oa_collectedfrom; + + public OrgSimRel() { + } + + public OrgSimRel(String local_id, String oa_original_id, String oa_name, String oa_acronym, String oa_country, String oa_url, String oa_collectedfrom) { + this.local_id = local_id; + this.oa_original_id = oa_original_id; + this.oa_name = oa_name; + this.oa_acronym = oa_acronym; + this.oa_country = oa_country; + this.oa_url = oa_url; + this.oa_collectedfrom = oa_collectedfrom; + } + + public String getLocal_id() { + return local_id; + } + + public void setLocal_id(String local_id) { + this.local_id = local_id; + } + + public String getOa_original_id() { + return oa_original_id; + } + + public void setOa_original_id(String oa_original_id) { + this.oa_original_id = oa_original_id; + } + + public String getOa_name() { + return oa_name; + } + + public void setOa_name(String oa_name) { + this.oa_name = oa_name; + } + + public String getOa_acronym() { + return oa_acronym; + } + + public void setOa_acronym(String oa_acronym) { + this.oa_acronym = oa_acronym; + } + + public String getOa_country() { + return oa_country; + } + + public void setOa_country(String oa_country) { + this.oa_country = oa_country; + } + + public String getOa_url() { + return oa_url; + } + + public void setOa_url(String oa_url) { + this.oa_url = oa_url; + } + + public String getOa_collectedfrom() { + return oa_collectedfrom; + } + + public void setOa_collectedfrom(String oa_collectedfrom) { + this.oa_collectedfrom = oa_collectedfrom; + } +} diff --git a/dhp-workflows/dhp-dedup-openaire/src/main/java/eu/dnetlib/dhp/oa/dedup/SparkCollectSimRels.java b/dhp-workflows/dhp-dedup-openaire/src/main/java/eu/dnetlib/dhp/oa/dedup/SparkCollectSimRels.java index 7c1e6550e..b35f9c54a 100644 --- a/dhp-workflows/dhp-dedup-openaire/src/main/java/eu/dnetlib/dhp/oa/dedup/SparkCollectSimRels.java +++ b/dhp-workflows/dhp-dedup-openaire/src/main/java/eu/dnetlib/dhp/oa/dedup/SparkCollectSimRels.java @@ -4,16 +4,20 @@ import eu.dnetlib.dhp.application.ArgumentApplicationParser; import eu.dnetlib.dhp.schema.oaf.DataInfo; import eu.dnetlib.dhp.schema.oaf.Relation; import eu.dnetlib.dhp.utils.ISLookupClientFactory; +import eu.dnetlib.enabling.is.lookup.rmi.ISLookUpException; import eu.dnetlib.enabling.is.lookup.rmi.ISLookUpService; +import eu.dnetlib.pace.config.DedupConfig; import org.apache.commons.io.IOUtils; import org.apache.spark.SparkConf; import org.apache.spark.api.java.JavaPairRDD; import org.apache.spark.api.java.JavaRDD; import org.apache.spark.sql.*; +import org.dom4j.DocumentException; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import scala.Tuple2; +import java.io.IOException; import java.util.ArrayList; import java.util.List; import java.util.Optional; @@ -65,7 +69,7 @@ public class SparkCollectSimRels extends AbstractSparkAction { } @Override - void run(ISLookUpService isLookUpService) { + void run(ISLookUpService isLookUpService) throws DocumentException, ISLookUpException, IOException { // read oozie parameters final String isLookUpUrl = parser.get("isLookUpUrl"); @@ -126,11 +130,16 @@ public class SparkCollectSimRels extends AbstractSparkAction { Encoders.bean(Relation.class) ).repartition(numPartitions); - savePostgresRelation(organizationRelations, workingPath, actionSetId, "organization"); - savePostgresRelation(resultRelations, workingPath, actionSetId, "publication"); - savePostgresRelation(resultRelations, workingPath, actionSetId, "software"); - savePostgresRelation(resultRelations, workingPath, actionSetId, "otherresearchproduct"); - savePostgresRelation(resultRelations, workingPath, actionSetId, "dataset"); + for (DedupConfig dedupConf : getConfigurations(isLookUpService, actionSetId)) { + switch(dedupConf.getWf().getSubEntityValue()){ + case "organization": + savePostgresRelation(organizationRelations, workingPath, actionSetId, "organization"); + break; + default: + savePostgresRelation(resultRelations, workingPath, actionSetId, dedupConf.getWf().getSubEntityValue()); + break; + } + } } diff --git a/dhp-workflows/dhp-dedup-openaire/src/main/java/eu/dnetlib/dhp/oa/dedup/SparkPrepareOrgRels.java b/dhp-workflows/dhp-dedup-openaire/src/main/java/eu/dnetlib/dhp/oa/dedup/SparkPrepareOrgRels.java new file mode 100644 index 000000000..dff1bbb0d --- /dev/null +++ b/dhp-workflows/dhp-dedup-openaire/src/main/java/eu/dnetlib/dhp/oa/dedup/SparkPrepareOrgRels.java @@ -0,0 +1,168 @@ +package eu.dnetlib.dhp.oa.dedup; + +import eu.dnetlib.dhp.application.ArgumentApplicationParser; +import eu.dnetlib.dhp.schema.common.EntityType; +import eu.dnetlib.dhp.schema.common.ModelSupport; +import eu.dnetlib.dhp.schema.oaf.*; +import eu.dnetlib.dhp.utils.ISLookupClientFactory; +import eu.dnetlib.enabling.is.lookup.rmi.ISLookUpException; +import eu.dnetlib.enabling.is.lookup.rmi.ISLookUpService; +import eu.dnetlib.pace.config.DedupConfig; +import org.apache.commons.io.IOUtils; +import org.apache.http.client.methods.CloseableHttpResponse; +import org.apache.http.client.methods.HttpGet; +import org.apache.http.impl.client.CloseableHttpClient; +import org.apache.http.impl.client.HttpClients; +import org.apache.spark.SparkConf; +import org.apache.spark.api.java.JavaRDD; +import org.apache.spark.api.java.function.MapFunction; +import org.apache.spark.api.java.function.MapGroupsFunction; +import org.apache.spark.sql.Dataset; +import org.apache.spark.sql.Encoders; +import org.apache.spark.sql.SaveMode; +import org.apache.spark.sql.SparkSession; +import org.dom4j.DocumentException; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import scala.Tuple2; + +import java.io.IOException; +import java.util.ArrayList; +import java.util.Iterator; +import java.util.List; +import java.util.Properties; + +public class SparkPrepareOrgRels extends AbstractSparkAction { + + private static final Logger log = LoggerFactory.getLogger(SparkCreateDedupRecord.class); + + public static final String ROOT_TRUST = "0.8"; + public static final String PROVENANCE_ACTION_CLASS = "sysimport:dedup"; + public static final String PROVENANCE_ACTIONS = "dnet:provenanceActions"; + + public SparkPrepareOrgRels(ArgumentApplicationParser parser, SparkSession spark) { + super(parser, spark); + } + + public static void main(String[] args) throws Exception { + ArgumentApplicationParser parser = new ArgumentApplicationParser( + IOUtils + .toString( + SparkCreateSimRels.class + .getResourceAsStream( + "/eu/dnetlib/dhp/oa/dedup/prepareOrgRels_parameters.json"))); + parser.parseArgument(args); + + SparkConf conf = new SparkConf(); + conf.set("spark.serializer", "org.apache.spark.serializer.KryoSerializer"); + conf.registerKryoClasses(ModelSupport.getOafModelClasses()); + + new SparkCreateDedupRecord(parser, getSparkSession(conf)) + .run(ISLookupClientFactory.getLookUpService(parser.get("isLookUpUrl"))); + } + + @Override + public void run(ISLookUpService isLookUpService) throws IOException { + + final String graphBasePath = parser.get("graphBasePath"); + final String isLookUpUrl = parser.get("isLookUpUrl"); + final String actionSetId = parser.get("actionSetId"); + final String workingPath = parser.get("workingPath"); + final String apiUrl = parser.get("apiUrl"); + final String dbUrl = parser.get("dbUrl"); + final String dbTable = parser.get("dbTable"); + final String dbUser = parser.get("dbUser"); + final String dbPwd = parser.get("dbPwd"); + + log.info("graphBasePath: '{}'", graphBasePath); + log.info("isLookUpUrl: '{}'", isLookUpUrl); + log.info("actionSetId: '{}'", actionSetId); + log.info("workingPath: '{}'", workingPath); + log.info("apiUrl: '{}'", apiUrl); + log.info("dbUrl: '{}'", dbUrl); + log.info("dbUser: '{}'", dbUser); + log.info("table: '{}'", dbTable); + log.info("dbPwd: '{}'", "xxx"); + + final String mergeRelPath = DedupUtility.createMergeRelPath(workingPath, actionSetId, "organization"); + final String entityPath = DedupUtility.createEntityPath(graphBasePath, "organization"); + + Dataset relations = createRelations(spark, mergeRelPath, entityPath); + + final Properties connectionProperties = new Properties(); + connectionProperties.put("user", dbUser); + connectionProperties.put("password", dbPwd); + + relations.write().mode(SaveMode.Overwrite).jdbc(dbUrl, dbTable, connectionProperties); + + if (!apiUrl.isEmpty()) + updateSimRels(apiUrl); + + } + + public static Dataset createRelations( + final SparkSession spark, + final String mergeRelsPath, + final String entitiesPath) { + + // + Dataset> entities = spark + .read() + .textFile(entitiesPath) + .map( + (MapFunction>) it -> { + Organization entity = OBJECT_MAPPER.readValue(it, Organization.class); + return new Tuple2<>(entity.getId(), entity); + }, + Encoders.tuple(Encoders.STRING(), Encoders.kryo(Organization.class))); + + Dataset> relations = spark.createDataset( + spark + .read() + .load(mergeRelsPath) + .as(Encoders.bean(Relation.class)) + .where("relClass == 'merges'") + .toJavaRDD() + .mapToPair(r -> new Tuple2<>(r.getSource(), r.getTarget())) + .groupByKey() + .flatMap(g -> { + List> rels = new ArrayList<>(); + for (String id1 : g._2()) { + for (String id2 : g._2()) { + if (!id1.equals(id2)) + if (id1.contains("openorgs")) + rels.add(new Tuple2<>(id1, id2)); + } + } + return rels.iterator(); + }).rdd(), + Encoders.tuple(Encoders.STRING(), Encoders.STRING())); + + return relations + .joinWith(entities, relations.col("_2").equalTo(entities.col("_1")), "inner") + .map( + (MapFunction, Tuple2>, OrgSimRel>)r -> + new OrgSimRel( + r._1()._2(), + r._2()._2().getOriginalId().get(0), + r._2()._2().getLegalname().getValue(), + r._2()._2().getLegalshortname().getValue(), + r._2()._2().getCountry().getClassid(), + r._2()._2().getWebsiteurl().getValue(), + r._2()._2().getCollectedfrom().get(0).getValue() + ), + Encoders.bean(OrgSimRel.class) + ); + + } + + private static String updateSimRels(final String apiUrl) throws IOException { + final HttpGet req = new HttpGet(apiUrl); + try (final CloseableHttpClient client = HttpClients.createDefault()) { + try (final CloseableHttpResponse response = client.execute(req)) { + return IOUtils.toString(response.getEntity().getContent()); + } + } + } + +} diff --git a/dhp-workflows/dhp-dedup-openaire/src/main/resources/eu/dnetlib/dhp/oa/dedup/orgsdedup/oozie_app/config-default.xml b/dhp-workflows/dhp-dedup-openaire/src/main/resources/eu/dnetlib/dhp/oa/dedup/orgsdedup/oozie_app/config-default.xml new file mode 100644 index 000000000..2e0ed9aee --- /dev/null +++ b/dhp-workflows/dhp-dedup-openaire/src/main/resources/eu/dnetlib/dhp/oa/dedup/orgsdedup/oozie_app/config-default.xml @@ -0,0 +1,18 @@ + + + jobTracker + yarnRM + + + nameNode + hdfs://nameservice1 + + + oozie.use.system.libpath + true + + + oozie.action.sharelib.for.spark + spark2 + + \ No newline at end of file diff --git a/dhp-workflows/dhp-dedup-openaire/src/main/resources/eu/dnetlib/dhp/oa/dedup/orgsdedup/oozie_app/workflow.xml b/dhp-workflows/dhp-dedup-openaire/src/main/resources/eu/dnetlib/dhp/oa/dedup/orgsdedup/oozie_app/workflow.xml new file mode 100644 index 000000000..82ecbc46b --- /dev/null +++ b/dhp-workflows/dhp-dedup-openaire/src/main/resources/eu/dnetlib/dhp/oa/dedup/orgsdedup/oozie_app/workflow.xml @@ -0,0 +1,212 @@ + + + + graphBasePath + the raw graph base path + + + isLookUpUrl + the address of the lookUp service + + + actionSetId + id of the actionSet + + + workingPath + path for the working directory + + + dedupGraphPath + path for the output graph + + + cutConnectedComponent + max number of elements in a connected component + + + apiUrl + the url for the APIs of the openorgs service + + + dbUrl + the url of the database + + + dbUser + the user of the database + + + dbTable + the name of the table in the database + + + dbPwd + the passowrd of the user of the database + + + sparkDriverMemory + memory for driver process + + + sparkExecutorMemory + memory for individual executor + + + sparkExecutorCores + number of cores used by single executor + + + oozieActionShareLibForSpark2 + oozie action sharelib for spark 2.* + + + spark2ExtraListeners + com.cloudera.spark.lineage.NavigatorAppListener + spark 2.* extra listeners classname + + + spark2SqlQueryExecutionListeners + com.cloudera.spark.lineage.NavigatorQueryListener + spark 2.* sql query execution listeners classname + + + spark2YarnHistoryServerAddress + spark 2.* yarn history server address + + + spark2EventLogDir + spark 2.* event log dir location + + + + + ${jobTracker} + ${nameNode} + + + mapreduce.job.queuename + ${queueName} + + + oozie.launcher.mapred.job.queue.name + ${oozieLauncherQueueName} + + + oozie.action.sharelib.for.spark + ${oozieActionShareLibForSpark2} + + + + + + + + Action failed, error message[${wf:errorMessage(wf:lastErrorNode())}] + + + + + + + + + + + + + yarn + cluster + Create Similarity Relations + eu.dnetlib.dhp.oa.dedup.SparkCreateSimRels + dhp-dedup-openaire-${projectVersion}.jar + + --executor-memory=${sparkExecutorMemory} + --executor-cores=${sparkExecutorCores} + --driver-memory=${sparkDriverMemory} + --conf spark.extraListeners=${spark2ExtraListeners} + --conf spark.sql.queryExecutionListeners=${spark2SqlQueryExecutionListeners} + --conf spark.yarn.historyServer.address=${spark2YarnHistoryServerAddress} + --conf spark.eventLog.dir=${nameNode}${spark2EventLogDir} + --conf spark.sql.shuffle.partitions=3840 + + --graphBasePath${graphBasePath} + --isLookUpUrl${isLookUpUrl} + --actionSetId${actionSetId} + --workingPath${workingPath} + --numPartitions8000 + + + + + + + + -pb + ${graphBasePath}/relation + ${workingPath}/organization_simrel + + + + + + + + yarn + cluster + Create Merge Relations + eu.dnetlib.dhp.oa.dedup.SparkCreateMergeRels + dhp-dedup-openaire-${projectVersion}.jar + + --executor-memory=${sparkExecutorMemory} + --executor-cores=${sparkExecutorCores} + --driver-memory=${sparkDriverMemory} + --conf spark.extraListeners=${spark2ExtraListeners} + --conf spark.sql.queryExecutionListeners=${spark2SqlQueryExecutionListeners} + --conf spark.yarn.historyServer.address=${spark2YarnHistoryServerAddress} + --conf spark.eventLog.dir=${nameNode}${spark2EventLogDir} + --conf spark.sql.shuffle.partitions=3840 + + --graphBasePath${graphBasePath} + --workingPath${workingPath} + --isLookUpUrl${isLookUpUrl} + --actionSetId${actionSetId} + --cutConnectedComponent${cutConnectedComponent} + + + + + + + + yarn + cluster + Prepare Organization Relations + eu.dnetlib.dhp.oa.dedup.SparkPrepareOrgRels + dhp-dedup-openaire-${projectVersion}.jar + + --executor-memory=${sparkExecutorMemory} + --executor-cores=${sparkExecutorCores} + --driver-memory=${sparkDriverMemory} + --conf spark.extraListeners=${spark2ExtraListeners} + --conf spark.sql.queryExecutionListeners=${spark2SqlQueryExecutionListeners} + --conf spark.yarn.historyServer.address=${spark2YarnHistoryServerAddress} + --conf spark.eventLog.dir=${nameNode}${spark2EventLogDir} + --conf spark.sql.shuffle.partitions=3840 + + --graphBasePath${graphBasePath} + --workingPath${workingPath} + --isLookUpUrl${isLookUpUrl} + --actionSetId${actionSetId} + --apiUrl${apiUrl} + --dbUrl${dbUrl} + --dbTable${dbTable} + --dbUser${dbUser} + --dbPwd${dbPwd} + + + + + + + \ No newline at end of file diff --git a/dhp-workflows/dhp-dedup-openaire/src/main/resources/eu/dnetlib/dhp/oa/dedup/prepareOrgRels_parameters.json b/dhp-workflows/dhp-dedup-openaire/src/main/resources/eu/dnetlib/dhp/oa/dedup/prepareOrgRels_parameters.json new file mode 100644 index 000000000..bcca48a15 --- /dev/null +++ b/dhp-workflows/dhp-dedup-openaire/src/main/resources/eu/dnetlib/dhp/oa/dedup/prepareOrgRels_parameters.json @@ -0,0 +1,56 @@ +[ + { + "paramName": "i", + "paramLongName": "graphBasePath", + "paramDescription": "the base path of raw graph", + "paramRequired": true + }, + { + "paramName": "w", + "paramLongName": "workingPath", + "paramDescription": "the working directory path", + "paramRequired": true + }, + { + "paramName": "la", + "paramLongName": "isLookUpUrl", + "paramDescription": "the url of the lookup service", + "paramRequired": true + }, + { + "paramName": "asi", + "paramLongName": "actionSetId", + "paramDescription": "the id of the actionset (orchestrator)", + "paramRequired": true + }, + { + "paramName": "au", + "paramLongName": "apiUrl", + "paramDescription": "the url for the APIs of the openorgs service", + "paramRequired": true + }, + { + "paramName": "du", + "paramLongName": "dbUrl", + "paramDescription": "the url of the database", + "paramRequired": true + }, + { + "paramName": "dusr", + "paramLongName": "dbUser", + "paramDescription": "the user of the database", + "paramRequired": true + }, + { + "paramName": "t", + "paramLongName": "dbTable", + "paramDescription": "the name of the table in the database", + "paramRequired": true + }, + { + "paramName": "dpwd", + "paramLongName": "dbPwd", + "paramDescription": "the password for the user of the database", + "paramRequired": true + } +] \ No newline at end of file From e3f7798d1bb7ee367cba0ed25d613c05943a880f Mon Sep 17 00:00:00 2001 From: miconis Date: Tue, 29 Sep 2020 15:31:46 +0200 Subject: [PATCH 05/12] minor changes in dedup tests, bug fix in the idgenerator and pace-core version update --- dhp-workflows/dhp-dedup-openaire/pom.xml | 4 + .../dhp/oa/dedup/AbstractSparkAction.java | 1 + .../dhp/oa/dedup/DedupRecordFactory.java | 27 +- .../eu/dnetlib/dhp/oa/dedup/IdGenerator.java | 146 +++++---- .../eu/dnetlib/dhp/oa/dedup/Identifier.java | 208 +++++++------ .../eu/dnetlib/dhp/oa/dedup/OrgSimRel.java | 135 ++++---- .../java/eu/dnetlib/dhp/oa/dedup/PidType.java | 30 +- .../dhp/oa/dedup/SparkCollectSimRels.java | 288 +++++++++--------- .../dhp/oa/dedup/SparkCreateMergeRels.java | 14 +- .../dhp/oa/dedup/SparkCreateSimRels.java | 22 +- .../dhp/oa/dedup/SparkPrepareOrgRels.java | 274 +++++++++-------- .../oa/dedup/orgsdedup/oozie_app/workflow.xml | 27 +- .../oa/dedup/prepareOrgRels_parameters.json | 8 +- .../dhp/oa/dedup/EntityMergerTest.java | 8 +- .../dnetlib/dhp/oa/dedup/SparkDedupTest.java | 226 +++++++------- pom.xml | 2 +- 16 files changed, 751 insertions(+), 669 deletions(-) diff --git a/dhp-workflows/dhp-dedup-openaire/pom.xml b/dhp-workflows/dhp-dedup-openaire/pom.xml index 03ddbcf4c..ff11c66e0 100644 --- a/dhp-workflows/dhp-dedup-openaire/pom.xml +++ b/dhp-workflows/dhp-dedup-openaire/pom.xml @@ -90,6 +90,10 @@ com.fasterxml.jackson.core jackson-core + + org.apache.httpcomponents + httpclient + diff --git a/dhp-workflows/dhp-dedup-openaire/src/main/java/eu/dnetlib/dhp/oa/dedup/AbstractSparkAction.java b/dhp-workflows/dhp-dedup-openaire/src/main/java/eu/dnetlib/dhp/oa/dedup/AbstractSparkAction.java index 74cecb7b6..9a1127764 100644 --- a/dhp-workflows/dhp-dedup-openaire/src/main/java/eu/dnetlib/dhp/oa/dedup/AbstractSparkAction.java +++ b/dhp-workflows/dhp-dedup-openaire/src/main/java/eu/dnetlib/dhp/oa/dedup/AbstractSparkAction.java @@ -29,6 +29,7 @@ import eu.dnetlib.pace.config.DedupConfig; abstract class AbstractSparkAction implements Serializable { protected static final int NUM_PARTITIONS = 1000; + protected static final int NUM_CONNECTIONS = 20; protected static final ObjectMapper OBJECT_MAPPER = new ObjectMapper() .configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); diff --git a/dhp-workflows/dhp-dedup-openaire/src/main/java/eu/dnetlib/dhp/oa/dedup/DedupRecordFactory.java b/dhp-workflows/dhp-dedup-openaire/src/main/java/eu/dnetlib/dhp/oa/dedup/DedupRecordFactory.java index 0fc393ea5..50dda887b 100644 --- a/dhp-workflows/dhp-dedup-openaire/src/main/java/eu/dnetlib/dhp/oa/dedup/DedupRecordFactory.java +++ b/dhp-workflows/dhp-dedup-openaire/src/main/java/eu/dnetlib/dhp/oa/dedup/DedupRecordFactory.java @@ -1,12 +1,10 @@ package eu.dnetlib.dhp.oa.dedup; -import com.fasterxml.jackson.databind.DeserializationFeature; -import com.fasterxml.jackson.databind.ObjectMapper; -import com.google.common.collect.Lists; -import eu.dnetlib.dhp.schema.common.EntityType; -import eu.dnetlib.dhp.schema.common.ModelSupport; -import eu.dnetlib.dhp.schema.oaf.*; +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.*; + import org.apache.commons.lang.StringUtils; import org.apache.spark.api.java.function.MapFunction; import org.apache.spark.api.java.function.MapGroupsFunction; @@ -15,11 +13,15 @@ import org.apache.spark.sql.Encoders; import org.apache.spark.sql.SparkSession; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import scala.Tuple2; -import java.text.ParseException; -import java.text.SimpleDateFormat; -import java.util.*; +import com.fasterxml.jackson.databind.DeserializationFeature; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.google.common.collect.Lists; + +import eu.dnetlib.dhp.schema.common.EntityType; +import eu.dnetlib.dhp.schema.common.ModelSupport; +import eu.dnetlib.dhp.schema.oaf.*; +import scala.Tuple2; public class DedupRecordFactory { @@ -80,14 +82,14 @@ public class DedupRecordFactory { final Collection dates = Lists.newArrayList(); final List> authors = Lists.newArrayList(); - final List bestPids = Lists.newArrayList(); //best pids list + final List bestPids = Lists.newArrayList(); // best pids list entities .forEachRemaining( t -> { T duplicate = t._2(); - //prepare the list of pids to use for the id generation + // prepare the list of pids to use for the id generation bestPids.addAll(IdGenerator.bestPidtoIdentifier(duplicate)); entity.mergeFrom(duplicate); @@ -115,5 +117,4 @@ public class DedupRecordFactory { return entity; } - } diff --git a/dhp-workflows/dhp-dedup-openaire/src/main/java/eu/dnetlib/dhp/oa/dedup/IdGenerator.java b/dhp-workflows/dhp-dedup-openaire/src/main/java/eu/dnetlib/dhp/oa/dedup/IdGenerator.java index 2d203a1b1..2916e063d 100644 --- a/dhp-workflows/dhp-dedup-openaire/src/main/java/eu/dnetlib/dhp/oa/dedup/IdGenerator.java +++ b/dhp-workflows/dhp-dedup-openaire/src/main/java/eu/dnetlib/dhp/oa/dedup/IdGenerator.java @@ -1,90 +1,112 @@ -package eu.dnetlib.dhp.oa.dedup; -import com.google.common.collect.Lists; -import eu.dnetlib.dhp.schema.common.EntityType; -import eu.dnetlib.dhp.schema.common.ModelSupport; -import eu.dnetlib.dhp.schema.oaf.Field; -import eu.dnetlib.dhp.schema.oaf.OafEntity; -import eu.dnetlib.dhp.schema.oaf.Result; -import eu.dnetlib.dhp.schema.oaf.StructuredProperty; -import org.apache.commons.lang.NullArgumentException; -import org.apache.commons.lang.StringUtils; +package eu.dnetlib.dhp.oa.dedup; import java.io.Serializable; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.*; +import org.apache.commons.lang.NullArgumentException; +import org.apache.commons.lang.StringUtils; + +import com.google.common.collect.Lists; + +import eu.dnetlib.dhp.schema.common.EntityType; +import eu.dnetlib.dhp.schema.common.ModelSupport; +import eu.dnetlib.dhp.schema.oaf.Field; +import eu.dnetlib.dhp.schema.oaf.OafEntity; +import eu.dnetlib.dhp.schema.oaf.Result; +import eu.dnetlib.dhp.schema.oaf.StructuredProperty; + public class IdGenerator implements Serializable { - private static SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); - public static String CROSSREF_ID = "10|openaire____::081b82f96300b6a6e3d282bad31cb6e2"; - public static String DATACITE_ID = "10|openaire____::9e3be59865b2c1c335d32dae2fe7b254"; + public static String CROSSREF_ID = "10|openaire____::081b82f96300b6a6e3d282bad31cb6e2"; + public static String DATACITE_ID = "10|openaire____::9e3be59865b2c1c335d32dae2fe7b254"; - //pick the best pid from the list (consider date and pidtype) - public static String generate(List pids, String defaultID) { - if (pids == null || pids.size() == 0) - return defaultID; + // pick the best pid from the list (consider date and pidtype) + public static String generate(List pids, String defaultID) { + if (pids == null || pids.size() == 0) + return defaultID; - Optional bp = pids.stream() - .max(Identifier::compareTo); + Optional bp = pids + .stream() + .max(Identifier::compareTo); - if (bp.get().isUseOriginal() || bp.get().getPid().getValue() == null) { - return bp.get().getOriginalID().split("\\|")[0] + "|dedup_wf_001::" + DedupUtility.md5(bp.get().getOriginalID()); - } else { - return bp.get().getOriginalID().split("\\|")[0] + "|" + createPrefix(bp.get().getPid().getQualifier().getClassid()) + "::" + DedupUtility.md5(bp.get().getPid().getValue()); - } + if (bp.get().isUseOriginal() || bp.get().getPid().getValue() == null) { + return bp.get().getOriginalID().split("\\|")[0] + "|dedup_wf_001::" + + DedupUtility.md5(bp.get().getOriginalID()); + } else { + return bp.get().getOriginalID().split("\\|")[0] + "|" + + createPrefix(bp.get().getPid().getQualifier().getClassid()) + "::" + + DedupUtility.md5(bp.get().getPid().getValue()); + } - } + } - //pick the best pid from the entity. Returns a list (length 1) to save time in the call - public static List bestPidtoIdentifier(T entity) { + // pick the best pid from the entity. Returns a list (length 1) to save time in the call + public static List bestPidtoIdentifier(T entity) { - if (entity.getPid() == null || entity.getPid().size() == 0) - return Lists.newArrayList(new Identifier(new StructuredProperty(), new Date(), PidType.original, entity.getCollectedfrom(), EntityType.fromClass(entity.getClass()), entity.getId())); + if (entity.getPid() == null || entity.getPid().size() == 0) + return Lists + .newArrayList( + new Identifier(new StructuredProperty(), new Date(), PidType.original, entity.getCollectedfrom(), + EntityType.fromClass(entity.getClass()), entity.getId())); - Optional bp = entity.getPid().stream() - .filter(pid -> PidType.classidValueOf(pid.getQualifier().getClassid()) != PidType.undefined) - .max(Comparator.comparing(pid -> PidType.classidValueOf(pid.getQualifier().getClassid()))); + Optional bp = entity + .getPid() + .stream() + .filter(pid -> PidType.classidValueOf(pid.getQualifier().getClassid()) != PidType.undefined) + .max(Comparator.comparing(pid -> PidType.classidValueOf(pid.getQualifier().getClassid()))); - return bp.map(structuredProperty -> - Lists.newArrayList(new Identifier(structuredProperty, extractDate(entity, sdf), PidType.classidValueOf(structuredProperty.getQualifier().getClassid()), entity.getCollectedfrom(), EntityType.fromClass(entity.getClass()), entity.getId())) - ).orElseGet(() -> Lists.newArrayList(new Identifier(new StructuredProperty(), new Date(), PidType.original, entity.getCollectedfrom(), EntityType.fromClass(entity.getClass()), entity.getId()))); + return bp + .map( + structuredProperty -> Lists + .newArrayList( + new Identifier(structuredProperty, extractDate(entity, new SimpleDateFormat("yyyy-MM-dd")), + PidType.classidValueOf(structuredProperty.getQualifier().getClassid()), + entity.getCollectedfrom(), EntityType.fromClass(entity.getClass()), entity.getId()))) + .orElseGet( + () -> Lists + .newArrayList( + new Identifier(new StructuredProperty(), new Date(), PidType.original, + entity.getCollectedfrom(), EntityType.fromClass(entity.getClass()), entity.getId()))); - } + } - //create the prefix (length = 12): dedup_+ pidType - public static String createPrefix(String pidType) { + // create the prefix (length = 12): dedup_+ pidType + public static String createPrefix(String pidType) { - StringBuilder prefix = new StringBuilder("dedup_" + pidType); + StringBuilder prefix = new StringBuilder("dedup_" + pidType); - while (prefix.length() < 12) { - prefix.append("_"); - } - return prefix.toString().substring(0, 12); + while (prefix.length() < 12) { + prefix.append("_"); + } + return prefix.toString().substring(0, 12); - } + } - //extracts the date from the record. If the date is not available or is not wellformed, it returns a base date: 00-01-01 - public static Date extractDate(T duplicate, SimpleDateFormat sdf){ + // extracts the date from the record. If the date is not available or is not wellformed, it returns a base date: + // 00-01-01 + public static Date extractDate(T duplicate, SimpleDateFormat sdf) { - String date = "2000-01-01"; - if (ModelSupport.isSubClass(duplicate, Result.class)) { - Result result = (Result) duplicate; - if (isWellformed(result.getDateofacceptance())){ - date = result.getDateofacceptance().getValue(); - } - } + String date = "2000-01-01"; + if (ModelSupport.isSubClass(duplicate, Result.class)) { + Result result = (Result) duplicate; + if (isWellformed(result.getDateofacceptance())) { + date = result.getDateofacceptance().getValue(); + } + } - try { - return sdf.parse(date); - } catch (ParseException e) { - return new Date(); - } + try { + return sdf.parse(date); + } catch (ParseException e) { + return new Date(); + } - } + } - public static boolean isWellformed(Field date) { - return date != null && StringUtils.isNotBlank(date.getValue()) && date.getValue().matches(DatePicker.DATE_PATTERN) && DatePicker.inRange(date.getValue()); - } + public static boolean isWellformed(Field date) { + return date != null && StringUtils.isNotBlank(date.getValue()) + && date.getValue().matches(DatePicker.DATE_PATTERN) && DatePicker.inRange(date.getValue()); + } } diff --git a/dhp-workflows/dhp-dedup-openaire/src/main/java/eu/dnetlib/dhp/oa/dedup/Identifier.java b/dhp-workflows/dhp-dedup-openaire/src/main/java/eu/dnetlib/dhp/oa/dedup/Identifier.java index fd52d20f9..480b52341 100644 --- a/dhp-workflows/dhp-dedup-openaire/src/main/java/eu/dnetlib/dhp/oa/dedup/Identifier.java +++ b/dhp-workflows/dhp-dedup-openaire/src/main/java/eu/dnetlib/dhp/oa/dedup/Identifier.java @@ -1,132 +1,138 @@ -package eu.dnetlib.dhp.oa.dedup; -import eu.dnetlib.dhp.schema.common.EntityType; -import eu.dnetlib.dhp.schema.oaf.KeyValue; -import eu.dnetlib.dhp.schema.oaf.StructuredProperty; +package eu.dnetlib.dhp.oa.dedup; import java.io.Serializable; import java.util.Date; import java.util.List; -public class Identifier implements Serializable, Comparable{ +import eu.dnetlib.dhp.schema.common.EntityType; +import eu.dnetlib.dhp.schema.oaf.KeyValue; +import eu.dnetlib.dhp.schema.oaf.StructuredProperty; - StructuredProperty pid; - Date date; - PidType type; - List collectedFrom; - EntityType entityType; - String originalID; +public class Identifier implements Serializable, Comparable { - boolean useOriginal = false; //to know if the top identifier won because of the alphabetical order of the original ID + StructuredProperty pid; + Date date; + PidType type; + List collectedFrom; + EntityType entityType; + String originalID; - public Identifier(StructuredProperty pid, Date date, PidType type, List collectedFrom, EntityType entityType, String originalID) { - this.pid = pid; - this.date = date; - this.type = type; - this.collectedFrom = collectedFrom; - this.entityType = entityType; - this.originalID = originalID; - } + boolean useOriginal = false; // to know if the top identifier won because of the alphabetical order of the original + // ID - public StructuredProperty getPid() { - return pid; - } + public Identifier(StructuredProperty pid, Date date, PidType type, List collectedFrom, + EntityType entityType, String originalID) { + this.pid = pid; + this.date = date; + this.type = type; + this.collectedFrom = collectedFrom; + this.entityType = entityType; + this.originalID = originalID; + } - public void setPid(StructuredProperty pidValue) { - this.pid = pid; - } + public StructuredProperty getPid() { + return pid; + } - public Date getDate() { - return date; - } + public void setPid(StructuredProperty pidValue) { + this.pid = pid; + } - public void setDate(Date date) { - this.date = date; - } + public Date getDate() { + return date; + } - public PidType getType() { - return type; - } + public void setDate(Date date) { + this.date = date; + } - public void setType(PidType type) { - this.type = type; - } + public PidType getType() { + return type; + } - public List getCollectedFrom() { - return collectedFrom; - } + public void setType(PidType type) { + this.type = type; + } - public void setCollectedFrom(List collectedFrom) { - this.collectedFrom = collectedFrom; - } + public List getCollectedFrom() { + return collectedFrom; + } - public EntityType getEntityType() { - return entityType; - } + public void setCollectedFrom(List collectedFrom) { + this.collectedFrom = collectedFrom; + } - public void setEntityType(EntityType entityType) { - this.entityType = entityType; - } + public EntityType getEntityType() { + return entityType; + } - public String getOriginalID() { - return originalID; - } + public void setEntityType(EntityType entityType) { + this.entityType = entityType; + } - public void setOriginalID(String originalID) { - this.originalID = originalID; - } + public String getOriginalID() { + return originalID; + } - public boolean isUseOriginal() { - return useOriginal; - } + public void setOriginalID(String originalID) { + this.originalID = originalID; + } - public void setUseOriginal(boolean useOriginal) { - this.useOriginal = useOriginal; - } + public boolean isUseOriginal() { + return useOriginal; + } - @Override - public int compareTo(Identifier i) { - //priority in comparisons: 1) pidtype, 2) collectedfrom (depending on the entity type) , 3) date 4) alphabetical order of the originalID - if (this.getType().compareTo(i.getType()) == 0){ //same type - if (entityType == EntityType.publication) { - if (isFromDatasourceID(this.collectedFrom, IdGenerator.CROSSREF_ID) && !isFromDatasourceID(i.collectedFrom, IdGenerator.CROSSREF_ID)) - return 1; - if (isFromDatasourceID(i.collectedFrom, IdGenerator.CROSSREF_ID) && !isFromDatasourceID(this.collectedFrom, IdGenerator.CROSSREF_ID)) - return -1; - } - if (entityType == EntityType.dataset) { - if (isFromDatasourceID(this.collectedFrom, IdGenerator.DATACITE_ID) && !isFromDatasourceID(i.collectedFrom, IdGenerator.DATACITE_ID)) - return 1; - if (isFromDatasourceID(i.collectedFrom, IdGenerator.DATACITE_ID) && !isFromDatasourceID(this.collectedFrom, IdGenerator.DATACITE_ID)) - return -1; - } + public void setUseOriginal(boolean useOriginal) { + this.useOriginal = useOriginal; + } - if (this.getDate().compareTo(date) == 0) {//same date + @Override + public int compareTo(Identifier i) { + // priority in comparisons: 1) pidtype, 2) collectedfrom (depending on the entity type) , 3) date 4) + // alphabetical order of the originalID + if (this.getType().compareTo(i.getType()) == 0) { // same type + if (entityType == EntityType.publication) { + if (isFromDatasourceID(this.collectedFrom, IdGenerator.CROSSREF_ID) + && !isFromDatasourceID(i.collectedFrom, IdGenerator.CROSSREF_ID)) + return 1; + if (isFromDatasourceID(i.collectedFrom, IdGenerator.CROSSREF_ID) + && !isFromDatasourceID(this.collectedFrom, IdGenerator.CROSSREF_ID)) + return -1; + } + if (entityType == EntityType.dataset) { + if (isFromDatasourceID(this.collectedFrom, IdGenerator.DATACITE_ID) + && !isFromDatasourceID(i.collectedFrom, IdGenerator.DATACITE_ID)) + return 1; + if (isFromDatasourceID(i.collectedFrom, IdGenerator.DATACITE_ID) + && !isFromDatasourceID(this.collectedFrom, IdGenerator.DATACITE_ID)) + return -1; + } - if (this.originalID.compareTo(i.originalID) > 0) - this.useOriginal = true; - else - i.setUseOriginal(true); + if (this.getDate().compareTo(date) == 0) {// same date - //the minus because we need to take the alphabetically lower id - return -this.originalID.compareTo(i.originalID); - } - else - //the minus is because we need to take the elder date - return -this.getDate().compareTo(date); - } - else { - return this.getType().compareTo(i.getType()); - } + if (this.originalID.compareTo(i.originalID) > 0) + this.useOriginal = true; + else + i.setUseOriginal(true); - } + // the minus because we need to take the alphabetically lower id + return -this.originalID.compareTo(i.originalID); + } else + // the minus is because we need to take the elder date + return -this.getDate().compareTo(date); + } else { + return this.getType().compareTo(i.getType()); + } - public boolean isFromDatasourceID(List collectedFrom, String dsId){ + } - for(KeyValue cf: collectedFrom) { - if(cf.getKey().equals(dsId)) - return true; - } - return false; - } + public boolean isFromDatasourceID(List collectedFrom, String dsId) { + + for (KeyValue cf : collectedFrom) { + if (cf.getKey().equals(dsId)) + return true; + } + return false; + } } diff --git a/dhp-workflows/dhp-dedup-openaire/src/main/java/eu/dnetlib/dhp/oa/dedup/OrgSimRel.java b/dhp-workflows/dhp-dedup-openaire/src/main/java/eu/dnetlib/dhp/oa/dedup/OrgSimRel.java index a7d8ead0b..84dfecd62 100644 --- a/dhp-workflows/dhp-dedup-openaire/src/main/java/eu/dnetlib/dhp/oa/dedup/OrgSimRel.java +++ b/dhp-workflows/dhp-dedup-openaire/src/main/java/eu/dnetlib/dhp/oa/dedup/OrgSimRel.java @@ -1,83 +1,98 @@ + package eu.dnetlib.dhp.oa.dedup; import java.io.Serializable; public class OrgSimRel implements Serializable { - String local_id; - String oa_original_id; - String oa_name; - String oa_acronym; - String oa_country; - String oa_url; - String oa_collectedfrom; + String local_id; + String oa_original_id; + String oa_name; + String oa_acronym; + String oa_country; + String oa_url; + String oa_collectedfrom; - public OrgSimRel() { - } + public OrgSimRel() { + } - public OrgSimRel(String local_id, String oa_original_id, String oa_name, String oa_acronym, String oa_country, String oa_url, String oa_collectedfrom) { - this.local_id = local_id; - this.oa_original_id = oa_original_id; - this.oa_name = oa_name; - this.oa_acronym = oa_acronym; - this.oa_country = oa_country; - this.oa_url = oa_url; - this.oa_collectedfrom = oa_collectedfrom; - } + public OrgSimRel(String local_id, String oa_original_id, String oa_name, String oa_acronym, String oa_country, + String oa_url, String oa_collectedfrom) { + this.local_id = local_id; + this.oa_original_id = oa_original_id; + this.oa_name = oa_name; + this.oa_acronym = oa_acronym; + this.oa_country = oa_country; + this.oa_url = oa_url; + this.oa_collectedfrom = oa_collectedfrom; + } - public String getLocal_id() { - return local_id; - } + public String getLocal_id() { + return local_id; + } - public void setLocal_id(String local_id) { - this.local_id = local_id; - } + public void setLocal_id(String local_id) { + this.local_id = local_id; + } - public String getOa_original_id() { - return oa_original_id; - } + public String getOa_original_id() { + return oa_original_id; + } - public void setOa_original_id(String oa_original_id) { - this.oa_original_id = oa_original_id; - } + public void setOa_original_id(String oa_original_id) { + this.oa_original_id = oa_original_id; + } - public String getOa_name() { - return oa_name; - } + public String getOa_name() { + return oa_name; + } - public void setOa_name(String oa_name) { - this.oa_name = oa_name; - } + public void setOa_name(String oa_name) { + this.oa_name = oa_name; + } - public String getOa_acronym() { - return oa_acronym; - } + public String getOa_acronym() { + return oa_acronym; + } - public void setOa_acronym(String oa_acronym) { - this.oa_acronym = oa_acronym; - } + public void setOa_acronym(String oa_acronym) { + this.oa_acronym = oa_acronym; + } - public String getOa_country() { - return oa_country; - } + public String getOa_country() { + return oa_country; + } - public void setOa_country(String oa_country) { - this.oa_country = oa_country; - } + public void setOa_country(String oa_country) { + this.oa_country = oa_country; + } - public String getOa_url() { - return oa_url; - } + public String getOa_url() { + return oa_url; + } - public void setOa_url(String oa_url) { - this.oa_url = oa_url; - } + public void setOa_url(String oa_url) { + this.oa_url = oa_url; + } - public String getOa_collectedfrom() { - return oa_collectedfrom; - } + public String getOa_collectedfrom() { + return oa_collectedfrom; + } - public void setOa_collectedfrom(String oa_collectedfrom) { - this.oa_collectedfrom = oa_collectedfrom; - } + public void setOa_collectedfrom(String oa_collectedfrom) { + this.oa_collectedfrom = oa_collectedfrom; + } + + @Override + public String toString() { + return "OrgSimRel{" + + "local_id='" + local_id + '\'' + + ", oa_original_id='" + oa_original_id + '\'' + + ", oa_name='" + oa_name + '\'' + + ", oa_acronym='" + oa_acronym + '\'' + + ", oa_country='" + oa_country + '\'' + + ", oa_url='" + oa_url + '\'' + + ", oa_collectedfrom='" + oa_collectedfrom + '\'' + + '}'; + } } diff --git a/dhp-workflows/dhp-dedup-openaire/src/main/java/eu/dnetlib/dhp/oa/dedup/PidType.java b/dhp-workflows/dhp-dedup-openaire/src/main/java/eu/dnetlib/dhp/oa/dedup/PidType.java index ab5c49868..c3241bac6 100644 --- a/dhp-workflows/dhp-dedup-openaire/src/main/java/eu/dnetlib/dhp/oa/dedup/PidType.java +++ b/dhp-workflows/dhp-dedup-openaire/src/main/java/eu/dnetlib/dhp/oa/dedup/PidType.java @@ -1,25 +1,17 @@ + package eu.dnetlib.dhp.oa.dedup; public enum PidType { - //from the less to the more important - undefined, - original, - orcid, - ror, - grid, - pdb, - arXiv, - pmid, - doi; + // from the less to the more important + undefined, original, orcid, ror, grid, pdb, arXiv, pmid, doi; - public static PidType classidValueOf(String s){ - try { - return PidType.valueOf(s); - } - catch (Exception e) { - return PidType.undefined; - } - } + public static PidType classidValueOf(String s) { + try { + return PidType.valueOf(s); + } catch (Exception e) { + return PidType.undefined; + } + } -} \ No newline at end of file +} diff --git a/dhp-workflows/dhp-dedup-openaire/src/main/java/eu/dnetlib/dhp/oa/dedup/SparkCollectSimRels.java b/dhp-workflows/dhp-dedup-openaire/src/main/java/eu/dnetlib/dhp/oa/dedup/SparkCollectSimRels.java index b35f9c54a..f9e6448b0 100644 --- a/dhp-workflows/dhp-dedup-openaire/src/main/java/eu/dnetlib/dhp/oa/dedup/SparkCollectSimRels.java +++ b/dhp-workflows/dhp-dedup-openaire/src/main/java/eu/dnetlib/dhp/oa/dedup/SparkCollectSimRels.java @@ -1,21 +1,5 @@ -package eu.dnetlib.dhp.oa.dedup; -import eu.dnetlib.dhp.application.ArgumentApplicationParser; -import eu.dnetlib.dhp.schema.oaf.DataInfo; -import eu.dnetlib.dhp.schema.oaf.Relation; -import eu.dnetlib.dhp.utils.ISLookupClientFactory; -import eu.dnetlib.enabling.is.lookup.rmi.ISLookUpException; -import eu.dnetlib.enabling.is.lookup.rmi.ISLookUpService; -import eu.dnetlib.pace.config.DedupConfig; -import org.apache.commons.io.IOUtils; -import org.apache.spark.SparkConf; -import org.apache.spark.api.java.JavaPairRDD; -import org.apache.spark.api.java.JavaRDD; -import org.apache.spark.sql.*; -import org.dom4j.DocumentException; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import scala.Tuple2; +package eu.dnetlib.dhp.oa.dedup; import java.io.IOException; import java.util.ArrayList; @@ -24,153 +8,177 @@ import java.util.Optional; import java.util.stream.Collectors; import java.util.stream.StreamSupport; +import org.apache.commons.io.IOUtils; +import org.apache.spark.SparkConf; +import org.apache.spark.api.java.JavaPairRDD; +import org.apache.spark.api.java.JavaRDD; +import org.apache.spark.sql.*; +import org.dom4j.DocumentException; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import eu.dnetlib.dhp.application.ArgumentApplicationParser; +import eu.dnetlib.dhp.schema.oaf.DataInfo; +import eu.dnetlib.dhp.schema.oaf.Relation; +import eu.dnetlib.dhp.utils.ISLookupClientFactory; +import eu.dnetlib.enabling.is.lookup.rmi.ISLookUpException; +import eu.dnetlib.enabling.is.lookup.rmi.ISLookUpService; +import eu.dnetlib.pace.config.DedupConfig; +import scala.Tuple2; + public class SparkCollectSimRels extends AbstractSparkAction { - private static final Logger log = LoggerFactory.getLogger(SparkCollectSimRels.class); + private static final Logger log = LoggerFactory.getLogger(SparkCollectSimRels.class); - Dataset simGroupsDS; - Dataset groupsDS; + Dataset simGroupsDS; + Dataset groupsDS; - public SparkCollectSimRels(ArgumentApplicationParser parser, SparkSession spark, Dataset simGroupsDS, Dataset groupsDS) { - super(parser, spark); - this.simGroupsDS = simGroupsDS; - this.groupsDS = groupsDS; - } + public SparkCollectSimRels(ArgumentApplicationParser parser, SparkSession spark, Dataset simGroupsDS, + Dataset groupsDS) { + super(parser, spark); + this.simGroupsDS = simGroupsDS; + this.groupsDS = groupsDS; + } - public static void main(String[] args) throws Exception { - ArgumentApplicationParser parser = new ArgumentApplicationParser( - IOUtils - .toString( - SparkBlockStats.class - .getResourceAsStream( - "/eu/dnetlib/dhp/oa/dedup/collectSimRels_parameters.json"))); - parser.parseArgument(args); + public static void main(String[] args) throws Exception { + ArgumentApplicationParser parser = new ArgumentApplicationParser( + IOUtils + .toString( + SparkBlockStats.class + .getResourceAsStream( + "/eu/dnetlib/dhp/oa/dedup/collectSimRels_parameters.json"))); + parser.parseArgument(args); - SparkConf conf = new SparkConf(); + SparkConf conf = new SparkConf(); - final String dbUrl = parser.get("postgresUrl"); - final String dbUser = parser.get("postgresUser"); - final String dbPassword = parser.get("postgresPassword"); + final String dbUrl = parser.get("postgresUrl"); + final String dbUser = parser.get("postgresUser"); + final String dbPassword = parser.get("postgresPassword"); - SparkSession spark = getSparkSession(conf); + SparkSession spark = getSparkSession(conf); - DataFrameReader readOptions = spark.read() - .format("jdbc") - .option("url", dbUrl) - .option("user", dbUser) - .option("password", dbPassword); + DataFrameReader readOptions = spark + .read() + .format("jdbc") + .option("url", dbUrl) + .option("user", dbUser) + .option("password", dbPassword); - new SparkCollectSimRels( - parser, - spark, - readOptions.option("dbtable", "similarity_groups").load(), - readOptions.option("dbtable", "groups").load() - ).run(ISLookupClientFactory.getLookUpService(parser.get("isLookUpUrl"))); - } + new SparkCollectSimRels( + parser, + spark, + readOptions.option("dbtable", "similarity_groups").load(), + readOptions.option("dbtable", "groups").load()) + .run(ISLookupClientFactory.getLookUpService(parser.get("isLookUpUrl"))); + } - @Override - void run(ISLookUpService isLookUpService) throws DocumentException, ISLookUpException, IOException { + @Override + void run(ISLookUpService isLookUpService) throws DocumentException, ISLookUpException, IOException { - // read oozie parameters - final String isLookUpUrl = parser.get("isLookUpUrl"); - final String actionSetId = parser.get("actionSetId"); - final String workingPath = parser.get("workingPath"); - final int numPartitions = Optional - .ofNullable(parser.get("numPartitions")) - .map(Integer::valueOf) - .orElse(NUM_PARTITIONS); - final String dbUrl = parser.get("postgresUrl"); - final String dbUser = parser.get("postgresUser"); + // read oozie parameters + final String isLookUpUrl = parser.get("isLookUpUrl"); + final String actionSetId = parser.get("actionSetId"); + final String workingPath = parser.get("workingPath"); + final int numPartitions = Optional + .ofNullable(parser.get("numPartitions")) + .map(Integer::valueOf) + .orElse(NUM_PARTITIONS); + final String dbUrl = parser.get("postgresUrl"); + final String dbUser = parser.get("postgresUser"); - log.info("numPartitions: '{}'", numPartitions); - log.info("isLookUpUrl: '{}'", isLookUpUrl); - log.info("actionSetId: '{}'", actionSetId); - log.info("workingPath: '{}'", workingPath); - log.info("postgresUser: {}", dbUser); - log.info("postgresUrl: {}", dbUrl); - log.info("postgresPassword: xxx"); + log.info("numPartitions: '{}'", numPartitions); + log.info("isLookUpUrl: '{}'", isLookUpUrl); + log.info("actionSetId: '{}'", actionSetId); + log.info("workingPath: '{}'", workingPath); + log.info("postgresUser: {}", dbUser); + log.info("postgresUrl: {}", dbUrl); + log.info("postgresPassword: xxx"); - JavaPairRDD> similarityGroup = - simGroupsDS - .toJavaRDD() - .mapToPair(r -> new Tuple2<>(r.getString(0), r.getString(1))) - .groupByKey() - .mapToPair(i -> new Tuple2<>(i._1(), StreamSupport.stream(i._2().spliterator(), false) - .collect(Collectors.toList()))); + JavaPairRDD> similarityGroup = simGroupsDS + .toJavaRDD() + .mapToPair(r -> new Tuple2<>(r.getString(0), r.getString(1))) + .groupByKey() + .mapToPair( + i -> new Tuple2<>(i._1(), StreamSupport + .stream(i._2().spliterator(), false) + .collect(Collectors.toList()))); - JavaPairRDD groupIds = - groupsDS - .toJavaRDD() - .mapToPair(r -> new Tuple2<>(r.getString(0), r.getString(1))); + JavaPairRDD groupIds = groupsDS + .toJavaRDD() + .mapToPair(r -> new Tuple2<>(r.getString(0), r.getString(1))); - JavaRDD, List>> groups = similarityGroup - .leftOuterJoin(groupIds) - .filter(g -> g._2()._2().isPresent()) - .map(g -> new Tuple2<>(new Tuple2<>(g._1(), g._2()._2().get()), g._2()._1())); + JavaRDD, List>> groups = similarityGroup + .leftOuterJoin(groupIds) + .filter(g -> g._2()._2().isPresent()) + .map(g -> new Tuple2<>(new Tuple2<>(g._1(), g._2()._2().get()), g._2()._1())); - JavaRDD relations = groups.flatMap(g -> { - String firstId = g._2().get(0); - List rels = new ArrayList<>(); + JavaRDD relations = groups.flatMap(g -> { + String firstId = g._2().get(0); + List rels = new ArrayList<>(); - for (String id : g._2()) { - if (!firstId.equals(id)) - rels.add(createSimRel(firstId, id, g._1()._2())); - } + for (String id : g._2()) { + if (!firstId.equals(id)) + rels.add(createSimRel(firstId, id, g._1()._2())); + } - return rels.iterator(); - }); + return rels.iterator(); + }); - Dataset resultRelations = spark.createDataset( - relations.filter(r -> r.getRelType().equals("resultResult")).rdd(), - Encoders.bean(Relation.class) - ).repartition(numPartitions); + Dataset resultRelations = spark + .createDataset( + relations.filter(r -> r.getRelType().equals("resultResult")).rdd(), + Encoders.bean(Relation.class)) + .repartition(numPartitions); - Dataset organizationRelations = spark.createDataset( - relations.filter(r -> r.getRelType().equals("organizationOrganization")).rdd(), - Encoders.bean(Relation.class) - ).repartition(numPartitions); + Dataset organizationRelations = spark + .createDataset( + relations.filter(r -> r.getRelType().equals("organizationOrganization")).rdd(), + Encoders.bean(Relation.class)) + .repartition(numPartitions); - for (DedupConfig dedupConf : getConfigurations(isLookUpService, actionSetId)) { - switch(dedupConf.getWf().getSubEntityValue()){ - case "organization": - savePostgresRelation(organizationRelations, workingPath, actionSetId, "organization"); - break; - default: - savePostgresRelation(resultRelations, workingPath, actionSetId, dedupConf.getWf().getSubEntityValue()); - break; - } - } + for (DedupConfig dedupConf : getConfigurations(isLookUpService, actionSetId)) { + switch (dedupConf.getWf().getSubEntityValue()) { + case "organization": + savePostgresRelation(organizationRelations, workingPath, actionSetId, "organization"); + break; + default: + savePostgresRelation( + resultRelations, workingPath, actionSetId, dedupConf.getWf().getSubEntityValue()); + break; + } + } - } + } - private Relation createSimRel(String source, String target, String entity) { - final Relation r = new Relation(); - r.setSubRelType("dedupSimilarity"); - r.setRelClass("isSimilarTo"); - r.setDataInfo(new DataInfo()); + private Relation createSimRel(String source, String target, String entity) { + final Relation r = new Relation(); + r.setSubRelType("dedupSimilarity"); + r.setRelClass("isSimilarTo"); + r.setDataInfo(new DataInfo()); - switch (entity) { - case "result": - r.setSource("50|" + source); - r.setTarget("50|" + target); - r.setRelType("resultResult"); - break; - case "organization": - r.setSource("20|" + source); - r.setTarget("20|" + target); - r.setRelType("organizationOrganization"); - break; - default: - throw new IllegalArgumentException("unmanaged entity type: " + entity); - } - return r; - } + switch (entity) { + case "result": + r.setSource("50|" + source); + r.setTarget("50|" + target); + r.setRelType("resultResult"); + break; + case "organization": + r.setSource("20|" + source); + r.setTarget("20|" + target); + r.setRelType("organizationOrganization"); + break; + default: + throw new IllegalArgumentException("unmanaged entity type: " + entity); + } + return r; + } - private void savePostgresRelation(Dataset newRelations, String workingPath, String actionSetId, String entityType) { - newRelations - .write() - .mode(SaveMode.Append) - .parquet(DedupUtility.createSimRelPath(workingPath, actionSetId, entityType)); - } + private void savePostgresRelation(Dataset newRelations, String workingPath, String actionSetId, + String entityType) { + newRelations + .write() + .mode(SaveMode.Append) + .parquet(DedupUtility.createSimRelPath(workingPath, actionSetId, entityType)); + } -} \ No newline at end of file +} diff --git a/dhp-workflows/dhp-dedup-openaire/src/main/java/eu/dnetlib/dhp/oa/dedup/SparkCreateMergeRels.java b/dhp-workflows/dhp-dedup-openaire/src/main/java/eu/dnetlib/dhp/oa/dedup/SparkCreateMergeRels.java index ce6226dde..1122b42eb 100644 --- a/dhp-workflows/dhp-dedup-openaire/src/main/java/eu/dnetlib/dhp/oa/dedup/SparkCreateMergeRels.java +++ b/dhp-workflows/dhp-dedup-openaire/src/main/java/eu/dnetlib/dhp/oa/dedup/SparkCreateMergeRels.java @@ -104,13 +104,13 @@ public class SparkCreateMergeRels extends AbstractSparkAction { .map(s -> MapDocumentUtil.getJPathString(dedupConf.getWf().getIdPath(), s)) .mapToPair((PairFunction) s -> new Tuple2<>(hash(s), s)); - final RDD> edgeRdd = spark - .read() - .load(DedupUtility.createSimRelPath(workingPath, actionSetId, subEntity)) - .as(Encoders.bean(Relation.class)) - .javaRDD() - .map(it -> new Edge<>(hash(it.getSource()), hash(it.getTarget()), it.getRelClass())) - .rdd(); + final RDD> edgeRdd = spark + .read() + .load(DedupUtility.createSimRelPath(workingPath, actionSetId, subEntity)) + .as(Encoders.bean(Relation.class)) + .javaRDD() + .map(it -> new Edge<>(hash(it.getSource()), hash(it.getTarget()), it.getRelClass())) + .rdd(); final Dataset mergeRels = spark .createDataset( diff --git a/dhp-workflows/dhp-dedup-openaire/src/main/java/eu/dnetlib/dhp/oa/dedup/SparkCreateSimRels.java b/dhp-workflows/dhp-dedup-openaire/src/main/java/eu/dnetlib/dhp/oa/dedup/SparkCreateSimRels.java index babccefb4..d5033d425 100644 --- a/dhp-workflows/dhp-dedup-openaire/src/main/java/eu/dnetlib/dhp/oa/dedup/SparkCreateSimRels.java +++ b/dhp-workflows/dhp-dedup-openaire/src/main/java/eu/dnetlib/dhp/oa/dedup/SparkCreateSimRels.java @@ -100,17 +100,17 @@ public class SparkCreateSimRels extends AbstractSparkAction { .repartition(numPartitions); // create relations by comparing only elements in the same group - spark.createDataset( - Deduper - .computeRelations(sc, blocks, dedupConf) - .map(t -> createSimRel(t._1(), t._2(), entity)) - .repartition(numPartitions) - .rdd(), - Encoders.bean(Relation.class) - ) - .write() - .mode(SaveMode.Append) - .parquet(outputPath); + spark + .createDataset( + Deduper + .computeRelations(sc, blocks, dedupConf) + .map(t -> createSimRel(t._1(), t._2(), entity)) + .repartition(numPartitions) + .rdd(), + Encoders.bean(Relation.class)) + .write() + .mode(SaveMode.Append) + .parquet(outputPath); } } diff --git a/dhp-workflows/dhp-dedup-openaire/src/main/java/eu/dnetlib/dhp/oa/dedup/SparkPrepareOrgRels.java b/dhp-workflows/dhp-dedup-openaire/src/main/java/eu/dnetlib/dhp/oa/dedup/SparkPrepareOrgRels.java index dff1bbb0d..d6c548de3 100644 --- a/dhp-workflows/dhp-dedup-openaire/src/main/java/eu/dnetlib/dhp/oa/dedup/SparkPrepareOrgRels.java +++ b/dhp-workflows/dhp-dedup-openaire/src/main/java/eu/dnetlib/dhp/oa/dedup/SparkPrepareOrgRels.java @@ -1,13 +1,11 @@ + package eu.dnetlib.dhp.oa.dedup; -import eu.dnetlib.dhp.application.ArgumentApplicationParser; -import eu.dnetlib.dhp.schema.common.EntityType; -import eu.dnetlib.dhp.schema.common.ModelSupport; -import eu.dnetlib.dhp.schema.oaf.*; -import eu.dnetlib.dhp.utils.ISLookupClientFactory; -import eu.dnetlib.enabling.is.lookup.rmi.ISLookUpException; -import eu.dnetlib.enabling.is.lookup.rmi.ISLookUpService; -import eu.dnetlib.pace.config.DedupConfig; +import static jdk.nashorn.internal.objects.NativeDebug.map; + +import java.io.IOException; +import java.util.*; + import org.apache.commons.io.IOUtils; import org.apache.http.client.methods.CloseableHttpResponse; import org.apache.http.client.methods.HttpGet; @@ -15,6 +13,7 @@ import org.apache.http.impl.client.CloseableHttpClient; import org.apache.http.impl.client.HttpClients; import org.apache.spark.SparkConf; import org.apache.spark.api.java.JavaRDD; +import org.apache.spark.api.java.function.FilterFunction; import org.apache.spark.api.java.function.MapFunction; import org.apache.spark.api.java.function.MapGroupsFunction; import org.apache.spark.sql.Dataset; @@ -24,145 +23,172 @@ import org.apache.spark.sql.SparkSession; import org.dom4j.DocumentException; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import scala.Tuple2; -import java.io.IOException; -import java.util.ArrayList; -import java.util.Iterator; -import java.util.List; -import java.util.Properties; +import eu.dnetlib.dhp.application.ArgumentApplicationParser; +import eu.dnetlib.dhp.schema.common.EntityType; +import eu.dnetlib.dhp.schema.common.ModelSupport; +import eu.dnetlib.dhp.schema.oaf.*; +import eu.dnetlib.dhp.utils.ISLookupClientFactory; +import eu.dnetlib.enabling.is.lookup.rmi.ISLookUpException; +import eu.dnetlib.enabling.is.lookup.rmi.ISLookUpService; +import eu.dnetlib.pace.config.DedupConfig; +import scala.Tuple2; public class SparkPrepareOrgRels extends AbstractSparkAction { - private static final Logger log = LoggerFactory.getLogger(SparkCreateDedupRecord.class); + private static final Logger log = LoggerFactory.getLogger(SparkCreateDedupRecord.class); - public static final String ROOT_TRUST = "0.8"; - public static final String PROVENANCE_ACTION_CLASS = "sysimport:dedup"; - public static final String PROVENANCE_ACTIONS = "dnet:provenanceActions"; + public SparkPrepareOrgRels(ArgumentApplicationParser parser, SparkSession spark) { + super(parser, spark); + } - public SparkPrepareOrgRels(ArgumentApplicationParser parser, SparkSession spark) { - super(parser, spark); - } + public static void main(String[] args) throws Exception { + ArgumentApplicationParser parser = new ArgumentApplicationParser( + IOUtils + .toString( + SparkCreateSimRels.class + .getResourceAsStream( + "/eu/dnetlib/dhp/oa/dedup/prepareOrgRels_parameters.json"))); + parser.parseArgument(args); - public static void main(String[] args) throws Exception { - ArgumentApplicationParser parser = new ArgumentApplicationParser( - IOUtils - .toString( - SparkCreateSimRels.class - .getResourceAsStream( - "/eu/dnetlib/dhp/oa/dedup/prepareOrgRels_parameters.json"))); - parser.parseArgument(args); + SparkConf conf = new SparkConf(); + conf.set("spark.serializer", "org.apache.spark.serializer.KryoSerializer"); + conf.registerKryoClasses(ModelSupport.getOafModelClasses()); - SparkConf conf = new SparkConf(); - conf.set("spark.serializer", "org.apache.spark.serializer.KryoSerializer"); - conf.registerKryoClasses(ModelSupport.getOafModelClasses()); + new SparkPrepareOrgRels(parser, getSparkSession(conf)) + .run(ISLookupClientFactory.getLookUpService(parser.get("isLookUpUrl"))); + } - new SparkCreateDedupRecord(parser, getSparkSession(conf)) - .run(ISLookupClientFactory.getLookUpService(parser.get("isLookUpUrl"))); - } + @Override + public void run(ISLookUpService isLookUpService) throws IOException { - @Override - public void run(ISLookUpService isLookUpService) throws IOException { + final String graphBasePath = parser.get("graphBasePath"); + final String isLookUpUrl = parser.get("isLookUpUrl"); + final String actionSetId = parser.get("actionSetId"); + final String workingPath = parser.get("workingPath"); + final int numConnections = Optional + .ofNullable(parser.get("numConnections")) + .map(Integer::valueOf) + .orElse(NUM_CONNECTIONS); - final String graphBasePath = parser.get("graphBasePath"); - final String isLookUpUrl = parser.get("isLookUpUrl"); - final String actionSetId = parser.get("actionSetId"); - final String workingPath = parser.get("workingPath"); - final String apiUrl = parser.get("apiUrl"); - final String dbUrl = parser.get("dbUrl"); - final String dbTable = parser.get("dbTable"); - final String dbUser = parser.get("dbUser"); - final String dbPwd = parser.get("dbPwd"); + final String apiUrl = Optional + .ofNullable(parser.get("apiUrl")) + .orElse(""); - log.info("graphBasePath: '{}'", graphBasePath); - log.info("isLookUpUrl: '{}'", isLookUpUrl); - log.info("actionSetId: '{}'", actionSetId); - log.info("workingPath: '{}'", workingPath); - log.info("apiUrl: '{}'", apiUrl); - log.info("dbUrl: '{}'", dbUrl); - log.info("dbUser: '{}'", dbUser); - log.info("table: '{}'", dbTable); - log.info("dbPwd: '{}'", "xxx"); + final String dbUrl = parser.get("dbUrl"); + final String dbTable = parser.get("dbTable"); + final String dbUser = parser.get("dbUser"); + final String dbPwd = parser.get("dbPwd"); - final String mergeRelPath = DedupUtility.createMergeRelPath(workingPath, actionSetId, "organization"); - final String entityPath = DedupUtility.createEntityPath(graphBasePath, "organization"); + log.info("graphBasePath: '{}'", graphBasePath); + log.info("isLookUpUrl: '{}'", isLookUpUrl); + log.info("actionSetId: '{}'", actionSetId); + log.info("workingPath: '{}'", workingPath); + log.info("numPartitions: '{}'", numConnections); + log.info("apiUrl: '{}'", apiUrl); + log.info("dbUrl: '{}'", dbUrl); + log.info("dbUser: '{}'", dbUser); + log.info("table: '{}'", dbTable); + log.info("dbPwd: '{}'", "xxx"); - Dataset relations = createRelations(spark, mergeRelPath, entityPath); + final String mergeRelPath = DedupUtility.createMergeRelPath(workingPath, actionSetId, "organization"); + final String entityPath = DedupUtility.createEntityPath(graphBasePath, "organization"); - final Properties connectionProperties = new Properties(); - connectionProperties.put("user", dbUser); - connectionProperties.put("password", dbPwd); + Dataset relations = createRelations(spark, mergeRelPath, entityPath); - relations.write().mode(SaveMode.Overwrite).jdbc(dbUrl, dbTable, connectionProperties); + final Properties connectionProperties = new Properties(); + connectionProperties.put("user", dbUser); + connectionProperties.put("password", dbPwd); - if (!apiUrl.isEmpty()) - updateSimRels(apiUrl); + relations + .repartition(numConnections) + .write() + .mode(SaveMode.Overwrite) + .jdbc(dbUrl, dbTable, connectionProperties); - } + if (!apiUrl.isEmpty()) + updateSimRels(apiUrl); - public static Dataset createRelations( - final SparkSession spark, - final String mergeRelsPath, - final String entitiesPath) { + } - // - Dataset> entities = spark - .read() - .textFile(entitiesPath) - .map( - (MapFunction>) it -> { - Organization entity = OBJECT_MAPPER.readValue(it, Organization.class); - return new Tuple2<>(entity.getId(), entity); - }, - Encoders.tuple(Encoders.STRING(), Encoders.kryo(Organization.class))); + public static Dataset createRelations( + final SparkSession spark, + final String mergeRelsPath, + final String entitiesPath) { - Dataset> relations = spark.createDataset( - spark - .read() - .load(mergeRelsPath) - .as(Encoders.bean(Relation.class)) - .where("relClass == 'merges'") - .toJavaRDD() - .mapToPair(r -> new Tuple2<>(r.getSource(), r.getTarget())) - .groupByKey() - .flatMap(g -> { - List> rels = new ArrayList<>(); - for (String id1 : g._2()) { - for (String id2 : g._2()) { - if (!id1.equals(id2)) - if (id1.contains("openorgs")) - rels.add(new Tuple2<>(id1, id2)); - } - } - return rels.iterator(); - }).rdd(), - Encoders.tuple(Encoders.STRING(), Encoders.STRING())); + // + Dataset> entities = spark + .read() + .textFile(entitiesPath) + .map( + (MapFunction>) it -> { + Organization entity = OBJECT_MAPPER.readValue(it, Organization.class); + return new Tuple2<>(entity.getId(), entity); + }, + Encoders.tuple(Encoders.STRING(), Encoders.kryo(Organization.class))); - return relations - .joinWith(entities, relations.col("_2").equalTo(entities.col("_1")), "inner") - .map( - (MapFunction, Tuple2>, OrgSimRel>)r -> - new OrgSimRel( - r._1()._2(), - r._2()._2().getOriginalId().get(0), - r._2()._2().getLegalname().getValue(), - r._2()._2().getLegalshortname().getValue(), - r._2()._2().getCountry().getClassid(), - r._2()._2().getWebsiteurl().getValue(), - r._2()._2().getCollectedfrom().get(0).getValue() - ), - Encoders.bean(OrgSimRel.class) - ); + Dataset> relations = spark + .createDataset( + spark + .read() + .load(mergeRelsPath) + .as(Encoders.bean(Relation.class)) + .where("relClass == 'merges'") + .toJavaRDD() + .mapToPair(r -> new Tuple2<>(r.getSource(), r.getTarget())) + .groupByKey() + .flatMap(g -> { + List> rels = new ArrayList<>(); + for (String id1 : g._2()) { + for (String id2 : g._2()) { + if (!id1.equals(id2)) + if (id1.contains("openorgs____") && !id2.contains("openorgsmesh")) + rels.add(new Tuple2<>(id1, id2)); + } + } + return rels.iterator(); + }) + .rdd(), + Encoders.tuple(Encoders.STRING(), Encoders.STRING())); - } + Dataset> relations2 = relations // + .joinWith(entities, relations.col("_2").equalTo(entities.col("_1")), "inner") + .map( + (MapFunction, Tuple2>, OrgSimRel>) r -> new OrgSimRel( + r._1()._1(), + r._2()._2().getOriginalId().get(0), + r._2()._2().getLegalname() != null ? r._2()._2().getLegalname().getValue() : "", + r._2()._2().getLegalshortname() != null ? r._2()._2().getLegalshortname().getValue() : "", + r._2()._2().getCountry() != null ? r._2()._2().getCountry().getClassid() : "", + r._2()._2().getWebsiteurl() != null ? r._2()._2().getWebsiteurl().getValue() : "", + r._2()._2().getCollectedfrom().get(0).getValue()), + Encoders.bean(OrgSimRel.class)) + .map( + (MapFunction>) o -> new Tuple2<>(o.getLocal_id(), o), + Encoders.tuple(Encoders.STRING(), Encoders.bean(OrgSimRel.class))); - private static String updateSimRels(final String apiUrl) throws IOException { - final HttpGet req = new HttpGet(apiUrl); - try (final CloseableHttpClient client = HttpClients.createDefault()) { - try (final CloseableHttpResponse response = client.execute(req)) { - return IOUtils.toString(response.getEntity().getContent()); - } - } - } + return relations2 + .joinWith(entities, relations2.col("_1").equalTo(entities.col("_1")), "inner") + .map( + (MapFunction, Tuple2>, OrgSimRel>) r -> { + OrgSimRel orgSimRel = r._1()._2(); + orgSimRel.setLocal_id(r._2()._2().getOriginalId().get(0)); + return orgSimRel; + }, + Encoders.bean(OrgSimRel.class)); + + } + + private static String updateSimRels(final String apiUrl) throws IOException { + + log.info("Updating simrels on the portal"); + + final HttpGet req = new HttpGet(apiUrl); + try (final CloseableHttpClient client = HttpClients.createDefault()) { + try (final CloseableHttpResponse response = client.execute(req)) { + return IOUtils.toString(response.getEntity().getContent()); + } + } + } } diff --git a/dhp-workflows/dhp-dedup-openaire/src/main/resources/eu/dnetlib/dhp/oa/dedup/orgsdedup/oozie_app/workflow.xml b/dhp-workflows/dhp-dedup-openaire/src/main/resources/eu/dnetlib/dhp/oa/dedup/orgsdedup/oozie_app/workflow.xml index 82ecbc46b..ec9967d6a 100644 --- a/dhp-workflows/dhp-dedup-openaire/src/main/resources/eu/dnetlib/dhp/oa/dedup/orgsdedup/oozie_app/workflow.xml +++ b/dhp-workflows/dhp-dedup-openaire/src/main/resources/eu/dnetlib/dhp/oa/dedup/orgsdedup/oozie_app/workflow.xml @@ -1,4 +1,4 @@ - + graphBasePath @@ -24,10 +24,6 @@ cutConnectedComponent max number of elements in a connected component - - apiUrl - the url for the APIs of the openorgs service - dbUrl the url of the database @@ -109,6 +105,16 @@ + + + + + + + -pb + ${graphBasePath}/relation + ${workingPath}/${actionSetId}/organization_simrel + @@ -136,16 +142,6 @@ --workingPath${workingPath} --numPartitions8000 - - - - - - - -pb - ${graphBasePath}/relation - ${workingPath}/organization_simrel - @@ -203,6 +199,7 @@ --dbTable${dbTable} --dbUser${dbUser} --dbPwd${dbPwd} + --numConnections20 diff --git a/dhp-workflows/dhp-dedup-openaire/src/main/resources/eu/dnetlib/dhp/oa/dedup/prepareOrgRels_parameters.json b/dhp-workflows/dhp-dedup-openaire/src/main/resources/eu/dnetlib/dhp/oa/dedup/prepareOrgRels_parameters.json index bcca48a15..b70d1af28 100644 --- a/dhp-workflows/dhp-dedup-openaire/src/main/resources/eu/dnetlib/dhp/oa/dedup/prepareOrgRels_parameters.json +++ b/dhp-workflows/dhp-dedup-openaire/src/main/resources/eu/dnetlib/dhp/oa/dedup/prepareOrgRels_parameters.json @@ -23,11 +23,17 @@ "paramDescription": "the id of the actionset (orchestrator)", "paramRequired": true }, + { + "paramName": "nc", + "paramLongName": "numConnections", + "paramDescription": "number of connections to the postgres db (for the write operation)", + "paramRequired": false + }, { "paramName": "au", "paramLongName": "apiUrl", "paramDescription": "the url for the APIs of the openorgs service", - "paramRequired": true + "paramRequired": false }, { "paramName": "du", diff --git a/dhp-workflows/dhp-dedup-openaire/src/test/java/eu/dnetlib/dhp/oa/dedup/EntityMergerTest.java b/dhp-workflows/dhp-dedup-openaire/src/test/java/eu/dnetlib/dhp/oa/dedup/EntityMergerTest.java index 431751584..30b213ff2 100644 --- a/dhp-workflows/dhp-dedup-openaire/src/test/java/eu/dnetlib/dhp/oa/dedup/EntityMergerTest.java +++ b/dhp-workflows/dhp-dedup-openaire/src/test/java/eu/dnetlib/dhp/oa/dedup/EntityMergerTest.java @@ -138,10 +138,10 @@ public class EntityMergerTest implements Serializable { public void publicationMergerTest3() throws InstantiationException, IllegalAccessException { Publication pub_merged = DedupRecordFactory - .entityMerger(dedupId, publications3.iterator(), 0, dataInfo, Publication.class); + .entityMerger(dedupId, publications3.iterator(), 0, dataInfo, Publication.class); // verify id - assertEquals( "50|dedup_doi___::0ca46ff10b2b4c756191719d85302b14", pub_merged.getId()); + assertEquals("50|dedup_doi___::0ca46ff10b2b4c756191719d85302b14", pub_merged.getId()); } @@ -149,7 +149,7 @@ public class EntityMergerTest implements Serializable { public void publicationMergerTest4() throws InstantiationException, IllegalStateException, IllegalAccessException { Publication pub_merged = DedupRecordFactory - .entityMerger(dedupId, publications4.iterator(), 0, dataInfo, Publication.class); + .entityMerger(dedupId, publications4.iterator(), 0, dataInfo, Publication.class); // verify id assertEquals("50|dedup_wf_001::2d2bbbbcfb285e3fb3590237b79e2fa8", pub_merged.getId()); @@ -160,7 +160,7 @@ public class EntityMergerTest implements Serializable { public void publicationMergerTest5() throws InstantiationException, IllegalStateException, IllegalAccessException { Publication pub_merged = DedupRecordFactory - .entityMerger(dedupId, publications5.iterator(), 0, dataInfo, Publication.class); + .entityMerger(dedupId, publications5.iterator(), 0, dataInfo, Publication.class); // verify id assertEquals("50|dedup_wf_001::584b89679c3ccd1015b647ec63cc2699", pub_merged.getId()); diff --git a/dhp-workflows/dhp-dedup-openaire/src/test/java/eu/dnetlib/dhp/oa/dedup/SparkDedupTest.java b/dhp-workflows/dhp-dedup-openaire/src/test/java/eu/dnetlib/dhp/oa/dedup/SparkDedupTest.java index 59c850591..d9b5e30eb 100644 --- a/dhp-workflows/dhp-dedup-openaire/src/test/java/eu/dnetlib/dhp/oa/dedup/SparkDedupTest.java +++ b/dhp-workflows/dhp-dedup-openaire/src/test/java/eu/dnetlib/dhp/oa/dedup/SparkDedupTest.java @@ -1,11 +1,18 @@ + package eu.dnetlib.dhp.oa.dedup; -import com.fasterxml.jackson.databind.ObjectMapper; -import eu.dnetlib.dhp.application.ArgumentApplicationParser; -import eu.dnetlib.dhp.schema.oaf.Relation; -import eu.dnetlib.enabling.is.lookup.rmi.ISLookUpException; -import eu.dnetlib.enabling.is.lookup.rmi.ISLookUpService; -import eu.dnetlib.pace.util.MapDocumentUtil; +import static java.nio.file.Files.createTempDirectory; + +import static org.apache.spark.sql.functions.count; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.mockito.Mockito.lenient; + +import java.io.File; +import java.io.IOException; +import java.io.Serializable; +import java.net.URISyntaxException; +import java.nio.file.Paths; + import org.apache.commons.io.FileUtils; import org.apache.commons.io.IOUtils; import org.apache.spark.SparkConf; @@ -21,19 +28,16 @@ import org.junit.jupiter.api.extension.ExtendWith; import org.mockito.Mock; import org.mockito.Mockito; import org.mockito.junit.jupiter.MockitoExtension; + +import com.fasterxml.jackson.databind.ObjectMapper; + +import eu.dnetlib.dhp.application.ArgumentApplicationParser; +import eu.dnetlib.dhp.schema.oaf.Relation; +import eu.dnetlib.enabling.is.lookup.rmi.ISLookUpException; +import eu.dnetlib.enabling.is.lookup.rmi.ISLookUpService; +import eu.dnetlib.pace.util.MapDocumentUtil; import scala.Tuple2; -import java.io.File; -import java.io.IOException; -import java.io.Serializable; -import java.net.URISyntaxException; -import java.nio.file.Paths; - -import static java.nio.file.Files.createTempDirectory; -import static org.apache.spark.sql.functions.count; -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.mockito.Mockito.lenient; - @ExtendWith(MockitoExtension.class) @TestMethodOrder(MethodOrderer.OrderAnnotation.class) public class SparkDedupTest implements Serializable { @@ -48,7 +52,7 @@ public class SparkDedupTest implements Serializable { private static String testOutputBasePath; private static String testDedupGraphBasePath; private static final String testActionSetId = "test-orchestrator"; - private static String testDedupAssertionsBasePath; + private static String testDedupAssertionsBasePath; @BeforeAll public static void cleanUp() throws IOException, URISyntaxException { @@ -64,9 +68,9 @@ public class SparkDedupTest implements Serializable { .toAbsolutePath() .toString(); testDedupAssertionsBasePath = Paths - .get(SparkDedupTest.class.getResource("/eu/dnetlib/dhp/dedup/assertions").toURI()) - .toFile() - .getAbsolutePath(); + .get(SparkDedupTest.class.getResource("/eu/dnetlib/dhp/dedup/assertions").toURI()) + .toFile() + .getAbsolutePath(); FileUtils.deleteDirectory(new File(testOutputBasePath)); FileUtils.deleteDirectory(new File(testDedupGraphBasePath)); @@ -82,7 +86,7 @@ public class SparkDedupTest implements Serializable { jsc = JavaSparkContext.fromSparkContext(spark.sparkContext()); - } + } @BeforeEach public void setUp() throws IOException, ISLookUpException { @@ -165,98 +169,98 @@ public class SparkDedupTest implements Serializable { new SparkCreateSimRels(parser, spark).run(isLookUpService); - long orgs_simrel = spark - .read() - .load(testOutputBasePath + "/" + testActionSetId + "/organization_simrel") - .count(); + long orgs_simrel = spark + .read() + .load(testOutputBasePath + "/" + testActionSetId + "/organization_simrel") + .count(); - long pubs_simrel = spark - .read() - .load(testOutputBasePath + "/" + testActionSetId + "/publication_simrel") - .count(); + long pubs_simrel = spark + .read() + .load(testOutputBasePath + "/" + testActionSetId + "/publication_simrel") + .count(); - long sw_simrel = spark - .read() - .load(testOutputBasePath + "/" + testActionSetId + "/software_simrel") - .count(); + long sw_simrel = spark + .read() + .load(testOutputBasePath + "/" + testActionSetId + "/software_simrel") + .count(); - long ds_simrel = spark - .read() - .load(testOutputBasePath + "/" + testActionSetId + "/dataset_simrel") - .count(); + long ds_simrel = spark + .read() + .load(testOutputBasePath + "/" + testActionSetId + "/dataset_simrel") + .count(); - long orp_simrel = spark - .read() - .load(testOutputBasePath + "/" + testActionSetId + "/otherresearchproduct_simrel") - .count(); + long orp_simrel = spark + .read() + .load(testOutputBasePath + "/" + testActionSetId + "/otherresearchproduct_simrel") + .count(); - assertEquals(3432, orgs_simrel); - assertEquals(7152, pubs_simrel); + assertEquals(3082, orgs_simrel); + assertEquals(7036, pubs_simrel); assertEquals(344, sw_simrel); - assertEquals(458, ds_simrel); + assertEquals(442, ds_simrel); assertEquals(6750, orp_simrel); } - @Test - @Order(2) - public void collectSimRelsTest() throws Exception { - ArgumentApplicationParser parser = new ArgumentApplicationParser( - IOUtils - .toString( - SparkCreateSimRels.class - .getResourceAsStream( - "/eu/dnetlib/dhp/oa/dedup/collectSimRels_parameters.json"))); - parser - .parseArgument( - new String[] { - "-asi", testActionSetId, - "-la", "lookupurl", - "-w", testOutputBasePath, - "-np", "50", - "-purl", "jdbc:postgresql://localhost:5432/dnet_dedup", - "-pusr", "postgres_url", - "-ppwd", "" - }); + @Test + @Order(2) + public void collectSimRelsTest() throws Exception { + ArgumentApplicationParser parser = new ArgumentApplicationParser( + IOUtils + .toString( + SparkCollectSimRels.class + .getResourceAsStream( + "/eu/dnetlib/dhp/oa/dedup/collectSimRels_parameters.json"))); + parser + .parseArgument( + new String[] { + "-asi", testActionSetId, + "-la", "lookupurl", + "-w", testOutputBasePath, + "-np", "50", + "-purl", "jdbc:postgresql://localhost:5432/dnet_dedup", + "-pusr", "postgres_user", + "-ppwd", "" + }); - new SparkCollectSimRels( - parser, - spark, - spark.read().load(testDedupAssertionsBasePath + "/similarity_groups"), - spark.read().load(testDedupAssertionsBasePath + "/groups") - ).run(null); + new SparkCollectSimRels( + parser, + spark, + spark.read().load(testDedupAssertionsBasePath + "/similarity_groups"), + spark.read().load(testDedupAssertionsBasePath + "/groups")) + .run(isLookUpService); - long orgs_simrel = spark - .read() - .load(testOutputBasePath + "/" + testActionSetId + "/organization_simrel") - .count(); + long orgs_simrel = spark + .read() + .load(testOutputBasePath + "/" + testActionSetId + "/organization_simrel") + .count(); - long pubs_simrel = spark - .read() - .load(testOutputBasePath + "/" + testActionSetId + "/publication_simrel") - .count(); + long pubs_simrel = spark + .read() + .load(testOutputBasePath + "/" + testActionSetId + "/publication_simrel") + .count(); - long sw_simrel = spark - .read() - .load(testOutputBasePath + "/" + testActionSetId + "/software_simrel") - .count(); + long sw_simrel = spark + .read() + .load(testOutputBasePath + "/" + testActionSetId + "/software_simrel") + .count(); - long ds_simrel = spark - .read() - .load(testOutputBasePath + "/" + testActionSetId + "/dataset_simrel") - .count(); + long ds_simrel = spark + .read() + .load(testOutputBasePath + "/" + testActionSetId + "/dataset_simrel") + .count(); - long orp_simrel = spark - .read() - .load(testOutputBasePath + "/" + testActionSetId + "/otherresearchproduct_simrel") - .count(); + long orp_simrel = spark + .read() + .load(testOutputBasePath + "/" + testActionSetId + "/otherresearchproduct_simrel") + .count(); - assertEquals(4022, orgs_simrel); - assertEquals(10575, pubs_simrel); - assertEquals(3767, sw_simrel); - assertEquals(3881, ds_simrel); - assertEquals(10173, orp_simrel); + assertEquals(3672, orgs_simrel); + assertEquals(10459, pubs_simrel); + assertEquals(3767, sw_simrel); + assertEquals(3865, ds_simrel); + assertEquals(10173, orp_simrel); - } + } @Test @Order(3) @@ -402,8 +406,8 @@ public class SparkDedupTest implements Serializable { .load(testOutputBasePath + "/" + testActionSetId + "/otherresearchproduct_mergerel") .count(); - assertEquals(1276, orgs_mergerel); - assertEquals(1442, pubs_mergerel); + assertEquals(1272, orgs_mergerel); + assertEquals(1438, pubs_mergerel); assertEquals(288, sw_mergerel); assertEquals(472, ds_mergerel); assertEquals(718, orp_mergerel); @@ -449,10 +453,10 @@ public class SparkDedupTest implements Serializable { testOutputBasePath + "/" + testActionSetId + "/otherresearchproduct_deduprecord") .count(); - assertEquals(82, orgs_deduprecord); - assertEquals(66, pubs_deduprecord); + assertEquals(84, orgs_deduprecord); + assertEquals(65, pubs_deduprecord); assertEquals(51, sw_deduprecord); - assertEquals(96, ds_deduprecord); + assertEquals(97, ds_deduprecord); assertEquals(89, orp_deduprecord); } @@ -532,12 +536,12 @@ public class SparkDedupTest implements Serializable { .distinct() .count(); - assertEquals(897, publications); - assertEquals(835, organizations); + assertEquals(896, publications); + assertEquals(837, organizations); assertEquals(100, projects); assertEquals(100, datasource); assertEquals(200, softwares); - assertEquals(388, dataset); + assertEquals(389, dataset); assertEquals(517, otherresearchproduct); long deletedOrgs = jsc @@ -592,7 +596,7 @@ public class SparkDedupTest implements Serializable { long relations = jsc.textFile(testDedupGraphBasePath + "/relation").count(); - assertEquals(4866, relations); + assertEquals(4858, relations); // check deletedbyinference final Dataset mergeRels = spark @@ -641,11 +645,11 @@ public class SparkDedupTest implements Serializable { assertEquals(expected_unique, rel.distinct().count()); } -// @AfterAll -// public static void finalCleanUp() throws IOException { -// FileUtils.deleteDirectory(new File(testOutputBasePath)); -// FileUtils.deleteDirectory(new File(testDedupGraphBasePath)); -// } + @AfterAll + public static void finalCleanUp() throws IOException { + FileUtils.deleteDirectory(new File(testOutputBasePath)); + FileUtils.deleteDirectory(new File(testDedupGraphBasePath)); + } public boolean isDeletedByInference(String s) { return s.contains("\"deletedbyinference\":true"); diff --git a/pom.xml b/pom.xml index cec3dd75a..f7300260c 100644 --- a/pom.xml +++ b/pom.xml @@ -315,7 +315,7 @@ eu.dnetlib dnet-pace-core - 4.0.4 + 4.0.5 eu.dnetlib From a2ac7e52fb33057f36c81febd1bb226169d0b32a Mon Sep 17 00:00:00 2001 From: miconis Date: Tue, 6 Oct 2020 13:58:09 +0200 Subject: [PATCH 06/12] implementation of the workflow for new organizations in openorgs --- .../dhp/oa/dedup/SparkPrepareNewOrgs.java | 145 ++++++++++++ .../dhp/oa/dedup/SparkPrepareOrgRels.java | 17 +- .../dhp/oa/dedup/SparkPropagateRelation.java | 3 +- .../neworgs/oozie_app/config-default.xml | 18 ++ .../oa/dedup/neworgs/oozie_app/workflow.xml | 208 ++++++++++++++++++ .../oa/dedup/prepareNewOrgs_parameters.json | 56 +++++ .../dnetlib/dhp/oa/dedup/SparkDedupTest.java | 10 +- 7 files changed, 439 insertions(+), 18 deletions(-) create mode 100644 dhp-workflows/dhp-dedup-openaire/src/main/java/eu/dnetlib/dhp/oa/dedup/SparkPrepareNewOrgs.java create mode 100644 dhp-workflows/dhp-dedup-openaire/src/main/resources/eu/dnetlib/dhp/oa/dedup/neworgs/oozie_app/config-default.xml create mode 100644 dhp-workflows/dhp-dedup-openaire/src/main/resources/eu/dnetlib/dhp/oa/dedup/neworgs/oozie_app/workflow.xml create mode 100644 dhp-workflows/dhp-dedup-openaire/src/main/resources/eu/dnetlib/dhp/oa/dedup/prepareNewOrgs_parameters.json diff --git a/dhp-workflows/dhp-dedup-openaire/src/main/java/eu/dnetlib/dhp/oa/dedup/SparkPrepareNewOrgs.java b/dhp-workflows/dhp-dedup-openaire/src/main/java/eu/dnetlib/dhp/oa/dedup/SparkPrepareNewOrgs.java new file mode 100644 index 000000000..beb4dbad7 --- /dev/null +++ b/dhp-workflows/dhp-dedup-openaire/src/main/java/eu/dnetlib/dhp/oa/dedup/SparkPrepareNewOrgs.java @@ -0,0 +1,145 @@ + +package eu.dnetlib.dhp.oa.dedup; + +import java.io.IOException; +import java.util.Optional; +import java.util.Properties; + +import org.apache.commons.io.IOUtils; +import org.apache.spark.SparkConf; +import org.apache.spark.api.java.function.FilterFunction; +import org.apache.spark.api.java.function.MapFunction; +import org.apache.spark.sql.Dataset; +import org.apache.spark.sql.Encoders; +import org.apache.spark.sql.SaveMode; +import org.apache.spark.sql.SparkSession; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import eu.dnetlib.dhp.application.ArgumentApplicationParser; +import eu.dnetlib.dhp.schema.common.ModelSupport; +import eu.dnetlib.dhp.schema.oaf.Organization; +import eu.dnetlib.dhp.schema.oaf.Relation; +import eu.dnetlib.dhp.utils.ISLookupClientFactory; +import eu.dnetlib.enabling.is.lookup.rmi.ISLookUpService; +import scala.Tuple2; + +public class SparkPrepareNewOrgs extends AbstractSparkAction { + + private static final Logger log = LoggerFactory.getLogger(SparkCreateDedupRecord.class); + + public SparkPrepareNewOrgs(ArgumentApplicationParser parser, SparkSession spark) { + super(parser, spark); + } + + public static void main(String[] args) throws Exception { + ArgumentApplicationParser parser = new ArgumentApplicationParser( + IOUtils + .toString( + SparkPrepareNewOrgs.class + .getResourceAsStream( + "/eu/dnetlib/dhp/oa/dedup/prepareNewOrgs_parameters.json"))); + parser.parseArgument(args); + + SparkConf conf = new SparkConf(); + conf.set("spark.serializer", "org.apache.spark.serializer.KryoSerializer"); + conf.registerKryoClasses(ModelSupport.getOafModelClasses()); + + new SparkPrepareNewOrgs(parser, getSparkSession(conf)) + .run(ISLookupClientFactory.getLookUpService(parser.get("isLookUpUrl"))); + } + + @Override + public void run(ISLookUpService isLookUpService) throws IOException { + + final String graphBasePath = parser.get("graphBasePath"); + final String isLookUpUrl = parser.get("isLookUpUrl"); + final String actionSetId = parser.get("actionSetId"); + final String workingPath = parser.get("workingPath"); + final int numConnections = Optional + .ofNullable(parser.get("numConnections")) + .map(Integer::valueOf) + .orElse(NUM_CONNECTIONS); + + final String dbUrl = parser.get("dbUrl"); + final String dbTable = parser.get("dbTable"); + final String dbUser = parser.get("dbUser"); + final String dbPwd = parser.get("dbPwd"); + + log.info("graphBasePath: '{}'", graphBasePath); + log.info("isLookUpUrl: '{}'", isLookUpUrl); + log.info("actionSetId: '{}'", actionSetId); + log.info("workingPath: '{}'", workingPath); + log.info("numPartitions: '{}'", numConnections); + log.info("dbUrl: '{}'", dbUrl); + log.info("dbUser: '{}'", dbUser); + log.info("table: '{}'", dbTable); + log.info("dbPwd: '{}'", "xxx"); + + final String mergeRelPath = DedupUtility.createMergeRelPath(workingPath, actionSetId, "organization"); + final String entityPath = DedupUtility.createEntityPath(graphBasePath, "organization"); + + Dataset newOrgs = createNewOrgs(spark, mergeRelPath, entityPath); + + final Properties connectionProperties = new Properties(); + connectionProperties.put("user", dbUser); + connectionProperties.put("password", dbPwd); + + newOrgs + .repartition(numConnections) + .write() + .mode(SaveMode.Overwrite) + .jdbc(dbUrl, dbTable, connectionProperties); + + } + + public static Dataset createNewOrgs( + final SparkSession spark, + final String mergeRelsPath, + final String entitiesPath) { + + // + Dataset> entities = spark + .read() + .textFile(entitiesPath) + .map( + (MapFunction>) it -> { + Organization entity = OBJECT_MAPPER.readValue(it, Organization.class); + return new Tuple2<>(entity.getId(), entity); + }, + Encoders.tuple(Encoders.STRING(), Encoders.kryo(Organization.class))); + + Dataset> mergerels = spark + .createDataset( + spark + .read() + .load(mergeRelsPath) + .as(Encoders.bean(Relation.class)) + .where("relClass == 'isMergedIn'") + .toJavaRDD() + .mapToPair(r -> new Tuple2<>(r.getSource(), r.getTarget())) + .rdd(), + Encoders.tuple(Encoders.STRING(), Encoders.STRING())); + + return entities + .joinWith(mergerels, entities.col("_1").equalTo(mergerels.col("_1")), "left") + .filter((FilterFunction, Tuple2>>) t -> t._2() == null) + .filter( + (FilterFunction, Tuple2>>) t -> !t + ._1() + ._1() + .contains("openorgs")) + .map( + (MapFunction, Tuple2>, OrgSimRel>) r -> new OrgSimRel( + "", + r._1()._2().getOriginalId().get(0), + r._1()._2().getLegalname() != null ? r._1()._2().getLegalname().getValue() : "", + r._1()._2().getLegalshortname() != null ? r._1()._2().getLegalshortname().getValue() : "", + r._1()._2().getCountry() != null ? r._1()._2().getCountry().getClassid() : "", + r._1()._2().getWebsiteurl() != null ? r._1()._2().getWebsiteurl().getValue() : "", + r._1()._2().getCollectedfrom().get(0).getValue()), + Encoders.bean(OrgSimRel.class)); + + } + +} diff --git a/dhp-workflows/dhp-dedup-openaire/src/main/java/eu/dnetlib/dhp/oa/dedup/SparkPrepareOrgRels.java b/dhp-workflows/dhp-dedup-openaire/src/main/java/eu/dnetlib/dhp/oa/dedup/SparkPrepareOrgRels.java index d6c548de3..5e0081d72 100644 --- a/dhp-workflows/dhp-dedup-openaire/src/main/java/eu/dnetlib/dhp/oa/dedup/SparkPrepareOrgRels.java +++ b/dhp-workflows/dhp-dedup-openaire/src/main/java/eu/dnetlib/dhp/oa/dedup/SparkPrepareOrgRels.java @@ -1,10 +1,11 @@ package eu.dnetlib.dhp.oa.dedup; -import static jdk.nashorn.internal.objects.NativeDebug.map; - import java.io.IOException; -import java.util.*; +import java.util.ArrayList; +import java.util.List; +import java.util.Optional; +import java.util.Properties; import org.apache.commons.io.IOUtils; import org.apache.http.client.methods.CloseableHttpResponse; @@ -12,26 +13,20 @@ import org.apache.http.client.methods.HttpGet; import org.apache.http.impl.client.CloseableHttpClient; import org.apache.http.impl.client.HttpClients; import org.apache.spark.SparkConf; -import org.apache.spark.api.java.JavaRDD; -import org.apache.spark.api.java.function.FilterFunction; import org.apache.spark.api.java.function.MapFunction; -import org.apache.spark.api.java.function.MapGroupsFunction; import org.apache.spark.sql.Dataset; import org.apache.spark.sql.Encoders; import org.apache.spark.sql.SaveMode; import org.apache.spark.sql.SparkSession; -import org.dom4j.DocumentException; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import eu.dnetlib.dhp.application.ArgumentApplicationParser; -import eu.dnetlib.dhp.schema.common.EntityType; import eu.dnetlib.dhp.schema.common.ModelSupport; -import eu.dnetlib.dhp.schema.oaf.*; +import eu.dnetlib.dhp.schema.oaf.Organization; +import eu.dnetlib.dhp.schema.oaf.Relation; import eu.dnetlib.dhp.utils.ISLookupClientFactory; -import eu.dnetlib.enabling.is.lookup.rmi.ISLookUpException; import eu.dnetlib.enabling.is.lookup.rmi.ISLookUpService; -import eu.dnetlib.pace.config.DedupConfig; import scala.Tuple2; public class SparkPrepareOrgRels extends AbstractSparkAction { diff --git a/dhp-workflows/dhp-dedup-openaire/src/main/java/eu/dnetlib/dhp/oa/dedup/SparkPropagateRelation.java b/dhp-workflows/dhp-dedup-openaire/src/main/java/eu/dnetlib/dhp/oa/dedup/SparkPropagateRelation.java index ae5bf9252..699039c99 100644 --- a/dhp-workflows/dhp-dedup-openaire/src/main/java/eu/dnetlib/dhp/oa/dedup/SparkPropagateRelation.java +++ b/dhp-workflows/dhp-dedup-openaire/src/main/java/eu/dnetlib/dhp/oa/dedup/SparkPropagateRelation.java @@ -28,8 +28,7 @@ public class SparkPropagateRelation extends AbstractSparkAction { SOURCE, TARGET } - public SparkPropagateRelation(ArgumentApplicationParser parser, SparkSession spark) - throws Exception { + public SparkPropagateRelation(ArgumentApplicationParser parser, SparkSession spark) throws Exception { super(parser, spark); } diff --git a/dhp-workflows/dhp-dedup-openaire/src/main/resources/eu/dnetlib/dhp/oa/dedup/neworgs/oozie_app/config-default.xml b/dhp-workflows/dhp-dedup-openaire/src/main/resources/eu/dnetlib/dhp/oa/dedup/neworgs/oozie_app/config-default.xml new file mode 100644 index 000000000..2e0ed9aee --- /dev/null +++ b/dhp-workflows/dhp-dedup-openaire/src/main/resources/eu/dnetlib/dhp/oa/dedup/neworgs/oozie_app/config-default.xml @@ -0,0 +1,18 @@ + + + jobTracker + yarnRM + + + nameNode + hdfs://nameservice1 + + + oozie.use.system.libpath + true + + + oozie.action.sharelib.for.spark + spark2 + + \ No newline at end of file diff --git a/dhp-workflows/dhp-dedup-openaire/src/main/resources/eu/dnetlib/dhp/oa/dedup/neworgs/oozie_app/workflow.xml b/dhp-workflows/dhp-dedup-openaire/src/main/resources/eu/dnetlib/dhp/oa/dedup/neworgs/oozie_app/workflow.xml new file mode 100644 index 000000000..9bfdaaebd --- /dev/null +++ b/dhp-workflows/dhp-dedup-openaire/src/main/resources/eu/dnetlib/dhp/oa/dedup/neworgs/oozie_app/workflow.xml @@ -0,0 +1,208 @@ + + + + graphBasePath + the raw graph base path + + + isLookUpUrl + the address of the lookUp service + + + actionSetId + id of the actionSet + + + workingPath + path for the working directory + + + dedupGraphPath + path for the output graph + + + cutConnectedComponent + max number of elements in a connected component + + + dbUrl + the url of the database + + + dbUser + the user of the database + + + dbTable + the name of the table in the database + + + dbPwd + the passowrd of the user of the database + + + sparkDriverMemory + memory for driver process + + + sparkExecutorMemory + memory for individual executor + + + sparkExecutorCores + number of cores used by single executor + + + oozieActionShareLibForSpark2 + oozie action sharelib for spark 2.* + + + spark2ExtraListeners + com.cloudera.spark.lineage.NavigatorAppListener + spark 2.* extra listeners classname + + + spark2SqlQueryExecutionListeners + com.cloudera.spark.lineage.NavigatorQueryListener + spark 2.* sql query execution listeners classname + + + spark2YarnHistoryServerAddress + spark 2.* yarn history server address + + + spark2EventLogDir + spark 2.* event log dir location + + + + + ${jobTracker} + ${nameNode} + + + mapreduce.job.queuename + ${queueName} + + + oozie.launcher.mapred.job.queue.name + ${oozieLauncherQueueName} + + + oozie.action.sharelib.for.spark + ${oozieActionShareLibForSpark2} + + + + + + + + Action failed, error message[${wf:errorMessage(wf:lastErrorNode())}] + + + + + + + + + + + + + -pb + ${graphBasePath}/relation + ${workingPath}/${actionSetId}/organization_simrel + + + + + + + + yarn + cluster + Create Similarity Relations + eu.dnetlib.dhp.oa.dedup.SparkCreateSimRels + dhp-dedup-openaire-${projectVersion}.jar + + --executor-memory=${sparkExecutorMemory} + --executor-cores=${sparkExecutorCores} + --driver-memory=${sparkDriverMemory} + --conf spark.extraListeners=${spark2ExtraListeners} + --conf spark.sql.queryExecutionListeners=${spark2SqlQueryExecutionListeners} + --conf spark.yarn.historyServer.address=${spark2YarnHistoryServerAddress} + --conf spark.eventLog.dir=${nameNode}${spark2EventLogDir} + --conf spark.sql.shuffle.partitions=3840 + + --graphBasePath${graphBasePath} + --isLookUpUrl${isLookUpUrl} + --actionSetId${actionSetId} + --workingPath${workingPath} + --numPartitions8000 + + + + + + + + yarn + cluster + Create Merge Relations + eu.dnetlib.dhp.oa.dedup.SparkCreateMergeRels + dhp-dedup-openaire-${projectVersion}.jar + + --executor-memory=${sparkExecutorMemory} + --executor-cores=${sparkExecutorCores} + --driver-memory=${sparkDriverMemory} + --conf spark.extraListeners=${spark2ExtraListeners} + --conf spark.sql.queryExecutionListeners=${spark2SqlQueryExecutionListeners} + --conf spark.yarn.historyServer.address=${spark2YarnHistoryServerAddress} + --conf spark.eventLog.dir=${nameNode}${spark2EventLogDir} + --conf spark.sql.shuffle.partitions=3840 + + --graphBasePath${graphBasePath} + --workingPath${workingPath} + --isLookUpUrl${isLookUpUrl} + --actionSetId${actionSetId} + --cutConnectedComponent${cutConnectedComponent} + + + + + + + + yarn + cluster + Prepare New Organizations + eu.dnetlib.dhp.oa.dedup.SparkPrepareNewOrgs + dhp-dedup-openaire-${projectVersion}.jar + + --executor-memory=${sparkExecutorMemory} + --executor-cores=${sparkExecutorCores} + --driver-memory=${sparkDriverMemory} + --conf spark.extraListeners=${spark2ExtraListeners} + --conf spark.sql.queryExecutionListeners=${spark2SqlQueryExecutionListeners} + --conf spark.yarn.historyServer.address=${spark2YarnHistoryServerAddress} + --conf spark.eventLog.dir=${nameNode}${spark2EventLogDir} + --conf spark.sql.shuffle.partitions=3840 + + --graphBasePath${graphBasePath} + --workingPath${workingPath} + --isLookUpUrl${isLookUpUrl} + --actionSetId${actionSetId} + --dbUrl${dbUrl} + --dbTable${dbTable} + --dbUser${dbUser} + --dbPwd${dbPwd} + --numConnections20 + + + + + + + \ No newline at end of file diff --git a/dhp-workflows/dhp-dedup-openaire/src/main/resources/eu/dnetlib/dhp/oa/dedup/prepareNewOrgs_parameters.json b/dhp-workflows/dhp-dedup-openaire/src/main/resources/eu/dnetlib/dhp/oa/dedup/prepareNewOrgs_parameters.json new file mode 100644 index 000000000..2119cbc3a --- /dev/null +++ b/dhp-workflows/dhp-dedup-openaire/src/main/resources/eu/dnetlib/dhp/oa/dedup/prepareNewOrgs_parameters.json @@ -0,0 +1,56 @@ +[ + { + "paramName": "i", + "paramLongName": "graphBasePath", + "paramDescription": "the base path of raw graph", + "paramRequired": true + }, + { + "paramName": "w", + "paramLongName": "workingPath", + "paramDescription": "the working directory path", + "paramRequired": true + }, + { + "paramName": "la", + "paramLongName": "isLookUpUrl", + "paramDescription": "the url of the lookup service", + "paramRequired": true + }, + { + "paramName": "asi", + "paramLongName": "actionSetId", + "paramDescription": "the id of the actionset (orchestrator)", + "paramRequired": true + }, + { + "paramName": "nc", + "paramLongName": "numConnections", + "paramDescription": "number of connections to the postgres db (for the write operation)", + "paramRequired": false + }, + { + "paramName": "du", + "paramLongName": "dbUrl", + "paramDescription": "the url of the database", + "paramRequired": true + }, + { + "paramName": "dusr", + "paramLongName": "dbUser", + "paramDescription": "the user of the database", + "paramRequired": true + }, + { + "paramName": "t", + "paramLongName": "dbTable", + "paramDescription": "the name of the table in the database", + "paramRequired": true + }, + { + "paramName": "dpwd", + "paramLongName": "dbPwd", + "paramDescription": "the password for the user of the database", + "paramRequired": true + } +] \ No newline at end of file diff --git a/dhp-workflows/dhp-dedup-openaire/src/test/java/eu/dnetlib/dhp/oa/dedup/SparkDedupTest.java b/dhp-workflows/dhp-dedup-openaire/src/test/java/eu/dnetlib/dhp/oa/dedup/SparkDedupTest.java index d9b5e30eb..6516eda52 100644 --- a/dhp-workflows/dhp-dedup-openaire/src/test/java/eu/dnetlib/dhp/oa/dedup/SparkDedupTest.java +++ b/dhp-workflows/dhp-dedup-openaire/src/test/java/eu/dnetlib/dhp/oa/dedup/SparkDedupTest.java @@ -223,11 +223,11 @@ public class SparkDedupTest implements Serializable { }); new SparkCollectSimRels( - parser, - spark, - spark.read().load(testDedupAssertionsBasePath + "/similarity_groups"), - spark.read().load(testDedupAssertionsBasePath + "/groups")) - .run(isLookUpService); + parser, + spark, + spark.read().load(testDedupAssertionsBasePath + "/similarity_groups"), + spark.read().load(testDedupAssertionsBasePath + "/groups")) + .run(isLookUpService); long orgs_simrel = spark .read() From 70933554874d5a69f4652ef621453e5930259028 Mon Sep 17 00:00:00 2001 From: miconis Date: Tue, 6 Oct 2020 16:21:34 +0200 Subject: [PATCH 07/12] bug fix and minor changes --- .../dhp/oa/dedup/DedupRecordFactory.java | 6 +-- .../eu/dnetlib/dhp/oa/dedup/DedupUtility.java | 11 ------ .../eu/dnetlib/dhp/oa/dedup/IdGenerator.java | 7 ++-- .../eu/dnetlib/dhp/oa/dedup/Identifier.java | 37 ++++++++++--------- .../java/eu/dnetlib/dhp/oa/dedup/PidType.java | 2 +- .../oa/dedup/graph/ConnectedComponent.java | 3 +- 6 files changed, 27 insertions(+), 39 deletions(-) diff --git a/dhp-workflows/dhp-dedup-openaire/src/main/java/eu/dnetlib/dhp/oa/dedup/DedupRecordFactory.java b/dhp-workflows/dhp-dedup-openaire/src/main/java/eu/dnetlib/dhp/oa/dedup/DedupRecordFactory.java index 50dda887b..fd37b75ee 100644 --- a/dhp-workflows/dhp-dedup-openaire/src/main/java/eu/dnetlib/dhp/oa/dedup/DedupRecordFactory.java +++ b/dhp-workflows/dhp-dedup-openaire/src/main/java/eu/dnetlib/dhp/oa/dedup/DedupRecordFactory.java @@ -1,11 +1,8 @@ package eu.dnetlib.dhp.oa.dedup; -import java.text.ParseException; -import java.text.SimpleDateFormat; import java.util.*; -import org.apache.commons.lang.StringUtils; import org.apache.spark.api.java.function.MapFunction; import org.apache.spark.api.java.function.MapGroupsFunction; import org.apache.spark.sql.Dataset; @@ -18,7 +15,6 @@ import com.fasterxml.jackson.databind.DeserializationFeature; import com.fasterxml.jackson.databind.ObjectMapper; import com.google.common.collect.Lists; -import eu.dnetlib.dhp.schema.common.EntityType; import eu.dnetlib.dhp.schema.common.ModelSupport; import eu.dnetlib.dhp.schema.oaf.*; import scala.Tuple2; @@ -90,7 +86,7 @@ public class DedupRecordFactory { T duplicate = t._2(); // prepare the list of pids to use for the id generation - bestPids.addAll(IdGenerator.bestPidtoIdentifier(duplicate)); + bestPids.addAll(IdGenerator.bestPidToIdentifier(duplicate)); entity.mergeFrom(duplicate); if (ModelSupport.isSubClass(duplicate, Result.class)) { diff --git a/dhp-workflows/dhp-dedup-openaire/src/main/java/eu/dnetlib/dhp/oa/dedup/DedupUtility.java b/dhp-workflows/dhp-dedup-openaire/src/main/java/eu/dnetlib/dhp/oa/dedup/DedupUtility.java index 01065510a..a44d51af3 100644 --- a/dhp-workflows/dhp-dedup-openaire/src/main/java/eu/dnetlib/dhp/oa/dedup/DedupUtility.java +++ b/dhp-workflows/dhp-dedup-openaire/src/main/java/eu/dnetlib/dhp/oa/dedup/DedupUtility.java @@ -70,17 +70,6 @@ public class DedupUtility { return Sets.newHashSet(BlacklistAwareClusteringCombiner.filterAndCombine(doc, conf)); } - public static String md5(final String s) { - try { - final MessageDigest md = MessageDigest.getInstance("MD5"); - md.update(s.getBytes(StandardCharsets.UTF_8)); - return new String(Hex.encodeHex(md.digest())); - } catch (final Exception e) { - System.err.println("Error creating id"); - return null; - } - } - public static String createDedupRecordPath( final String basePath, final String actionSetId, final String entityType) { return String.format("%s/%s/%s_deduprecord", basePath, actionSetId, entityType); diff --git a/dhp-workflows/dhp-dedup-openaire/src/main/java/eu/dnetlib/dhp/oa/dedup/IdGenerator.java b/dhp-workflows/dhp-dedup-openaire/src/main/java/eu/dnetlib/dhp/oa/dedup/IdGenerator.java index 2916e063d..b2b81f4cb 100644 --- a/dhp-workflows/dhp-dedup-openaire/src/main/java/eu/dnetlib/dhp/oa/dedup/IdGenerator.java +++ b/dhp-workflows/dhp-dedup-openaire/src/main/java/eu/dnetlib/dhp/oa/dedup/IdGenerator.java @@ -6,6 +6,7 @@ import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.*; +import eu.dnetlib.dhp.utils.DHPUtils; import org.apache.commons.lang.NullArgumentException; import org.apache.commons.lang.StringUtils; @@ -34,17 +35,17 @@ public class IdGenerator implements Serializable { if (bp.get().isUseOriginal() || bp.get().getPid().getValue() == null) { return bp.get().getOriginalID().split("\\|")[0] + "|dedup_wf_001::" - + DedupUtility.md5(bp.get().getOriginalID()); + + DHPUtils.md5(bp.get().getOriginalID()); } else { return bp.get().getOriginalID().split("\\|")[0] + "|" + createPrefix(bp.get().getPid().getQualifier().getClassid()) + "::" - + DedupUtility.md5(bp.get().getPid().getValue()); + + DHPUtils.md5(bp.get().getPid().getValue()); } } // pick the best pid from the entity. Returns a list (length 1) to save time in the call - public static List bestPidtoIdentifier(T entity) { + public static List bestPidToIdentifier(T entity) { if (entity.getPid() == null || entity.getPid().size() == 0) return Lists diff --git a/dhp-workflows/dhp-dedup-openaire/src/main/java/eu/dnetlib/dhp/oa/dedup/Identifier.java b/dhp-workflows/dhp-dedup-openaire/src/main/java/eu/dnetlib/dhp/oa/dedup/Identifier.java index 480b52341..65441c585 100644 --- a/dhp-workflows/dhp-dedup-openaire/src/main/java/eu/dnetlib/dhp/oa/dedup/Identifier.java +++ b/dhp-workflows/dhp-dedup-openaire/src/main/java/eu/dnetlib/dhp/oa/dedup/Identifier.java @@ -4,6 +4,8 @@ package eu.dnetlib.dhp.oa.dedup; import java.io.Serializable; import java.util.Date; import java.util.List; +import java.util.Set; +import java.util.stream.Collectors; import eu.dnetlib.dhp.schema.common.EntityType; import eu.dnetlib.dhp.schema.oaf.KeyValue; @@ -35,7 +37,7 @@ public class Identifier implements Serializable, Comparable { return pid; } - public void setPid(StructuredProperty pidValue) { + public void setPid(StructuredProperty pid) { this.pid = pid; } @@ -91,25 +93,29 @@ public class Identifier implements Serializable, Comparable { public int compareTo(Identifier i) { // priority in comparisons: 1) pidtype, 2) collectedfrom (depending on the entity type) , 3) date 4) // alphabetical order of the originalID + + Set lKeys = this.collectedFrom.stream().map(KeyValue::getKey).collect(Collectors.toSet()); + Set rKeys = i.getCollectedFrom().stream().map(KeyValue::getKey).collect(Collectors.toSet()); + if (this.getType().compareTo(i.getType()) == 0) { // same type if (entityType == EntityType.publication) { - if (isFromDatasourceID(this.collectedFrom, IdGenerator.CROSSREF_ID) - && !isFromDatasourceID(i.collectedFrom, IdGenerator.CROSSREF_ID)) + if (isFromDatasourceID(lKeys, IdGenerator.CROSSREF_ID) + && !isFromDatasourceID(rKeys, IdGenerator.CROSSREF_ID)) return 1; - if (isFromDatasourceID(i.collectedFrom, IdGenerator.CROSSREF_ID) - && !isFromDatasourceID(this.collectedFrom, IdGenerator.CROSSREF_ID)) + if (isFromDatasourceID(rKeys, IdGenerator.CROSSREF_ID) + && !isFromDatasourceID(lKeys, IdGenerator.CROSSREF_ID)) return -1; } if (entityType == EntityType.dataset) { - if (isFromDatasourceID(this.collectedFrom, IdGenerator.DATACITE_ID) - && !isFromDatasourceID(i.collectedFrom, IdGenerator.DATACITE_ID)) + if (isFromDatasourceID(lKeys, IdGenerator.DATACITE_ID) + && !isFromDatasourceID(rKeys, IdGenerator.DATACITE_ID)) return 1; - if (isFromDatasourceID(i.collectedFrom, IdGenerator.DATACITE_ID) - && !isFromDatasourceID(this.collectedFrom, IdGenerator.DATACITE_ID)) + if (isFromDatasourceID(rKeys, IdGenerator.DATACITE_ID) + && !isFromDatasourceID(lKeys, IdGenerator.DATACITE_ID)) return -1; } - if (this.getDate().compareTo(date) == 0) {// same date + if (this.getDate().compareTo(i.getDate()) == 0) {// same date if (this.originalID.compareTo(i.originalID) > 0) this.useOriginal = true; @@ -120,19 +126,14 @@ public class Identifier implements Serializable, Comparable { return -this.originalID.compareTo(i.originalID); } else // the minus is because we need to take the elder date - return -this.getDate().compareTo(date); + return -this.getDate().compareTo(i.getDate()); } else { return this.getType().compareTo(i.getType()); } } - public boolean isFromDatasourceID(List collectedFrom, String dsId) { - - for (KeyValue cf : collectedFrom) { - if (cf.getKey().equals(dsId)) - return true; - } - return false; + public boolean isFromDatasourceID(Set collectedFrom, String dsId) { + return collectedFrom.contains(dsId); } } diff --git a/dhp-workflows/dhp-dedup-openaire/src/main/java/eu/dnetlib/dhp/oa/dedup/PidType.java b/dhp-workflows/dhp-dedup-openaire/src/main/java/eu/dnetlib/dhp/oa/dedup/PidType.java index c3241bac6..d644e689b 100644 --- a/dhp-workflows/dhp-dedup-openaire/src/main/java/eu/dnetlib/dhp/oa/dedup/PidType.java +++ b/dhp-workflows/dhp-dedup-openaire/src/main/java/eu/dnetlib/dhp/oa/dedup/PidType.java @@ -4,7 +4,7 @@ package eu.dnetlib.dhp.oa.dedup; public enum PidType { // from the less to the more important - undefined, original, orcid, ror, grid, pdb, arXiv, pmid, doi; + undefined, original, orcid, ror, grid, pdb, arXiv, pmid, pmc, doi; public static PidType classidValueOf(String s) { try { diff --git a/dhp-workflows/dhp-dedup-openaire/src/main/java/eu/dnetlib/dhp/oa/dedup/graph/ConnectedComponent.java b/dhp-workflows/dhp-dedup-openaire/src/main/java/eu/dnetlib/dhp/oa/dedup/graph/ConnectedComponent.java index cd4f99f63..3d0d24d23 100644 --- a/dhp-workflows/dhp-dedup-openaire/src/main/java/eu/dnetlib/dhp/oa/dedup/graph/ConnectedComponent.java +++ b/dhp-workflows/dhp-dedup-openaire/src/main/java/eu/dnetlib/dhp/oa/dedup/graph/ConnectedComponent.java @@ -6,6 +6,7 @@ import java.io.Serializable; import java.util.Set; import java.util.stream.Collectors; +import eu.dnetlib.dhp.utils.DHPUtils; import org.apache.commons.lang.StringUtils; import org.codehaus.jackson.annotate.JsonIgnore; @@ -36,7 +37,7 @@ public class ConnectedComponent implements Serializable { if (docIds.size() > 1) { final String s = getMin(); String prefix = s.split("\\|")[0]; - ccId = prefix + "|dedup_wf_001::" + DedupUtility.md5(s); + ccId = prefix + "|dedup_wf_001::" + DHPUtils.md5(s); return ccId; } else { return docIds.iterator().next(); From 1804c5d809e6d72fd406151cfe6a1cd5d3808f4f Mon Sep 17 00:00:00 2001 From: miconis Date: Tue, 6 Oct 2020 16:44:51 +0200 Subject: [PATCH 08/12] refactoring: classes moved in the right package --- .../main/java/eu/dnetlib/dhp/oa/dedup/DedupRecordFactory.java | 1 + .../src/main/java/eu/dnetlib/dhp/oa/dedup/IdGenerator.java | 3 ++- .../main/java/eu/dnetlib/dhp/oa/dedup/SparkPrepareNewOrgs.java | 1 + .../main/java/eu/dnetlib/dhp/oa/dedup/SparkPrepareOrgRels.java | 1 + .../java/eu/dnetlib/dhp/oa/dedup/{ => model}/Identifier.java | 3 ++- .../java/eu/dnetlib/dhp/oa/dedup/{ => model}/OrgSimRel.java | 2 +- .../main/java/eu/dnetlib/dhp/oa/dedup/{ => model}/PidType.java | 2 +- 7 files changed, 9 insertions(+), 4 deletions(-) rename dhp-workflows/dhp-dedup-openaire/src/main/java/eu/dnetlib/dhp/oa/dedup/{ => model}/Identifier.java (97%) rename dhp-workflows/dhp-dedup-openaire/src/main/java/eu/dnetlib/dhp/oa/dedup/{ => model}/OrgSimRel.java (98%) rename dhp-workflows/dhp-dedup-openaire/src/main/java/eu/dnetlib/dhp/oa/dedup/{ => model}/PidType.java (88%) diff --git a/dhp-workflows/dhp-dedup-openaire/src/main/java/eu/dnetlib/dhp/oa/dedup/DedupRecordFactory.java b/dhp-workflows/dhp-dedup-openaire/src/main/java/eu/dnetlib/dhp/oa/dedup/DedupRecordFactory.java index fd37b75ee..d488f4340 100644 --- a/dhp-workflows/dhp-dedup-openaire/src/main/java/eu/dnetlib/dhp/oa/dedup/DedupRecordFactory.java +++ b/dhp-workflows/dhp-dedup-openaire/src/main/java/eu/dnetlib/dhp/oa/dedup/DedupRecordFactory.java @@ -3,6 +3,7 @@ package eu.dnetlib.dhp.oa.dedup; import java.util.*; +import eu.dnetlib.dhp.oa.dedup.model.Identifier; import org.apache.spark.api.java.function.MapFunction; import org.apache.spark.api.java.function.MapGroupsFunction; import org.apache.spark.sql.Dataset; diff --git a/dhp-workflows/dhp-dedup-openaire/src/main/java/eu/dnetlib/dhp/oa/dedup/IdGenerator.java b/dhp-workflows/dhp-dedup-openaire/src/main/java/eu/dnetlib/dhp/oa/dedup/IdGenerator.java index b2b81f4cb..2831ab5d0 100644 --- a/dhp-workflows/dhp-dedup-openaire/src/main/java/eu/dnetlib/dhp/oa/dedup/IdGenerator.java +++ b/dhp-workflows/dhp-dedup-openaire/src/main/java/eu/dnetlib/dhp/oa/dedup/IdGenerator.java @@ -6,8 +6,9 @@ import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.*; +import eu.dnetlib.dhp.oa.dedup.model.Identifier; +import eu.dnetlib.dhp.oa.dedup.model.PidType; import eu.dnetlib.dhp.utils.DHPUtils; -import org.apache.commons.lang.NullArgumentException; import org.apache.commons.lang.StringUtils; import com.google.common.collect.Lists; diff --git a/dhp-workflows/dhp-dedup-openaire/src/main/java/eu/dnetlib/dhp/oa/dedup/SparkPrepareNewOrgs.java b/dhp-workflows/dhp-dedup-openaire/src/main/java/eu/dnetlib/dhp/oa/dedup/SparkPrepareNewOrgs.java index beb4dbad7..ea6e6db82 100644 --- a/dhp-workflows/dhp-dedup-openaire/src/main/java/eu/dnetlib/dhp/oa/dedup/SparkPrepareNewOrgs.java +++ b/dhp-workflows/dhp-dedup-openaire/src/main/java/eu/dnetlib/dhp/oa/dedup/SparkPrepareNewOrgs.java @@ -5,6 +5,7 @@ import java.io.IOException; import java.util.Optional; import java.util.Properties; +import eu.dnetlib.dhp.oa.dedup.model.OrgSimRel; import org.apache.commons.io.IOUtils; import org.apache.spark.SparkConf; import org.apache.spark.api.java.function.FilterFunction; diff --git a/dhp-workflows/dhp-dedup-openaire/src/main/java/eu/dnetlib/dhp/oa/dedup/SparkPrepareOrgRels.java b/dhp-workflows/dhp-dedup-openaire/src/main/java/eu/dnetlib/dhp/oa/dedup/SparkPrepareOrgRels.java index 5e0081d72..4a3ce80df 100644 --- a/dhp-workflows/dhp-dedup-openaire/src/main/java/eu/dnetlib/dhp/oa/dedup/SparkPrepareOrgRels.java +++ b/dhp-workflows/dhp-dedup-openaire/src/main/java/eu/dnetlib/dhp/oa/dedup/SparkPrepareOrgRels.java @@ -7,6 +7,7 @@ import java.util.List; import java.util.Optional; import java.util.Properties; +import eu.dnetlib.dhp.oa.dedup.model.OrgSimRel; import org.apache.commons.io.IOUtils; import org.apache.http.client.methods.CloseableHttpResponse; import org.apache.http.client.methods.HttpGet; diff --git a/dhp-workflows/dhp-dedup-openaire/src/main/java/eu/dnetlib/dhp/oa/dedup/Identifier.java b/dhp-workflows/dhp-dedup-openaire/src/main/java/eu/dnetlib/dhp/oa/dedup/model/Identifier.java similarity index 97% rename from dhp-workflows/dhp-dedup-openaire/src/main/java/eu/dnetlib/dhp/oa/dedup/Identifier.java rename to dhp-workflows/dhp-dedup-openaire/src/main/java/eu/dnetlib/dhp/oa/dedup/model/Identifier.java index 65441c585..30b1582f7 100644 --- a/dhp-workflows/dhp-dedup-openaire/src/main/java/eu/dnetlib/dhp/oa/dedup/Identifier.java +++ b/dhp-workflows/dhp-dedup-openaire/src/main/java/eu/dnetlib/dhp/oa/dedup/model/Identifier.java @@ -1,5 +1,5 @@ -package eu.dnetlib.dhp.oa.dedup; +package eu.dnetlib.dhp.oa.dedup.model; import java.io.Serializable; import java.util.Date; @@ -7,6 +7,7 @@ import java.util.List; import java.util.Set; import java.util.stream.Collectors; +import eu.dnetlib.dhp.oa.dedup.IdGenerator; import eu.dnetlib.dhp.schema.common.EntityType; import eu.dnetlib.dhp.schema.oaf.KeyValue; import eu.dnetlib.dhp.schema.oaf.StructuredProperty; diff --git a/dhp-workflows/dhp-dedup-openaire/src/main/java/eu/dnetlib/dhp/oa/dedup/OrgSimRel.java b/dhp-workflows/dhp-dedup-openaire/src/main/java/eu/dnetlib/dhp/oa/dedup/model/OrgSimRel.java similarity index 98% rename from dhp-workflows/dhp-dedup-openaire/src/main/java/eu/dnetlib/dhp/oa/dedup/OrgSimRel.java rename to dhp-workflows/dhp-dedup-openaire/src/main/java/eu/dnetlib/dhp/oa/dedup/model/OrgSimRel.java index 84dfecd62..50164ce4c 100644 --- a/dhp-workflows/dhp-dedup-openaire/src/main/java/eu/dnetlib/dhp/oa/dedup/OrgSimRel.java +++ b/dhp-workflows/dhp-dedup-openaire/src/main/java/eu/dnetlib/dhp/oa/dedup/model/OrgSimRel.java @@ -1,5 +1,5 @@ -package eu.dnetlib.dhp.oa.dedup; +package eu.dnetlib.dhp.oa.dedup.model; import java.io.Serializable; diff --git a/dhp-workflows/dhp-dedup-openaire/src/main/java/eu/dnetlib/dhp/oa/dedup/PidType.java b/dhp-workflows/dhp-dedup-openaire/src/main/java/eu/dnetlib/dhp/oa/dedup/model/PidType.java similarity index 88% rename from dhp-workflows/dhp-dedup-openaire/src/main/java/eu/dnetlib/dhp/oa/dedup/PidType.java rename to dhp-workflows/dhp-dedup-openaire/src/main/java/eu/dnetlib/dhp/oa/dedup/model/PidType.java index d644e689b..cb9b2bd15 100644 --- a/dhp-workflows/dhp-dedup-openaire/src/main/java/eu/dnetlib/dhp/oa/dedup/PidType.java +++ b/dhp-workflows/dhp-dedup-openaire/src/main/java/eu/dnetlib/dhp/oa/dedup/model/PidType.java @@ -1,5 +1,5 @@ -package eu.dnetlib.dhp.oa.dedup; +package eu.dnetlib.dhp.oa.dedup.model; public enum PidType { From 6f8720982c7f994f8dd86d1b9a905bae298d7146 Mon Sep 17 00:00:00 2001 From: miconis Date: Fri, 9 Oct 2020 09:30:23 +0200 Subject: [PATCH 09/12] bug fix in the idgenerator and test implementation --- .../dhp/oa/dedup/DedupRecordFactory.java | 1 - .../eu/dnetlib/dhp/oa/dedup/IdGenerator.java | 32 ++-- .../dhp/oa/dedup/model/Identifier.java | 2 +- .../dnetlib/dhp/oa/dedup/IdGeneratorTest.java | 140 ++++++++++++++++++ .../dedup/json/publication_idgeneration.json | 3 + 5 files changed, 165 insertions(+), 13 deletions(-) create mode 100644 dhp-workflows/dhp-dedup-openaire/src/test/java/eu/dnetlib/dhp/oa/dedup/IdGeneratorTest.java create mode 100644 dhp-workflows/dhp-dedup-openaire/src/test/resources/eu/dnetlib/dhp/dedup/json/publication_idgeneration.json diff --git a/dhp-workflows/dhp-dedup-openaire/src/main/java/eu/dnetlib/dhp/oa/dedup/DedupRecordFactory.java b/dhp-workflows/dhp-dedup-openaire/src/main/java/eu/dnetlib/dhp/oa/dedup/DedupRecordFactory.java index d488f4340..2e4b219b5 100644 --- a/dhp-workflows/dhp-dedup-openaire/src/main/java/eu/dnetlib/dhp/oa/dedup/DedupRecordFactory.java +++ b/dhp-workflows/dhp-dedup-openaire/src/main/java/eu/dnetlib/dhp/oa/dedup/DedupRecordFactory.java @@ -1,4 +1,3 @@ - package eu.dnetlib.dhp.oa.dedup; import java.util.*; diff --git a/dhp-workflows/dhp-dedup-openaire/src/main/java/eu/dnetlib/dhp/oa/dedup/IdGenerator.java b/dhp-workflows/dhp-dedup-openaire/src/main/java/eu/dnetlib/dhp/oa/dedup/IdGenerator.java index 2831ab5d0..7980d8e69 100644 --- a/dhp-workflows/dhp-dedup-openaire/src/main/java/eu/dnetlib/dhp/oa/dedup/IdGenerator.java +++ b/dhp-workflows/dhp-dedup-openaire/src/main/java/eu/dnetlib/dhp/oa/dedup/IdGenerator.java @@ -24,6 +24,7 @@ public class IdGenerator implements Serializable { public static String CROSSREF_ID = "10|openaire____::081b82f96300b6a6e3d282bad31cb6e2"; public static String DATACITE_ID = "10|openaire____::9e3be59865b2c1c335d32dae2fe7b254"; + public static String BASE_DATE = "2000-01-01"; // pick the best pid from the list (consider date and pidtype) public static String generate(List pids, String defaultID) { @@ -45,14 +46,27 @@ public class IdGenerator implements Serializable { } + public static ArrayList createBasePid(T entity, SimpleDateFormat sdf) { + + Date date; + try { + date = sdf.parse(BASE_DATE); + } catch (ParseException e) { + date = new Date(); + } + return Lists + .newArrayList( + new Identifier(new StructuredProperty(), date, PidType.original, entity.getCollectedfrom(), + EntityType.fromClass(entity.getClass()), entity.getId())); + } + // pick the best pid from the entity. Returns a list (length 1) to save time in the call public static List bestPidToIdentifier(T entity) { + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); + if (entity.getPid() == null || entity.getPid().size() == 0) - return Lists - .newArrayList( - new Identifier(new StructuredProperty(), new Date(), PidType.original, entity.getCollectedfrom(), - EntityType.fromClass(entity.getClass()), entity.getId())); + return createBasePid(entity, sdf); Optional bp = entity .getPid() @@ -64,14 +78,10 @@ public class IdGenerator implements Serializable { .map( structuredProperty -> Lists .newArrayList( - new Identifier(structuredProperty, extractDate(entity, new SimpleDateFormat("yyyy-MM-dd")), + new Identifier(structuredProperty, extractDate(entity, sdf), PidType.classidValueOf(structuredProperty.getQualifier().getClassid()), entity.getCollectedfrom(), EntityType.fromClass(entity.getClass()), entity.getId()))) - .orElseGet( - () -> Lists - .newArrayList( - new Identifier(new StructuredProperty(), new Date(), PidType.original, - entity.getCollectedfrom(), EntityType.fromClass(entity.getClass()), entity.getId()))); + .orElseGet(() -> createBasePid(entity, sdf)); } @@ -91,7 +101,7 @@ public class IdGenerator implements Serializable { // 00-01-01 public static Date extractDate(T duplicate, SimpleDateFormat sdf) { - String date = "2000-01-01"; + String date = BASE_DATE; if (ModelSupport.isSubClass(duplicate, Result.class)) { Result result = (Result) duplicate; if (isWellformed(result.getDateofacceptance())) { diff --git a/dhp-workflows/dhp-dedup-openaire/src/main/java/eu/dnetlib/dhp/oa/dedup/model/Identifier.java b/dhp-workflows/dhp-dedup-openaire/src/main/java/eu/dnetlib/dhp/oa/dedup/model/Identifier.java index 30b1582f7..95fd21c64 100644 --- a/dhp-workflows/dhp-dedup-openaire/src/main/java/eu/dnetlib/dhp/oa/dedup/model/Identifier.java +++ b/dhp-workflows/dhp-dedup-openaire/src/main/java/eu/dnetlib/dhp/oa/dedup/model/Identifier.java @@ -118,7 +118,7 @@ public class Identifier implements Serializable, Comparable { if (this.getDate().compareTo(i.getDate()) == 0) {// same date - if (this.originalID.compareTo(i.originalID) > 0) + if (this.originalID.compareTo(i.originalID) < 0) this.useOriginal = true; else i.setUseOriginal(true); diff --git a/dhp-workflows/dhp-dedup-openaire/src/test/java/eu/dnetlib/dhp/oa/dedup/IdGeneratorTest.java b/dhp-workflows/dhp-dedup-openaire/src/test/java/eu/dnetlib/dhp/oa/dedup/IdGeneratorTest.java new file mode 100644 index 000000000..1bf851527 --- /dev/null +++ b/dhp-workflows/dhp-dedup-openaire/src/test/java/eu/dnetlib/dhp/oa/dedup/IdGeneratorTest.java @@ -0,0 +1,140 @@ +package eu.dnetlib.dhp.oa.dedup; + +import com.google.common.collect.Lists; +import eu.dnetlib.dhp.oa.dedup.model.Identifier; +import eu.dnetlib.dhp.oa.dedup.model.PidType; +import eu.dnetlib.dhp.schema.common.EntityType; +import eu.dnetlib.dhp.schema.oaf.KeyValue; +import eu.dnetlib.dhp.schema.oaf.Publication; +import eu.dnetlib.dhp.schema.oaf.Qualifier; +import eu.dnetlib.dhp.schema.oaf.StructuredProperty; +import eu.dnetlib.pace.util.MapDocumentUtil; +import org.codehaus.jackson.map.ObjectMapper; +import org.junit.jupiter.api.*; +import scala.Tuple2; +import static org.junit.jupiter.api.Assertions.assertEquals; + +import java.io.BufferedReader; +import java.io.FileReader; +import java.io.IOException; +import java.nio.file.Paths; +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.Date; +import java.util.List; + +@TestMethodOrder(MethodOrderer.OrderAnnotation.class) +public class IdGeneratorTest { + + private static List bestIds; + private static List> pubs; + + private static List bestIds2; + private static List bestIds3; + + private static String testEntityBasePath; + + private static SimpleDateFormat sdf; + private static Date baseDate; + + @BeforeAll + public static void setUp() throws Exception { + + sdf = new SimpleDateFormat("yyyy-MM-dd"); + baseDate = sdf.parse("2000-01-01"); + + bestIds = new ArrayList<>(); + bestIds2 = Lists.newArrayList( + new Identifier(pid("pid1", "original", "original"), baseDate, PidType.original, keyValue("key", "value"), EntityType.publication, "50|originalID1"), + new Identifier(pid("pid2", "original", "original"), baseDate, PidType.original, keyValue("key", "value"), EntityType.publication, "50|originalID2"), + new Identifier(pid("pid3", "original", "original"), baseDate, PidType.original, keyValue("key", "value"), EntityType.publication, "50|originalID3") + ); + bestIds3 = Lists.newArrayList( + new Identifier(pid("pid1", "original", "original"), baseDate, PidType.original, keyValue("key", "value"), EntityType.publication, "50|originalID1"), + new Identifier(pid("pid2", "doi", "doi"), baseDate, PidType.doi, keyValue("key", "value"), EntityType.publication, "50|originalID2"), + new Identifier(pid("pid3", "original", "original"), baseDate, PidType.original, keyValue("key", "value"), EntityType.publication, "50|originalID3") + ); + + testEntityBasePath = Paths + .get(SparkDedupTest.class.getResource("/eu/dnetlib/dhp/dedup/json").toURI()) + .toFile() + .getAbsolutePath(); + + pubs = readSample(testEntityBasePath + "/publication_idgeneration.json", Publication.class); + + } + + @Test + @Order(1) + public void bestPidToIdentifierTest(){ + + List typesForAssertions = Lists.newArrayList(PidType.pmc.toString(), PidType.doi.toString(), PidType.doi.toString()); + + for (Tuple2 pub : pubs) { + List ids = IdGenerator.bestPidToIdentifier(pub._2()); + assertEquals(typesForAssertions.get(pubs.indexOf(pub)), ids.get(0).getPid().getQualifier().getClassid()); + bestIds.addAll(ids); + } + } + + @Test + @Order(2) + public void generateIdTest1(){ + String id1 = IdGenerator.generate(bestIds, "50|defaultID"); + + assertEquals("50|dedup_doi___::84f2cc49e3af11f20952eae15cdae066", id1); + } + + @Test + public void generateIdTest2(){ + String id1 = IdGenerator.generate(bestIds2, "50|defaultID"); + String id2 = IdGenerator.generate(bestIds3, "50|defaultID"); + + assertEquals("50|dedup_wf_001::2c56cc1914bffdb30fdff354e0099612", id1); + assertEquals("50|dedup_doi___::128ead3ed8d9ecf262704b6fcf592b8d", id2); + } + + public static List> readSample(String path, Class clazz) { + List> res = new ArrayList<>(); + BufferedReader reader; + try { + reader = new BufferedReader(new FileReader(path)); + String line = reader.readLine(); + while (line != null) { + res + .add( + new Tuple2<>( + MapDocumentUtil.getJPathString("$.id", line), + new ObjectMapper().readValue(line, clazz))); + // read next line + line = reader.readLine(); + } + reader.close(); + } catch (IOException e) { + e.printStackTrace(); + } + + return res; + } + + public static StructuredProperty pid(String pid, String classid, String classname){ + + StructuredProperty sp = new StructuredProperty(); + sp.setValue(pid); + Qualifier q = new Qualifier(); + q.setSchemeid(classid); + q.setSchemename(classname); + q.setClassname(classname); + q.setClassid(classid); + sp.setQualifier(q); + return sp; + } + + public static List keyValue(String key, String value){ + + KeyValue kv = new KeyValue(); + kv.setKey(key); + kv.setValue(value); + return Lists.newArrayList(kv); + } +} diff --git a/dhp-workflows/dhp-dedup-openaire/src/test/resources/eu/dnetlib/dhp/dedup/json/publication_idgeneration.json b/dhp-workflows/dhp-dedup-openaire/src/test/resources/eu/dnetlib/dhp/dedup/json/publication_idgeneration.json new file mode 100644 index 000000000..b2300acc6 --- /dev/null +++ b/dhp-workflows/dhp-dedup-openaire/src/test/resources/eu/dnetlib/dhp/dedup/json/publication_idgeneration.json @@ -0,0 +1,3 @@ +{"context": [], "dataInfo": {"deletedbyinference": false, "provenanceaction": {"classid": "sysimport:crosswalk:datasetarchive", "classname": "sysimport:crosswalk:datasetarchive", "schemename": "dnet:provenanceActions", "schemeid": "dnet:provenanceActions"}, "inferred": false, "inferenceprovenance": "dedup-similarity-result-levenstein", "invisible": false, "trust": "0.95"}, "resourcetype": {"classid": "", "classname": "", "schemename": "", "schemeid": ""}, "pid": [{"dataInfo": {"deletedbyinference": false, "provenanceaction": {"classid": "", "classname": "", "schemename": "", "schemeid": ""}, "inferred": false, "inferenceprovenance": "", "invisible": false, "trust": ""}, "qualifier": {"classid": "arXiv", "classname": "arXiv", "schemename": "dnet:pid_types", "schemeid": "dnet:pid_types"}, "value": "arXivSampleID"} ,{"dataInfo": {"deletedbyinference": false, "provenanceaction": {"classid": "", "classname": "", "schemename": "", "schemeid": ""}, "inferred": false, "inferenceprovenance": "", "invisible": false, "trust": ""}, "qualifier": {"classid": "pmc", "classname": "pmc", "schemename": "dnet:pid_types", "schemeid": "dnet:pid_types"}, "value": "pmcsampleid"}], "contributor": [], "resulttype": {"classid": "publication", "classname": "publication", "schemename": "dnet:result_typologies", "schemeid": "dnet:result_typologies"}, "relevantdate": [], "collectedfrom": [{"dataInfo": {"deletedbyinference": false, "provenanceaction": {"classid": "", "classname": "", "schemename": "", "schemeid": ""}, "inferred": false, "inferenceprovenance": "", "invisible": false, "trust": ""}, "value": "Journal.fi", "key": "10|openaire____::6eef8049d0feedc089ee009abca55e35"}], "id": "50|a89337edbe55::4930db9e954866d70916cbfba9f81f97", "subject": [], "instance": [{"refereed": null, "hostedby": {"dataInfo": {"deletedbyinference": false, "provenanceaction": {"classid": "", "classname": "", "schemename": "", "schemeid": ""}, "inferred": false, "inferenceprovenance": "", "invisible": false, "trust": ""}, "value": "Journal.fi", "key": "10|openaire____::6eef8049d0feedc089ee009abca55e35"}, "processingchargeamount": {"dataInfo": {"deletedbyinference": false, "provenanceaction": {"classid": "", "classname": "", "schemename": "", "schemeid": ""}, "inferred": false, "inferenceprovenance": "", "invisible": false, "trust": ""}, "value": ""}, "license": {"dataInfo": {"deletedbyinference": false, "provenanceaction": {"classid": "", "classname": "", "schemename": "", "schemeid": ""}, "inferred": false, "inferenceprovenance": "", "invisible": false, "trust": ""}, "value": ""}, "url": [], "distributionlocation": "", "processingchargecurrency": {"dataInfo": {"deletedbyinference": false, "provenanceaction": {"classid": "", "classname": "", "schemename": "", "schemeid": ""}, "inferred": false, "inferenceprovenance": "", "invisible": false, "trust": ""}, "value": ""}, "dateofacceptance": {"dataInfo": {"deletedbyinference": false, "provenanceaction": {"classid": "", "classname": "", "schemename": "", "schemeid": ""}, "inferred": false, "inferenceprovenance": "", "invisible": false, "trust": ""}, "value": "2016-01-01"}, "collectedfrom": {"dataInfo": {"deletedbyinference": false, "provenanceaction": {"classid": "", "classname": "", "schemename": "", "schemeid": ""}, "inferred": false, "inferenceprovenance": "", "invisible": false, "trust": ""}, "value": "Journal.fi", "key": "10|openaire____::6eef8049d0feedc089ee009abca55e35"}, "accessright": {"classid": "OPEN", "classname": "Open Access", "schemename": "dnet:access_modes", "schemeid": "dnet:access_modes"}, "instancetype": {"classid": "0001", "classname": "Article", "schemename": "dnet:dataCite_resource", "schemeid": "dnet:dataCite_resource"}}], "embargoenddate": {"dataInfo": {"deletedbyinference": false, "provenanceaction": {"classid": "", "classname": "", "schemename": "", "schemeid": ""}, "inferred": false, "inferenceprovenance": "", "invisible": false, "trust": ""}, "value": ""}, "lastupdatetimestamp": 0, "author": [{"surname": "Go\\u0308tz", "name": "Julia", "pid": [], "rank": 5, "affiliation": [], "fullname": "G\\u00f6tz, Julia"}, {"surname": "Wolff", "name": "Stephan", "pid": [], "rank": 6, "affiliation": [], "fullname": "Wolff, Stephan"}, {"surname": "Jansen", "name": "Olav", "pid": [], "rank": 7, "affiliation": [], "fullname": "Jansen, Olav"}, {"surname": "Dressler", "name": "Dirk", "pid": [{"qualifier": {"classid": "ORCID", "classname": "ORCID"}, "value": "0000-0000-0656-9999"},{"qualifier": {"classid": "id", "classname": "id"}, "value": "987654321"}], "rank": 8, "affiliation": [], "fullname": "Dressler, Dirk"}, {"surname": "Schneider", "name": "Susanne A.", "pid": [], "rank": 9, "affiliation": [], "fullname": "Schneider, Susanne A."}], "source": [], "dateofcollection": "2019-11-05T14:49:22.351Z", "fulltext": [], "dateoftransformation": "2019-11-05T16:10:58.988Z", "description": [], "format": [], "journal": {"issnPrinted": "1459-6067", "conferencedate": "", "conferenceplace": "", "name": "Agricultural and Food Science", "edition": "", "iss": "3", "sp": "", "vol": "27", "dataInfo": {"deletedbyinference": false, "provenanceaction": {"classid": "", "classname": "", "schemename": "", "schemeid": ""}, "inferred": false, "inferenceprovenance": "", "invisible": false, "trust": ""}, "issnOnline": "1795-1895", "ep": "", "issnLinking": ""}, "coverage": [], "publisher": {"dataInfo": {"deletedbyinference": false, "provenanceaction": {"classid": "", "classname": "", "schemename": "", "schemeid": ""}, "inferred": false, "inferenceprovenance": "", "invisible": false, "trust": ""}, "value": ""}, "language": {"classid": "eng", "classname": "English", "schemename": "dnet:languages", "schemeid": "dnet:languages"}, "bestaccessright": {"classid": "OPEN", "classname": "Open Access", "schemename": "dnet:access_modes", "schemeid": "dnet:access_modes"}, "country": [], "extraInfo": [], "originalId": [], "dateofacceptance": {"dataInfo": {"deletedbyinference": false, "provenanceaction": {"classid": "", "classname": "", "schemename": "", "schemeid": ""}, "inferred": false, "inferenceprovenance": "", "invisible": false, "trust": ""}, "value": "2018-09-30"}, "title": [{"dataInfo": {"deletedbyinference": false, "provenanceaction": {"classid": "", "classname": "", "schemename": "", "schemeid": ""}, "inferred": false, "inferenceprovenance": "", "invisible": false, "trust": ""}, "qualifier": {"classid": "main title", "classname": "main title", "schemename": "dnet:dataCite_title", "schemeid": "dnet:dataCite_title"}, "value": "Altered brain activation in a reversal learning task unmasks adaptive changes in cognitive control in writer's cramp"}]} +{"context": [], "dataInfo": {"deletedbyinference": false, "provenanceaction": {"classid": "sysimport:crosswalk:repository", "classname": "sysimport:crosswalk:repository", "schemename": "dnet:provenanceActions", "schemeid": "dnet:provenanceActions"}, "inferred": true, "inferenceprovenance": "dedup-similarity-result-levenstein", "invisible": false, "trust": "0.9"}, "resourcetype": {"classid": "", "classname": "", "schemename": "", "schemeid": ""}, "pid": [{"dataInfo": {"deletedbyinference": false, "provenanceaction": {"classid": "", "classname": "", "schemename": "", "schemeid": ""}, "inferred": false, "inferenceprovenance": "", "invisible": false, "trust": ""}, "qualifier": {"classid": "doi", "classname": "doi", "schemename": "dnet:pid_types", "schemeid": "dnet:pid_types"}, "value": "10.1016/j.nicl.2015.11.006"}, {"dataInfo": {"deletedbyinference": false, "provenanceaction": {"classid": "", "classname": "", "schemename": "", "schemeid": ""}, "inferred": false, "inferenceprovenance": "", "invisible": false, "trust": ""}, "qualifier": {"classid": "arXiv", "classname": "arXiv", "schemename": "dnet:pid_types", "schemeid": "dnet:pid_types"}, "value": "arXivSampleID"} ,{"dataInfo": {"deletedbyinference": false, "provenanceaction": {"classid": "", "classname": "", "schemename": "", "schemeid": ""}, "inferred": false, "inferenceprovenance": "", "invisible": false, "trust": ""}, "qualifier": {"classid": "pmc", "classname": "pmc", "schemename": "dnet:pid_types", "schemeid": "dnet:pid_types"}, "value": "pmcsampleid"}], "contributor": [], "resulttype": {"classid": "publication", "classname": "publication", "schemename": "dnet:result_typologies", "schemeid": "dnet:result_typologies"}, "relevantdate": [], "collectedfrom": [{"dataInfo": {"deletedbyinference": false, "provenanceaction": {"classid": "", "classname": "", "schemename": "", "schemeid": ""}, "inferred": false, "inferenceprovenance": "", "invisible": false, "trust": ""}, "value": "BASE (Open Access Aggregator)", "key": "10|openaire____::df45502607927471ecf8a6ae83683ff5"}], "id": "50|base_oa_____::0968af610a356656706657e4f234b340", "subject": [], "instance": [{"refereed": null, "hostedby": {"dataInfo": {"deletedbyinference": false, "provenanceaction": {"classid": "", "classname": "", "schemename": "", "schemeid": ""}, "inferred": false, "inferenceprovenance": "", "invisible": false, "trust": ""}, "value": "NeuroImage: Clinical", "key": "10|doajarticles::0c0e74daa5d95504eade9c81ebbd5b8a"}, "processingchargeamount": {"dataInfo": {"deletedbyinference": false, "provenanceaction": {"classid": "", "classname": "", "schemename": "", "schemeid": ""}, "inferred": false, "inferenceprovenance": "", "invisible": false, "trust": ""}, "value": ""}, "license": {"dataInfo": {"deletedbyinference": false, "provenanceaction": {"classid": "", "classname": "", "schemename": "", "schemeid": ""}, "inferred": false, "inferenceprovenance": "", "invisible": false, "trust": ""}, "value": "http://creativecommons.org/licenses/by-nc-nd/4.0/"}, "url": ["http://dx.doi.org/10.1016/j.nicl.2015.11.006"], "distributionlocation": "", "processingchargecurrency": {"dataInfo": {"deletedbyinference": false, "provenanceaction": {"classid": "", "classname": "", "schemename": "", "schemeid": ""}, "inferred": false, "inferenceprovenance": "", "invisible": false, "trust": ""}, "value": ""}, "dateofacceptance": {"dataInfo": {"deletedbyinference": false, "provenanceaction": {"classid": "", "classname": "", "schemename": "", "schemeid": ""}, "inferred": false, "inferenceprovenance": "", "invisible": false, "trust": ""}, "value": "2016-01-01"}, "collectedfrom": {"dataInfo": {"deletedbyinference": false, "provenanceaction": {"classid": "", "classname": "", "schemename": "", "schemeid": ""}, "inferred": false, "inferenceprovenance": "", "invisible": false, "trust": ""}, "value": "BASE (Open Access Aggregator)", "key": "10|openaire____::df45502607927471ecf8a6ae83683ff5"}, "accessright": {"classid": "OPEN", "classname": "Open Access", "schemename": "dnet:access_modes", "schemeid": "dnet:access_modes"}, "instancetype": {"classid": "0001", "classname": "Article", "schemename": "dnet:publication_resource", "schemeid": "dnet:publication_resource"}}], "embargoenddate": {"dataInfo": {"deletedbyinference": false, "provenanceaction": {"classid": "", "classname": "", "schemename": "", "schemeid": ""}, "inferred": false, "inferenceprovenance": "", "invisible": false, "trust": ""}, "value": ""}, "lastupdatetimestamp": 0, "author": [{"surname": "Zeuner", "name": "Kirsten E.", "pid": [], "rank": 1, "affiliation": [], "fullname": "Zeuner, Kirsten E."}, {"surname": "Knutzen", "name": "Arne", "pid": [], "rank": 2, "affiliation": [], "fullname": "Knutzen, Arne"}, {"surname": "Granert", "name": "Oliver", "pid": [{"qualifier": {"classid": "ORCID", "classname": "ORCID"}, "value": "0000-0002-0656-1023"}], "rank": 3, "affiliation": [], "fullname": "Granert, Oliver"}, {"surname": "Sablowsky", "name": "Simone", "pid": [], "rank": 4, "affiliation": [], "fullname": "Sablowsky, Simone"}, {"surname": "Go\\u0308tz", "name": "Julia", "pid": [], "rank": 5, "affiliation": [], "fullname": "G\\u00f6tz, Julia"}, {"surname": "Wolff", "name": "Stephan", "pid": [], "rank": 6, "affiliation": [], "fullname": "Wolff, Stephan"}, {"surname": "Jansen", "name": "Olav", "pid": [], "rank": 7, "affiliation": [], "fullname": "Jansen, Olav"}, {"surname": "Dressler", "name": "Dirk", "pid": [], "rank": 8, "affiliation": [], "fullname": "Dressler, Dirk"}, {"surname": "Schneider", "name": "Susanne A.", "pid": [], "rank": 9, "affiliation": [], "fullname": "Schneider, Susanne A."}, {"surname": "Klein", "name": "Christine", "pid": [], "rank": 10, "affiliation": [], "fullname": "Klein, Christine"}, {"surname": "Deuschl", "name": "Gu\\u0308nther", "pid": [], "rank": 11, "affiliation": [], "fullname": "Deuschl, G\\u00fcnther"}, {"surname": "Eimeren", "name": "Thilo", "pid": [], "rank": 12, "affiliation": [], "fullname": "van Eimeren, Thilo"}, {"surname": "Witt", "name": "Karsten", "pid": [], "rank": 13, "affiliation": [], "fullname": "Witt, Karsten"}], "source": [], "dateofcollection": "2017-07-27T19:04:09.131Z", "fulltext": [], "dateoftransformation": "2019-01-23T10:15:19.582Z", "description": [], "format": [], "journal": {"issnPrinted": "2213-1582", "conferencedate": "", "conferenceplace": "", "name": "NeuroImage: Clinical", "edition": "", "iss": "", "sp": "63", "vol": "10", "dataInfo": {"deletedbyinference": false, "provenanceaction": {"classid": "", "classname": "", "schemename": "", "schemeid": ""}, "inferred": false, "inferenceprovenance": "", "invisible": false, "trust": ""}, "issnOnline": "", "ep": "70", "issnLinking": ""}, "coverage": [], "publisher": {"dataInfo": {"deletedbyinference": false, "provenanceaction": {"classid": "", "classname": "", "schemename": "", "schemeid": ""}, "inferred": false, "inferenceprovenance": "", "invisible": false, "trust": ""}, "value": "Elsevier BV"}, "language": {"classid": "", "classname": "", "schemename": "", "schemeid": ""}, "bestaccessright": {"classid": "OPEN", "classname": "Open Access", "schemename": "dnet:access_modes", "schemeid": "dnet:access_modes"}, "country": [{"classid": "IT", "classname": "Italy", "schemeid": "dnet:countries", "schemename": "dnet:countries"}], "extraInfo": [], "originalId": ["10.1016/j.nicl.2015.11.006"], "dateofacceptance": {"dataInfo": {"deletedbyinference": false, "provenanceaction": {"classid": "", "classname": "", "schemename": "", "schemeid": ""}, "inferred": false, "inferenceprovenance": "", "invisible": false, "trust": ""}, "value": "2016-01-01"}, "title": [{"dataInfo": {"deletedbyinference": false, "provenanceaction": {"classid": "", "classname": "", "schemename": "", "schemeid": ""}, "inferred": false, "inferenceprovenance": "", "invisible": false, "trust": ""}, "qualifier": {"classid": "main title", "classname": "main title", "schemename": "dnet:dataCite_title", "schemeid": "dnet:dataCite_title"}, "value": "Altered brain activation in a reversal learning task unmasks adaptive changes in cognitive control in writer's cramp"}]} +{"context": [], "dataInfo": {"deletedbyinference": false, "provenanceaction": {"classid": "sysimport:crosswalk:datasetarchive", "classname": "sysimport:crosswalk:datasetarchive", "schemename": "dnet:provenanceActions", "schemeid": "dnet:provenanceActions"}, "inferred": true, "inferenceprovenance": "dedup-similarity-result-levenstein", "invisible": false, "trust": "0.9"}, "resourcetype": {"classid": "0004", "classname": "Conference object", "schemename": "dnet:dataCite_resource", "schemeid": "dnet:dataCite_resource"}, "pid": [{"dataInfo": {"deletedbyinference": false, "provenanceaction": {"classid": "", "classname": "", "schemename": "", "schemeid": ""}, "inferred": false, "inferenceprovenance": "", "invisible": false, "trust": ""}, "qualifier": {"classid": "arXiv", "classname": "arXiv", "schemename": "dnet:pid_types", "schemeid": "dnet:pid_types"}, "value": "arXivSampleID"} ,{"dataInfo": {"deletedbyinference": false, "provenanceaction": {"classid": "", "classname": "", "schemename": "", "schemeid": ""}, "inferred": false, "inferenceprovenance": "", "invisible": false, "trust": ""}, "qualifier": {"classid": "doi", "classname": "doi", "schemename": "dnet:pid_types", "schemeid": "dnet:pid_types"}, "value": "10.0001/doi2"}], "contributor": [], "resulttype": {"classid": "publication", "classname": "publication", "schemename": "dnet:result_typologies", "schemeid": "dnet:result_typologies"}, "relevantdate": [], "collectedfrom": [{"dataInfo": {"deletedbyinference": false, "provenanceaction": {"classid": "", "classname": "", "schemename": "", "schemeid": ""}, "inferred": false, "inferenceprovenance": "", "invisible": false, "trust": ""}, "value": "CRIS UNS (Current Research Information System University of Novi Sad)", "key": "10|CRIS_UNS____::f66f1bd369679b5b077dcdf006089556"}], "id": "50|CrisUnsNoviS::9f9d014eea45dab432cab636c4c9cf39", "subject": [], "instance": [{"refereed": null, "hostedby": {"dataInfo": {"deletedbyinference": false, "provenanceaction": {"classid": "", "classname": "", "schemename": "", "schemeid": ""}, "inferred": false, "inferenceprovenance": "", "invisible": false, "trust": ""}, "value": "CRIS UNS (Current Research Information System University of Novi Sad)", "key": "10|CRIS_UNS____::f66f1bd369679b5b077dcdf006089556"}, "processingchargeamount": {"dataInfo": {"deletedbyinference": false, "provenanceaction": {"classid": "", "classname": "", "schemename": "", "schemeid": ""}, "inferred": false, "inferenceprovenance": "", "invisible": false, "trust": ""}, "value": ""}, "license": {"dataInfo": {"deletedbyinference": false, "provenanceaction": {"classid": "", "classname": "", "schemename": "", "schemeid": ""}, "inferred": false, "inferenceprovenance": "", "invisible": false, "trust": ""}, "value": ""}, "url": ["https://www.cris.uns.ac.rs/record.jsf?recordId=113444&source=OpenAIRE&language=en"], "distributionlocation": "", "processingchargecurrency": {"dataInfo": {"deletedbyinference": false, "provenanceaction": {"classid": "", "classname": "", "schemename": "", "schemeid": ""}, "inferred": false, "inferenceprovenance": "", "invisible": false, "trust": ""}, "value": ""}, "dateofacceptance": {"dataInfo": {"deletedbyinference": false, "provenanceaction": {"classid": "", "classname": "", "schemename": "", "schemeid": ""}, "inferred": false, "inferenceprovenance": "", "invisible": false, "trust": ""}, "value": "2019-01-01"}, "collectedfrom": {"dataInfo": {"deletedbyinference": false, "provenanceaction": {"classid": "", "classname": "", "schemename": "", "schemeid": ""}, "inferred": false, "inferenceprovenance": "", "invisible": false, "trust": ""}, "value": "CRIS UNS (Current Research Information System University of Novi Sad)", "key": "10|CRIS_UNS____::f66f1bd369679b5b077dcdf006089556"}, "accessright": {"classid": "UNKNOWN", "classname": "UNKNOWN", "schemename": "dnet:access_modes", "schemeid": "dnet:access_modes"}, "instancetype": {"classid": "0004", "classname": "Conference object", "schemename": "dnet:dataCite_resource", "schemeid": "dnet:dataCite_resource"}}], "embargoenddate": {"dataInfo": {"deletedbyinference": false, "provenanceaction": {"classid": "", "classname": "", "schemename": "", "schemeid": ""}, "inferred": false, "inferenceprovenance": "", "invisible": false, "trust": ""}, "value": ""}, "lastupdatetimestamp": 0, "author": [{"surname": "Zeuner", "name": "Kirsten E.", "pid": [], "rank": 1, "affiliation": [], "fullname": "Zeuner, Kirsten E."}, {"surname": "Knutzen", "name": "Arne", "pid": [], "rank": 2, "affiliation": [], "fullname": "Knutzen, Arne"}, {"surname": "Granert", "name": "Oliver", "pid": [{"qualifier": {"classid": "ORCID", "classname": "ORCID"}, "value": "0000-0002-0656-1023"}, {"qualifier": {"classid": "pubmed", "classname": "pubmed"}, "value": "pubmed.it"}], "rank": 3, "affiliation": [], "fullname": "Granert, Oliver"}, {"surname": "Sablowsky", "name": "Simone", "pid": [{"qualifier": {"classid": "id", "classname": "id"}, "value": "12345678"}], "rank": 4, "affiliation": [], "fullname": "Sablowsky, Simone"}, {"surname": "Go\\u0308tz", "name": "Julia", "pid": [], "rank": 5, "affiliation": [], "fullname": "G\\u00f6tz, Julia"}, {"surname": "Wolff", "name": "Stephan", "pid": [], "rank": 6, "affiliation": [], "fullname": "Wolff, Stephan"}, {"surname": "Jansen", "name": "Olav", "pid": [{"qualifier": {"classid": "ORCID", "classname": "ORCID"}, "value": "0000-0000-0656-1023"},{"qualifier": {"classid": "id", "classname": "id"}, "value": "987654321"}], "rank": 7, "affiliation": [], "fullname": "Jansen, Olav"}, {"surname": "Dressler", "name": "Dirk", "pid": [], "rank": 8, "affiliation": [], "fullname": "Dressler, Dirk"}, {"surname": "Schneider", "name": "Susanne A.", "pid": [], "rank": 9, "affiliation": [], "fullname": "Schneider, Susanne A."}], "source": [], "dateofcollection": "2020-03-10T15:05:38.685Z", "fulltext": [], "dateoftransformation": "2020-03-11T20:11:13.15Z", "description": [], "format": [], "journal": {"issnPrinted": "", "conferencedate": "", "conferenceplace": "", "name": "", "edition": "", "iss": "", "sp": "", "vol": "", "dataInfo": {"deletedbyinference": false, "provenanceaction": {"classid": "", "classname": "", "schemename": "", "schemeid": ""}, "inferred": false, "inferenceprovenance": "", "invisible": false, "trust": ""}, "issnOnline": "", "ep": "", "issnLinking": ""}, "coverage": [], "publisher": {"dataInfo": {"deletedbyinference": false, "provenanceaction": {"classid": "", "classname": "", "schemename": "", "schemeid": ""}, "inferred": false, "inferenceprovenance": "", "invisible": false, "trust": ""}, "value": ""}, "language": {"classid": "en", "classname": "en", "schemename": "dnet:languages", "schemeid": "dnet:languages"}, "bestaccessright": {"classid": "UNKNOWN", "classname": "not available", "schemename": "dnet:access_modes", "schemeid": "dnet:access_modes"}, "country": [{"classid": "FI", "classname": "Finland", "schemeid": "dnet:countries", "schemename": "dnet:countries"}], "extraInfo": [], "originalId": ["(BISIS)113444", "https://www.cris.uns.ac.rs/record.jsf?recordId=113444&source=OpenAIRE&language=en"], "dateofacceptance": {"dataInfo": {"deletedbyinference": false, "provenanceaction": {"classid": "", "classname": "", "schemename": "", "schemeid": ""}, "inferred": false, "inferenceprovenance": "", "invisible": false, "trust": ""}, "value": "2016-01-01"}, "title": [{"dataInfo": {"deletedbyinference": false, "provenanceaction": {"classid": "", "classname": "", "schemename": "", "schemeid": ""}, "inferred": false, "inferenceprovenance": "", "invisible": false, "trust": ""}, "qualifier": {"classid": "test title", "classname": "test title", "schemename": "dnet:dataCite_title", "schemeid": "dnet:dataCite_title"}, "value": "Antichains of copies of ultrahomogeneous structures"}]} \ No newline at end of file From 1425d810a864206b373fa5fe76fdf519b0c00e41 Mon Sep 17 00:00:00 2001 From: Alessia Bardi Date: Mon, 19 Oct 2020 17:46:14 +0200 Subject: [PATCH 10/12] testing mapping --- .../dnetlib/dhp/oa/graph/raw/MappersTest.java | 33 +++++- .../dhp/oa/graph/raw/oaf_claim_crossref.xml | 68 ++++++++++++ .../dnetlib/dhp/oa/graph/raw/odf_nakala.xml | 86 ++++++++------- .../dnetlib/dhp/oa/graph/raw/odf_record.xml | 102 ++++++++++++++++++ 4 files changed, 244 insertions(+), 45 deletions(-) create mode 100644 dhp-workflows/dhp-graph-mapper/src/test/resources/eu/dnetlib/dhp/oa/graph/raw/oaf_claim_crossref.xml create mode 100644 dhp-workflows/dhp-graph-mapper/src/test/resources/eu/dnetlib/dhp/oa/graph/raw/odf_record.xml diff --git a/dhp-workflows/dhp-graph-mapper/src/test/java/eu/dnetlib/dhp/oa/graph/raw/MappersTest.java b/dhp-workflows/dhp-graph-mapper/src/test/java/eu/dnetlib/dhp/oa/graph/raw/MappersTest.java index 2c10f8f58..af9fadb5a 100644 --- a/dhp-workflows/dhp-graph-mapper/src/test/java/eu/dnetlib/dhp/oa/graph/raw/MappersTest.java +++ b/dhp-workflows/dhp-graph-mapper/src/test/java/eu/dnetlib/dhp/oa/graph/raw/MappersTest.java @@ -304,9 +304,40 @@ public class MappersTest { assertValidId(d.getCollectedfrom().get(0).getKey()); assertTrue(StringUtils.isNotBlank(d.getTitle().get(0).getValue())); assertEquals(1, d.getAuthor().size()); - assertEquals(0, d.getSubject().size()); + assertEquals(1, d.getSubject().size()); assertEquals(1, d.getInstance().size()); assertEquals(1, d.getPid().size()); + assertNotNull(d.getInstance().get(0).getUrl()); + } + + @Test + void testClaimFromCrossref() throws IOException { + final String xml = IOUtils.toString(getClass().getResourceAsStream("oaf_claim_crossref.xml")); + final List list = new OafToOafMapper(vocs, false).processMdRecord(xml); + + System.out.println("***************"); + System.out.println(new ObjectMapper().writeValueAsString(list)); + System.out.println("***************"); + + final Publication p = (Publication) list.get(0); + assertValidId(p.getId()); + assertValidId(p.getCollectedfrom().get(0).getKey()); + System.out.println(p.getTitle().get(0).getValue()); + assertTrue(StringUtils.isNotBlank(p.getTitle().get(0).getValue())); + } + + @Test + void testODFRecord() throws IOException { + final String xml = IOUtils.toString(getClass().getResourceAsStream("odf_record.xml")); + List list = new OdfToOafMapper(vocs, false).processMdRecord(xml); + System.out.println("***************"); + System.out.println(new ObjectMapper().writeValueAsString(list)); + System.out.println("***************"); + final Dataset p = (Dataset) list.get(0); + assertValidId(p.getId()); + assertValidId(p.getCollectedfrom().get(0).getKey()); + System.out.println(p.getTitle().get(0).getValue()); + assertTrue(StringUtils.isNotBlank(p.getTitle().get(0).getValue())); } private void assertValidId(final String id) { diff --git a/dhp-workflows/dhp-graph-mapper/src/test/resources/eu/dnetlib/dhp/oa/graph/raw/oaf_claim_crossref.xml b/dhp-workflows/dhp-graph-mapper/src/test/resources/eu/dnetlib/dhp/oa/graph/raw/oaf_claim_crossref.xml new file mode 100644 index 000000000..8f69a5e2d --- /dev/null +++ b/dhp-workflows/dhp-graph-mapper/src/test/resources/eu/dnetlib/dhp/oa/graph/raw/oaf_claim_crossref.xml @@ -0,0 +1,68 @@ + + +

+ userclaim___::7f0f7807f17db50e5c2b5c452ccaf06d + userclaim___::7f0f7807f17db50e5c2b5c452ccaf06d + 2020-08-06T07:04:09.62Z + + + + + + 2020-08-06T07:20:57.911Z + openaire____ +
+ + A case report of serious haemolysis in a glucose-6-phosphate dehydrogenase-deficient COVID-19 patient receiving hydroxychloroquine + Maillart, E. + Leemans, S. + Van Noten, H. + Vandergraesen, T. + Mahadeb, B. + Salaouatchi, M. T. + De Bels, D. + Clevenbergh, P. + + http://dx.doi.org/10.1080/23744235.2020.1774644 + + Informa UK Limited + Crossref + Infectious Diseases + Microbiology (medical) + General Immunology and Microbiology + Infectious Diseases + General Medicine + journal-article + 0001 + 2020-06-04 + + UNKNOWN + + + 10.1080/23744235.2020.1774644 + Infectious Diseases + + + + + file%3A%2F%2F%2Fsrv%2Fclaims%2Frecords%2Fpublication%2Fcrossref + + + + + + + false + false + 0.9 + + + + + \ No newline at end of file diff --git a/dhp-workflows/dhp-graph-mapper/src/test/resources/eu/dnetlib/dhp/oa/graph/raw/odf_nakala.xml b/dhp-workflows/dhp-graph-mapper/src/test/resources/eu/dnetlib/dhp/oa/graph/raw/odf_nakala.xml index 105d0c413..7796e4c37 100644 --- a/dhp-workflows/dhp-graph-mapper/src/test/resources/eu/dnetlib/dhp/oa/graph/raw/odf_nakala.xml +++ b/dhp-workflows/dhp-graph-mapper/src/test/resources/eu/dnetlib/dhp/oa/graph/raw/odf_nakala.xml @@ -1,77 +1,75 @@ + xmlns:oaf="http://namespace.openaire.eu/oaf" + xmlns:oai="http://www.openarchives.org/OAI/2.0/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> - r3f5b9831893::cca7367159bc3ff90cd2f75bf9dc21c4 - oai:nakala.fr:hdl_11280_847e01df - 2020-08-01T00:16:24.742Z + xmlns:dri="http://www.driver-repository.eu/namespace/dri" xmlns:prov="http://www.openarchives.org/OAI/2.0/provenance"> + r3f5b9831893::01a497c6c6b44289c52dcdf22b6c0fc0 + oai:nakala.fr:hdl_11280_50f302c6 + 2020-10-03T06:06:52.228Z r3f5b9831893 - oai:nakala.fr:hdl_11280_847e01df - 2020-06-08T01:01:38Z - hdl_11280_2b09fc10 - hdl_11280_c1bc48d0 - hdl_11280_57c8db3a - 2020-08-01T00:31:35.625Z + oai:nakala.fr:hdl_11280_50f302c6 + 2020-09-19T23:56:08Z + hdl_11280_96355742 + hdl_11280_26914437 + hdl_11280_86561837 + 2020-10-19T15:39:52.151Z - 277 - http://hdl.handle.net/11280/847e01df - - http://hdl.handle.net/http://hdl.handle.net/11280/847e01df - - http://nakala.fr/data/11280/847e01df - + http://nakala.fr/data/11280/50f302c6 + 11280/50f302c6 + - DHAAP + Desbrosse, Xavier - - CVP_Notice277-1 place du Docteur Antoine Béclère _PHO02.jpg + + Les rues Stalingrad en France (1945-2013) - - Hôpital Saint-Antoine. Fragment de dalle funéraire trouvée en décembre 1932. Paris (XIIème arr.). Photographie d'Albert Citerne (1876-1970). Plaque de verre, 1932. Département Histoire de l'Architecture et Archéologie de Paris. - Nfa_1146 - Hôpital Saint-Antoine. Fragment de dalle funéraire trouvée en décembre 1932. Paris (XIIème arr.). Photographie d'Albert Citerne (1876-1970). Plaque de verre, 1932. Département Histoire de l'Architecture et Archéologie de Paris. + + Rues – Noms -- France + + + Cette carte appartient à la collection « Guerre froide vue d’en bas » élaborée dans le cadre de l’enquête 2009-2013 du réseau des correspondants départementaux de l’IHTP « La Guerre froide vue d’en bas : 1947-1967 », enquête conduite sous la direction de Philippe Buton Professeur d’Histoire contemporaine à l’Université de Reims, d’Olivier Büttner Ingénieur de Recherche IHTP-CNRS et de Michel Hastings, Professeur de Science politique à l’Institut d’Etudes Politiques de Lille. - Nakala by Huma-Num - + IHTP-CNRS + - DHAAP, Pôle Archéologique + (CNRS), Institut d'Histoire du Temps Présent (IHTP) - Centre National de la Recherche Scientifique - - 1932 + + 2013 - StillImage - - - + Carte + + + France + + - http://hdl.handle.net/11280/847e01df + 11280/50f302c6 + 0025 - OPEN + UNKNOWN und + xmlns:dri="http://www.driver-repository.eu/namespace/dri" xmlns:prov="http://www.openarchives.org/OAI/2.0/provenance"> - - https%3A%2F%2Fwww.nakala.fr%2Foai_oa%2F11280%2F8892ab4b - oai:nakala.fr:hdl_11280_847e01df - 2020-06-08T01:01:38Z + + https%3A%2F%2Fwww.nakala.fr%2Foai_oa%2F11280%2F92c4d30b + oai:nakala.fr:hdl_11280_50f302c6 + 2020-09-19T23:56:08Z diff --git a/dhp-workflows/dhp-graph-mapper/src/test/resources/eu/dnetlib/dhp/oa/graph/raw/odf_record.xml b/dhp-workflows/dhp-graph-mapper/src/test/resources/eu/dnetlib/dhp/oa/graph/raw/odf_record.xml new file mode 100644 index 000000000..e2d51a43d --- /dev/null +++ b/dhp-workflows/dhp-graph-mapper/src/test/resources/eu/dnetlib/dhp/oa/graph/raw/odf_record.xml @@ -0,0 +1,102 @@ + + + + r3a507cdacc5::03b31980d9bb3c4609e6005c4a3baba6 + oai:lindat.mff.cuni.cz:11372/LRT-1844 + 2020-09-04T14:36:48.411Z + r3a507cdacc5 + oai:lindat.mff.cuni.cz:11372/LRT-1844 + 2016-12-07T11:10:30Z + hdl_11858_00-097C-0000-0007-710A-A + hdl_11858_00-097C-0000-0007-710B-8 + openaire_data + 2020-09-04T14:39:16.458Z + + + + 11372/LRT-1844 + + http://hdl.handle.net/11372/LRT-1844 + + + + Hercig, Tomáš + + + Brychcín, Tomáš + + + Svoboda, Lukáš + + + Konkol, Michal + + + Steinberger, Josef + + + + Restaurant Reviews CZ ABSA corpus v2 + + University of West Bohemia, Department of Computer Science and Engineering + 2016 + + + European Commission + info:eu-repo/grantAgreement/EC/FP7/630786 + + + + 2016 + 2016-12-07T11:10:30Z + 2016-12-07T11:10:30Z + + corpus + + + + + + Restaurant Reviews CZ ABSA - 2.15k reviews with their related target and category + + The work done is described in the paper: https://doi.org/10.13053/CyS-20-3-2469 + + + 11372/LRT-1844 + 2016-12-07 + 0021 + 2016-01-01 + OPEN + http://creativecommons.org/licenses/by-nc-sa/4.0/ + und + corda_______::630786 + + + + + + + https%3A%2F%2Flindat.mff.cuni.cz%2Frepository%2Foai%2Fopenaire_data + oai:lindat.mff.cuni.cz:11372/LRT-1844 + 2016-12-07T11:10:30Z + + + + + false + false + 0.9 + + + + + From 0e54803177cdaeba475f54e28145205a52f11525 Mon Sep 17 00:00:00 2001 From: miconis Date: Tue, 20 Oct 2020 12:19:46 +0200 Subject: [PATCH 11/12] bug fix in the id generator and implementation of jobs for organization dedup --- .../dhp/oa/dedup/DedupRecordFactory.java | 3 +- .../eu/dnetlib/dhp/oa/dedup/IdGenerator.java | 14 +- .../dhp/oa/dedup/SparkPrepareNewOrgs.java | 30 ++- .../dhp/oa/dedup/SparkPrepareOrgRels.java | 163 +++++++++---- .../oa/dedup/graph/ConnectedComponent.java | 2 +- .../dhp/oa/dedup/model/Identifier.java | 10 +- .../dnetlib/dhp/oa/dedup/model/OrgSimRel.java | 12 +- .../oa/dedup/orgsdedup/oozie_app/workflow.xml | 33 ++- .../oa/dedup/prepareNewOrgs_parameters.json | 6 + .../oa/dedup/prepareOrgRels_parameters.json | 6 - .../dnetlib/dhp/oa/dedup/IdGeneratorTest.java | 221 ++++++++++-------- .../dnetlib/dhp/oa/dedup/SparkDedupTest.java | 42 ++-- 12 files changed, 353 insertions(+), 189 deletions(-) diff --git a/dhp-workflows/dhp-dedup-openaire/src/main/java/eu/dnetlib/dhp/oa/dedup/DedupRecordFactory.java b/dhp-workflows/dhp-dedup-openaire/src/main/java/eu/dnetlib/dhp/oa/dedup/DedupRecordFactory.java index 2e4b219b5..eec36bc0e 100644 --- a/dhp-workflows/dhp-dedup-openaire/src/main/java/eu/dnetlib/dhp/oa/dedup/DedupRecordFactory.java +++ b/dhp-workflows/dhp-dedup-openaire/src/main/java/eu/dnetlib/dhp/oa/dedup/DedupRecordFactory.java @@ -1,8 +1,8 @@ + package eu.dnetlib.dhp.oa.dedup; import java.util.*; -import eu.dnetlib.dhp.oa.dedup.model.Identifier; import org.apache.spark.api.java.function.MapFunction; import org.apache.spark.api.java.function.MapGroupsFunction; import org.apache.spark.sql.Dataset; @@ -15,6 +15,7 @@ import com.fasterxml.jackson.databind.DeserializationFeature; import com.fasterxml.jackson.databind.ObjectMapper; import com.google.common.collect.Lists; +import eu.dnetlib.dhp.oa.dedup.model.Identifier; import eu.dnetlib.dhp.schema.common.ModelSupport; import eu.dnetlib.dhp.schema.oaf.*; import scala.Tuple2; diff --git a/dhp-workflows/dhp-dedup-openaire/src/main/java/eu/dnetlib/dhp/oa/dedup/IdGenerator.java b/dhp-workflows/dhp-dedup-openaire/src/main/java/eu/dnetlib/dhp/oa/dedup/IdGenerator.java index 7980d8e69..405a9abf1 100644 --- a/dhp-workflows/dhp-dedup-openaire/src/main/java/eu/dnetlib/dhp/oa/dedup/IdGenerator.java +++ b/dhp-workflows/dhp-dedup-openaire/src/main/java/eu/dnetlib/dhp/oa/dedup/IdGenerator.java @@ -6,25 +6,25 @@ import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.*; -import eu.dnetlib.dhp.oa.dedup.model.Identifier; -import eu.dnetlib.dhp.oa.dedup.model.PidType; -import eu.dnetlib.dhp.utils.DHPUtils; import org.apache.commons.lang.StringUtils; import com.google.common.collect.Lists; +import eu.dnetlib.dhp.oa.dedup.model.Identifier; +import eu.dnetlib.dhp.oa.dedup.model.PidType; import eu.dnetlib.dhp.schema.common.EntityType; import eu.dnetlib.dhp.schema.common.ModelSupport; import eu.dnetlib.dhp.schema.oaf.Field; import eu.dnetlib.dhp.schema.oaf.OafEntity; import eu.dnetlib.dhp.schema.oaf.Result; import eu.dnetlib.dhp.schema.oaf.StructuredProperty; +import eu.dnetlib.dhp.utils.DHPUtils; public class IdGenerator implements Serializable { public static String CROSSREF_ID = "10|openaire____::081b82f96300b6a6e3d282bad31cb6e2"; public static String DATACITE_ID = "10|openaire____::9e3be59865b2c1c335d32dae2fe7b254"; - public static String BASE_DATE = "2000-01-01"; + public static String BASE_DATE = "2000-01-01"; // pick the best pid from the list (consider date and pidtype) public static String generate(List pids, String defaultID) { @@ -55,9 +55,9 @@ public class IdGenerator implements Serializable { date = new Date(); } return Lists - .newArrayList( - new Identifier(new StructuredProperty(), date, PidType.original, entity.getCollectedfrom(), - EntityType.fromClass(entity.getClass()), entity.getId())); + .newArrayList( + new Identifier(new StructuredProperty(), date, PidType.original, entity.getCollectedfrom(), + EntityType.fromClass(entity.getClass()), entity.getId())); } // pick the best pid from the entity. Returns a list (length 1) to save time in the call diff --git a/dhp-workflows/dhp-dedup-openaire/src/main/java/eu/dnetlib/dhp/oa/dedup/SparkPrepareNewOrgs.java b/dhp-workflows/dhp-dedup-openaire/src/main/java/eu/dnetlib/dhp/oa/dedup/SparkPrepareNewOrgs.java index ea6e6db82..9b91a545e 100644 --- a/dhp-workflows/dhp-dedup-openaire/src/main/java/eu/dnetlib/dhp/oa/dedup/SparkPrepareNewOrgs.java +++ b/dhp-workflows/dhp-dedup-openaire/src/main/java/eu/dnetlib/dhp/oa/dedup/SparkPrepareNewOrgs.java @@ -5,8 +5,11 @@ import java.io.IOException; import java.util.Optional; import java.util.Properties; -import eu.dnetlib.dhp.oa.dedup.model.OrgSimRel; import org.apache.commons.io.IOUtils; +import org.apache.http.client.methods.CloseableHttpResponse; +import org.apache.http.client.methods.HttpGet; +import org.apache.http.impl.client.CloseableHttpClient; +import org.apache.http.impl.client.HttpClients; import org.apache.spark.SparkConf; import org.apache.spark.api.java.function.FilterFunction; import org.apache.spark.api.java.function.MapFunction; @@ -18,6 +21,7 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import eu.dnetlib.dhp.application.ArgumentApplicationParser; +import eu.dnetlib.dhp.oa.dedup.model.OrgSimRel; import eu.dnetlib.dhp.schema.common.ModelSupport; import eu.dnetlib.dhp.schema.oaf.Organization; import eu.dnetlib.dhp.schema.oaf.Relation; @@ -62,6 +66,10 @@ public class SparkPrepareNewOrgs extends AbstractSparkAction { .map(Integer::valueOf) .orElse(NUM_CONNECTIONS); + final String apiUrl = Optional + .ofNullable(parser.get("apiUrl")) + .orElse(""); + final String dbUrl = parser.get("dbUrl"); final String dbTable = parser.get("dbTable"); final String dbUser = parser.get("dbUser"); @@ -72,6 +80,7 @@ public class SparkPrepareNewOrgs extends AbstractSparkAction { log.info("actionSetId: '{}'", actionSetId); log.info("workingPath: '{}'", workingPath); log.info("numPartitions: '{}'", numConnections); + log.info("apiUrl: '{}'", apiUrl); log.info("dbUrl: '{}'", dbUrl); log.info("dbUser: '{}'", dbUser); log.info("table: '{}'", dbTable); @@ -89,9 +98,12 @@ public class SparkPrepareNewOrgs extends AbstractSparkAction { newOrgs .repartition(numConnections) .write() - .mode(SaveMode.Overwrite) + .mode(SaveMode.Append) .jdbc(dbUrl, dbTable, connectionProperties); + if (!apiUrl.isEmpty()) + updateSimRels(apiUrl); + } public static Dataset createNewOrgs( @@ -138,9 +150,21 @@ public class SparkPrepareNewOrgs extends AbstractSparkAction { r._1()._2().getLegalshortname() != null ? r._1()._2().getLegalshortname().getValue() : "", r._1()._2().getCountry() != null ? r._1()._2().getCountry().getClassid() : "", r._1()._2().getWebsiteurl() != null ? r._1()._2().getWebsiteurl().getValue() : "", - r._1()._2().getCollectedfrom().get(0).getValue()), + r._1()._2().getCollectedfrom().get(0).getValue(), ""), Encoders.bean(OrgSimRel.class)); } + private static String updateSimRels(final String apiUrl) throws IOException { + + log.info("Updating simrels on the portal"); + + final HttpGet req = new HttpGet(apiUrl); + try (final CloseableHttpClient client = HttpClients.createDefault()) { + try (final CloseableHttpResponse response = client.execute(req)) { + return IOUtils.toString(response.getEntity().getContent()); + } + } + } + } diff --git a/dhp-workflows/dhp-dedup-openaire/src/main/java/eu/dnetlib/dhp/oa/dedup/SparkPrepareOrgRels.java b/dhp-workflows/dhp-dedup-openaire/src/main/java/eu/dnetlib/dhp/oa/dedup/SparkPrepareOrgRels.java index 4a3ce80df..e9933c4e5 100644 --- a/dhp-workflows/dhp-dedup-openaire/src/main/java/eu/dnetlib/dhp/oa/dedup/SparkPrepareOrgRels.java +++ b/dhp-workflows/dhp-dedup-openaire/src/main/java/eu/dnetlib/dhp/oa/dedup/SparkPrepareOrgRels.java @@ -1,18 +1,14 @@ - package eu.dnetlib.dhp.oa.dedup; -import java.io.IOException; -import java.util.ArrayList; -import java.util.List; -import java.util.Optional; -import java.util.Properties; - +import com.google.common.collect.Lists; +import eu.dnetlib.dhp.application.ArgumentApplicationParser; import eu.dnetlib.dhp.oa.dedup.model.OrgSimRel; +import eu.dnetlib.dhp.schema.common.ModelSupport; +import eu.dnetlib.dhp.schema.oaf.Organization; +import eu.dnetlib.dhp.schema.oaf.Relation; +import eu.dnetlib.dhp.utils.ISLookupClientFactory; +import eu.dnetlib.enabling.is.lookup.rmi.ISLookUpService; import org.apache.commons.io.IOUtils; -import org.apache.http.client.methods.CloseableHttpResponse; -import org.apache.http.client.methods.HttpGet; -import org.apache.http.impl.client.CloseableHttpClient; -import org.apache.http.impl.client.HttpClients; import org.apache.spark.SparkConf; import org.apache.spark.api.java.function.MapFunction; import org.apache.spark.sql.Dataset; @@ -21,14 +17,11 @@ import org.apache.spark.sql.SaveMode; import org.apache.spark.sql.SparkSession; import org.slf4j.Logger; import org.slf4j.LoggerFactory; - -import eu.dnetlib.dhp.application.ArgumentApplicationParser; -import eu.dnetlib.dhp.schema.common.ModelSupport; -import eu.dnetlib.dhp.schema.oaf.Organization; -import eu.dnetlib.dhp.schema.oaf.Relation; -import eu.dnetlib.dhp.utils.ISLookupClientFactory; -import eu.dnetlib.enabling.is.lookup.rmi.ISLookUpService; import scala.Tuple2; +import scala.Tuple3; + +import java.io.IOException; +import java.util.*; public class SparkPrepareOrgRels extends AbstractSparkAction { @@ -67,10 +60,6 @@ public class SparkPrepareOrgRels extends AbstractSparkAction { .map(Integer::valueOf) .orElse(NUM_CONNECTIONS); - final String apiUrl = Optional - .ofNullable(parser.get("apiUrl")) - .orElse(""); - final String dbUrl = parser.get("dbUrl"); final String dbTable = parser.get("dbTable"); final String dbUser = parser.get("dbUser"); @@ -81,7 +70,6 @@ public class SparkPrepareOrgRels extends AbstractSparkAction { log.info("actionSetId: '{}'", actionSetId); log.info("workingPath: '{}'", workingPath); log.info("numPartitions: '{}'", numConnections); - log.info("apiUrl: '{}'", apiUrl); log.info("dbUrl: '{}'", dbUrl); log.info("dbUser: '{}'", dbUser); log.info("table: '{}'", dbTable); @@ -102,9 +90,6 @@ public class SparkPrepareOrgRels extends AbstractSparkAction { .mode(SaveMode.Overwrite) .jdbc(dbUrl, dbTable, connectionProperties); - if (!apiUrl.isEmpty()) - updateSimRels(apiUrl); - } public static Dataset createRelations( @@ -112,6 +97,105 @@ public class SparkPrepareOrgRels extends AbstractSparkAction { final String mergeRelsPath, final String entitiesPath) { + Dataset> entities = spark + .read() + .textFile(entitiesPath) + .map( + (MapFunction>) it -> { + Organization entity = OBJECT_MAPPER.readValue(it, Organization.class); + return new Tuple2<>(entity.getId(), entity); + }, + Encoders.tuple(Encoders.STRING(), Encoders.kryo(Organization.class))); + + Dataset> relations = spark + .createDataset( + spark + .read() + .load(mergeRelsPath) + .as(Encoders.bean(Relation.class)) + .where("relClass == 'merges'") + .toJavaRDD() + .mapToPair(r -> new Tuple2<>(r.getSource(), r.getTarget())) + .filter(t -> !t._2().contains("openorgsmesh")) + .groupByKey() + .map(g -> Lists.newArrayList(g._2())) + .filter(l -> l.size() > 1) + .flatMap(l -> { + String groupId = "group::" + UUID.randomUUID(); + List ids = sortIds(l); + List> rels = new ArrayList<>(); + + for (String source : ids) { + if (source.contains("openorgs____") || ids.indexOf(source) == 0) + for (String target : ids) { + rels.add(new Tuple3<>(source, target, groupId)); + } + } + return rels.iterator(); + }) + .rdd(), + Encoders.tuple(Encoders.STRING(), Encoders.STRING(), Encoders.STRING())); + + Dataset> relations2 = relations // + .joinWith(entities, relations.col("_2").equalTo(entities.col("_1")), "inner") + .map( + (MapFunction, Tuple2>, OrgSimRel>) r -> new OrgSimRel( + r._1()._1(), + r._2()._2().getOriginalId().get(0), + r._2()._2().getLegalname() != null ? r._2()._2().getLegalname().getValue() : "", + r._2()._2().getLegalshortname() != null ? r._2()._2().getLegalshortname().getValue() : "", + r._2()._2().getCountry() != null ? r._2()._2().getCountry().getClassid() : "", + r._2()._2().getWebsiteurl() != null ? r._2()._2().getWebsiteurl().getValue() : "", + r._2()._2().getCollectedfrom().get(0).getValue(), + r._1()._3()), + Encoders.bean(OrgSimRel.class)) + .map( + (MapFunction>) o -> new Tuple2<>(o.getLocal_id(), o), + Encoders.tuple(Encoders.STRING(), Encoders.bean(OrgSimRel.class))); + + return relations2 + .joinWith(entities, relations2.col("_1").equalTo(entities.col("_1")), "inner") + .map( + (MapFunction, Tuple2>, OrgSimRel>) r -> { + OrgSimRel orgSimRel = r._1()._2(); + orgSimRel.setLocal_id(r._2()._2().getOriginalId().get(0)); + return orgSimRel; + }, + Encoders.bean(OrgSimRel.class)); + + } + + // select best ids from the list. Priority: 1) openorgs, 2)corda, 3)alphabetic + public static List sortIds(List ids) { + + ids.sort((o1, o2) -> { + + if (o1.contains("openorgs____") && o2.contains("openorgs____")) + return o1.compareTo(o2); + if (o1.contains("corda") && o2.contains("corda")) + return o1.compareTo(o2); + + if (o1.contains("openorgs____")) + return -1; + if (o2.contains("openorgs____")) + return 1; + + if (o1.contains("corda")) + return -1; + if (o2.contains("corda")) + return 1; + + return o1.compareTo(o2); + }); + + return ids; + } + + public static Dataset createRelationsFromScratch( + final SparkSession spark, + final String mergeRelsPath, + final String entitiesPath) { + // Dataset> entities = spark .read() @@ -151,13 +235,14 @@ public class SparkPrepareOrgRels extends AbstractSparkAction { .joinWith(entities, relations.col("_2").equalTo(entities.col("_1")), "inner") .map( (MapFunction, Tuple2>, OrgSimRel>) r -> new OrgSimRel( - r._1()._1(), - r._2()._2().getOriginalId().get(0), - r._2()._2().getLegalname() != null ? r._2()._2().getLegalname().getValue() : "", - r._2()._2().getLegalshortname() != null ? r._2()._2().getLegalshortname().getValue() : "", - r._2()._2().getCountry() != null ? r._2()._2().getCountry().getClassid() : "", - r._2()._2().getWebsiteurl() != null ? r._2()._2().getWebsiteurl().getValue() : "", - r._2()._2().getCollectedfrom().get(0).getValue()), + r._1()._1(), + r._2()._2().getOriginalId().get(0), + r._2()._2().getLegalname() != null ? r._2()._2().getLegalname().getValue() : "", + r._2()._2().getLegalshortname() != null ? r._2()._2().getLegalshortname().getValue() : "", + r._2()._2().getCountry() != null ? r._2()._2().getCountry().getClassid() : "", + r._2()._2().getWebsiteurl() != null ? r._2()._2().getWebsiteurl().getValue() : "", + r._2()._2().getCollectedfrom().get(0).getValue(), + "group::" + r._1()._1()), Encoders.bean(OrgSimRel.class)) .map( (MapFunction>) o -> new Tuple2<>(o.getLocal_id(), o), @@ -175,16 +260,4 @@ public class SparkPrepareOrgRels extends AbstractSparkAction { } - private static String updateSimRels(final String apiUrl) throws IOException { - - log.info("Updating simrels on the portal"); - - final HttpGet req = new HttpGet(apiUrl); - try (final CloseableHttpClient client = HttpClients.createDefault()) { - try (final CloseableHttpResponse response = client.execute(req)) { - return IOUtils.toString(response.getEntity().getContent()); - } - } - } - } diff --git a/dhp-workflows/dhp-dedup-openaire/src/main/java/eu/dnetlib/dhp/oa/dedup/graph/ConnectedComponent.java b/dhp-workflows/dhp-dedup-openaire/src/main/java/eu/dnetlib/dhp/oa/dedup/graph/ConnectedComponent.java index 3d0d24d23..3f24adb93 100644 --- a/dhp-workflows/dhp-dedup-openaire/src/main/java/eu/dnetlib/dhp/oa/dedup/graph/ConnectedComponent.java +++ b/dhp-workflows/dhp-dedup-openaire/src/main/java/eu/dnetlib/dhp/oa/dedup/graph/ConnectedComponent.java @@ -6,13 +6,13 @@ import java.io.Serializable; import java.util.Set; import java.util.stream.Collectors; -import eu.dnetlib.dhp.utils.DHPUtils; import org.apache.commons.lang.StringUtils; import org.codehaus.jackson.annotate.JsonIgnore; import com.fasterxml.jackson.databind.ObjectMapper; import eu.dnetlib.dhp.oa.dedup.DedupUtility; +import eu.dnetlib.dhp.utils.DHPUtils; import eu.dnetlib.pace.util.PaceException; public class ConnectedComponent implements Serializable { diff --git a/dhp-workflows/dhp-dedup-openaire/src/main/java/eu/dnetlib/dhp/oa/dedup/model/Identifier.java b/dhp-workflows/dhp-dedup-openaire/src/main/java/eu/dnetlib/dhp/oa/dedup/model/Identifier.java index 95fd21c64..f5b2f48c5 100644 --- a/dhp-workflows/dhp-dedup-openaire/src/main/java/eu/dnetlib/dhp/oa/dedup/model/Identifier.java +++ b/dhp-workflows/dhp-dedup-openaire/src/main/java/eu/dnetlib/dhp/oa/dedup/model/Identifier.java @@ -7,6 +7,7 @@ import java.util.List; import java.util.Set; import java.util.stream.Collectors; +import com.google.common.collect.Sets; import eu.dnetlib.dhp.oa.dedup.IdGenerator; import eu.dnetlib.dhp.schema.common.EntityType; import eu.dnetlib.dhp.schema.oaf.KeyValue; @@ -95,8 +96,13 @@ public class Identifier implements Serializable, Comparable { // priority in comparisons: 1) pidtype, 2) collectedfrom (depending on the entity type) , 3) date 4) // alphabetical order of the originalID - Set lKeys = this.collectedFrom.stream().map(KeyValue::getKey).collect(Collectors.toSet()); - Set rKeys = i.getCollectedFrom().stream().map(KeyValue::getKey).collect(Collectors.toSet()); + Set lKeys = Sets.newHashSet(); + if (this.collectedFrom != null) + lKeys = this.collectedFrom.stream().map(KeyValue::getKey).collect(Collectors.toSet()); + + Set rKeys = Sets.newHashSet(); + if (i.getCollectedFrom() != null) + rKeys = i.getCollectedFrom().stream().map(KeyValue::getKey).collect(Collectors.toSet()); if (this.getType().compareTo(i.getType()) == 0) { // same type if (entityType == EntityType.publication) { diff --git a/dhp-workflows/dhp-dedup-openaire/src/main/java/eu/dnetlib/dhp/oa/dedup/model/OrgSimRel.java b/dhp-workflows/dhp-dedup-openaire/src/main/java/eu/dnetlib/dhp/oa/dedup/model/OrgSimRel.java index 50164ce4c..65f383500 100644 --- a/dhp-workflows/dhp-dedup-openaire/src/main/java/eu/dnetlib/dhp/oa/dedup/model/OrgSimRel.java +++ b/dhp-workflows/dhp-dedup-openaire/src/main/java/eu/dnetlib/dhp/oa/dedup/model/OrgSimRel.java @@ -12,12 +12,13 @@ public class OrgSimRel implements Serializable { String oa_country; String oa_url; String oa_collectedfrom; + String group_id; public OrgSimRel() { } public OrgSimRel(String local_id, String oa_original_id, String oa_name, String oa_acronym, String oa_country, - String oa_url, String oa_collectedfrom) { + String oa_url, String oa_collectedfrom, String group_id) { this.local_id = local_id; this.oa_original_id = oa_original_id; this.oa_name = oa_name; @@ -25,6 +26,7 @@ public class OrgSimRel implements Serializable { this.oa_country = oa_country; this.oa_url = oa_url; this.oa_collectedfrom = oa_collectedfrom; + this.group_id = group_id; } public String getLocal_id() { @@ -83,6 +85,14 @@ public class OrgSimRel implements Serializable { this.oa_collectedfrom = oa_collectedfrom; } + public String getGroup_id() { + return group_id; + } + + public void setGroup_id(String group_id) { + this.group_id = group_id; + } + @Override public String toString() { return "OrgSimRel{" + diff --git a/dhp-workflows/dhp-dedup-openaire/src/main/resources/eu/dnetlib/dhp/oa/dedup/orgsdedup/oozie_app/workflow.xml b/dhp-workflows/dhp-dedup-openaire/src/main/resources/eu/dnetlib/dhp/oa/dedup/orgsdedup/oozie_app/workflow.xml index ec9967d6a..e7c95ee8d 100644 --- a/dhp-workflows/dhp-dedup-openaire/src/main/resources/eu/dnetlib/dhp/oa/dedup/orgsdedup/oozie_app/workflow.xml +++ b/dhp-workflows/dhp-dedup-openaire/src/main/resources/eu/dnetlib/dhp/oa/dedup/orgsdedup/oozie_app/workflow.xml @@ -112,7 +112,7 @@ -pb - ${graphBasePath}/relation + /tmp/graph_openorgs_and_corda/relation ${workingPath}/${actionSetId}/organization_simrel @@ -194,6 +194,37 @@ --workingPath${workingPath} --isLookUpUrl${isLookUpUrl} --actionSetId${actionSetId} + --dbUrl${dbUrl} + --dbTable${dbTable} + --dbUser${dbUser} + --dbPwd${dbPwd} + --numConnections20 + + + + + + + + yarn + cluster + Prepare New Organizations + eu.dnetlib.dhp.oa.dedup.SparkPrepareNewOrgs + dhp-dedup-openaire-${projectVersion}.jar + + --executor-memory=${sparkExecutorMemory} + --executor-cores=${sparkExecutorCores} + --driver-memory=${sparkDriverMemory} + --conf spark.extraListeners=${spark2ExtraListeners} + --conf spark.sql.queryExecutionListeners=${spark2SqlQueryExecutionListeners} + --conf spark.yarn.historyServer.address=${spark2YarnHistoryServerAddress} + --conf spark.eventLog.dir=${nameNode}${spark2EventLogDir} + --conf spark.sql.shuffle.partitions=3840 + + --graphBasePath${graphBasePath} + --workingPath${workingPath} + --isLookUpUrl${isLookUpUrl} + --actionSetId${actionSetId} --apiUrl${apiUrl} --dbUrl${dbUrl} --dbTable${dbTable} diff --git a/dhp-workflows/dhp-dedup-openaire/src/main/resources/eu/dnetlib/dhp/oa/dedup/prepareNewOrgs_parameters.json b/dhp-workflows/dhp-dedup-openaire/src/main/resources/eu/dnetlib/dhp/oa/dedup/prepareNewOrgs_parameters.json index 2119cbc3a..b70d1af28 100644 --- a/dhp-workflows/dhp-dedup-openaire/src/main/resources/eu/dnetlib/dhp/oa/dedup/prepareNewOrgs_parameters.json +++ b/dhp-workflows/dhp-dedup-openaire/src/main/resources/eu/dnetlib/dhp/oa/dedup/prepareNewOrgs_parameters.json @@ -29,6 +29,12 @@ "paramDescription": "number of connections to the postgres db (for the write operation)", "paramRequired": false }, + { + "paramName": "au", + "paramLongName": "apiUrl", + "paramDescription": "the url for the APIs of the openorgs service", + "paramRequired": false + }, { "paramName": "du", "paramLongName": "dbUrl", diff --git a/dhp-workflows/dhp-dedup-openaire/src/main/resources/eu/dnetlib/dhp/oa/dedup/prepareOrgRels_parameters.json b/dhp-workflows/dhp-dedup-openaire/src/main/resources/eu/dnetlib/dhp/oa/dedup/prepareOrgRels_parameters.json index b70d1af28..2119cbc3a 100644 --- a/dhp-workflows/dhp-dedup-openaire/src/main/resources/eu/dnetlib/dhp/oa/dedup/prepareOrgRels_parameters.json +++ b/dhp-workflows/dhp-dedup-openaire/src/main/resources/eu/dnetlib/dhp/oa/dedup/prepareOrgRels_parameters.json @@ -29,12 +29,6 @@ "paramDescription": "number of connections to the postgres db (for the write operation)", "paramRequired": false }, - { - "paramName": "au", - "paramLongName": "apiUrl", - "paramDescription": "the url for the APIs of the openorgs service", - "paramRequired": false - }, { "paramName": "du", "paramLongName": "dbUrl", diff --git a/dhp-workflows/dhp-dedup-openaire/src/test/java/eu/dnetlib/dhp/oa/dedup/IdGeneratorTest.java b/dhp-workflows/dhp-dedup-openaire/src/test/java/eu/dnetlib/dhp/oa/dedup/IdGeneratorTest.java index 1bf851527..403498aeb 100644 --- a/dhp-workflows/dhp-dedup-openaire/src/test/java/eu/dnetlib/dhp/oa/dedup/IdGeneratorTest.java +++ b/dhp-workflows/dhp-dedup-openaire/src/test/java/eu/dnetlib/dhp/oa/dedup/IdGeneratorTest.java @@ -1,17 +1,6 @@ + package eu.dnetlib.dhp.oa.dedup; -import com.google.common.collect.Lists; -import eu.dnetlib.dhp.oa.dedup.model.Identifier; -import eu.dnetlib.dhp.oa.dedup.model.PidType; -import eu.dnetlib.dhp.schema.common.EntityType; -import eu.dnetlib.dhp.schema.oaf.KeyValue; -import eu.dnetlib.dhp.schema.oaf.Publication; -import eu.dnetlib.dhp.schema.oaf.Qualifier; -import eu.dnetlib.dhp.schema.oaf.StructuredProperty; -import eu.dnetlib.pace.util.MapDocumentUtil; -import org.codehaus.jackson.map.ObjectMapper; -import org.junit.jupiter.api.*; -import scala.Tuple2; import static org.junit.jupiter.api.Assertions.assertEquals; import java.io.BufferedReader; @@ -22,119 +11,149 @@ import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Date; import java.util.List; +import java.util.stream.Collectors; + +import org.codehaus.jackson.map.ObjectMapper; +import org.junit.jupiter.api.*; + +import com.google.common.collect.Lists; + +import eu.dnetlib.dhp.oa.dedup.model.Identifier; +import eu.dnetlib.dhp.oa.dedup.model.PidType; +import eu.dnetlib.dhp.schema.common.EntityType; +import eu.dnetlib.dhp.schema.oaf.KeyValue; +import eu.dnetlib.dhp.schema.oaf.Publication; +import eu.dnetlib.dhp.schema.oaf.Qualifier; +import eu.dnetlib.dhp.schema.oaf.StructuredProperty; +import eu.dnetlib.pace.util.MapDocumentUtil; +import scala.Tuple2; @TestMethodOrder(MethodOrderer.OrderAnnotation.class) public class IdGeneratorTest { - private static List bestIds; - private static List> pubs; + private static List bestIds; + private static List> pubs; - private static List bestIds2; - private static List bestIds3; + private static List bestIds2; + private static List bestIds3; - private static String testEntityBasePath; + private static String testEntityBasePath; - private static SimpleDateFormat sdf; - private static Date baseDate; + private static SimpleDateFormat sdf; + private static Date baseDate; - @BeforeAll - public static void setUp() throws Exception { + @BeforeAll + public static void setUp() throws Exception { - sdf = new SimpleDateFormat("yyyy-MM-dd"); - baseDate = sdf.parse("2000-01-01"); + sdf = new SimpleDateFormat("yyyy-MM-dd"); + baseDate = sdf.parse("2000-01-01"); - bestIds = new ArrayList<>(); - bestIds2 = Lists.newArrayList( - new Identifier(pid("pid1", "original", "original"), baseDate, PidType.original, keyValue("key", "value"), EntityType.publication, "50|originalID1"), - new Identifier(pid("pid2", "original", "original"), baseDate, PidType.original, keyValue("key", "value"), EntityType.publication, "50|originalID2"), - new Identifier(pid("pid3", "original", "original"), baseDate, PidType.original, keyValue("key", "value"), EntityType.publication, "50|originalID3") - ); - bestIds3 = Lists.newArrayList( - new Identifier(pid("pid1", "original", "original"), baseDate, PidType.original, keyValue("key", "value"), EntityType.publication, "50|originalID1"), - new Identifier(pid("pid2", "doi", "doi"), baseDate, PidType.doi, keyValue("key", "value"), EntityType.publication, "50|originalID2"), - new Identifier(pid("pid3", "original", "original"), baseDate, PidType.original, keyValue("key", "value"), EntityType.publication, "50|originalID3") - ); + bestIds = new ArrayList<>(); + bestIds2 = Lists + .newArrayList( + new Identifier(pid("pid1", "original", "original"), baseDate, PidType.original, + keyValue("key", "value"), EntityType.publication, "50|originalID1"), + new Identifier(pid("pid2", "original", "original"), baseDate, PidType.original, + keyValue("key", "value"), EntityType.publication, "50|originalID2"), + new Identifier(pid("pid3", "original", "original"), baseDate, PidType.original, + keyValue("key", "value"), EntityType.publication, "50|originalID3")); + bestIds3 = Lists + .newArrayList( + new Identifier(pid("pid1", "original", "original"), baseDate, PidType.original, + keyValue("key", "value"), EntityType.publication, "50|originalID1"), + new Identifier(pid("pid2", "doi", "doi"), baseDate, PidType.doi, keyValue("key", "value"), + EntityType.publication, "50|originalID2"), + new Identifier(pid("pid3", "original", "original"), baseDate, PidType.original, + keyValue("key", "value"), EntityType.publication, "50|originalID3")); - testEntityBasePath = Paths - .get(SparkDedupTest.class.getResource("/eu/dnetlib/dhp/dedup/json").toURI()) - .toFile() - .getAbsolutePath(); + testEntityBasePath = Paths + .get(SparkDedupTest.class.getResource("/eu/dnetlib/dhp/dedup/json").toURI()) + .toFile() + .getAbsolutePath(); - pubs = readSample(testEntityBasePath + "/publication_idgeneration.json", Publication.class); + pubs = readSample(testEntityBasePath + "/publication_idgeneration.json", Publication.class); - } + } - @Test - @Order(1) - public void bestPidToIdentifierTest(){ + @Test + @Order(1) + public void bestPidToIdentifierTest() { - List typesForAssertions = Lists.newArrayList(PidType.pmc.toString(), PidType.doi.toString(), PidType.doi.toString()); + List typesForAssertions = Lists + .newArrayList(PidType.pmc.toString(), PidType.doi.toString(), PidType.doi.toString()); - for (Tuple2 pub : pubs) { - List ids = IdGenerator.bestPidToIdentifier(pub._2()); - assertEquals(typesForAssertions.get(pubs.indexOf(pub)), ids.get(0).getPid().getQualifier().getClassid()); - bestIds.addAll(ids); - } - } + for (Tuple2 pub : pubs) { + List ids = IdGenerator.bestPidToIdentifier(pub._2()); + assertEquals(typesForAssertions.get(pubs.indexOf(pub)), ids.get(0).getPid().getQualifier().getClassid()); + bestIds.addAll(ids); + } + } - @Test - @Order(2) - public void generateIdTest1(){ - String id1 = IdGenerator.generate(bestIds, "50|defaultID"); + @Test + @Order(2) + public void generateIdTest1() { + String id1 = IdGenerator.generate(bestIds, "50|defaultID"); - assertEquals("50|dedup_doi___::84f2cc49e3af11f20952eae15cdae066", id1); - } + System.out.println("id list 1 = " + bestIds.stream().map(i -> i.getPid().getValue()).collect(Collectors.toList())); - @Test - public void generateIdTest2(){ - String id1 = IdGenerator.generate(bestIds2, "50|defaultID"); - String id2 = IdGenerator.generate(bestIds3, "50|defaultID"); + assertEquals("50|dedup_wf_001::9c5cfbf993d38476e0f959a301239719", id1); + } - assertEquals("50|dedup_wf_001::2c56cc1914bffdb30fdff354e0099612", id1); - assertEquals("50|dedup_doi___::128ead3ed8d9ecf262704b6fcf592b8d", id2); - } + @Test + public void generateIdTest2() { + String id1 = IdGenerator.generate(bestIds2, "50|defaultID"); + String id2 = IdGenerator.generate(bestIds3, "50|defaultID"); - public static List> readSample(String path, Class clazz) { - List> res = new ArrayList<>(); - BufferedReader reader; - try { - reader = new BufferedReader(new FileReader(path)); - String line = reader.readLine(); - while (line != null) { - res - .add( - new Tuple2<>( - MapDocumentUtil.getJPathString("$.id", line), - new ObjectMapper().readValue(line, clazz))); - // read next line - line = reader.readLine(); - } - reader.close(); - } catch (IOException e) { - e.printStackTrace(); - } + System.out.println("id list 2 = " + bestIds2.stream().map(i -> i.getPid().getValue()).collect(Collectors.toList())); + System.out.println("winner 2 = " + id1); + System.out.println("id list 3 = " + bestIds3.stream().map(i -> i.getPid().getValue()).collect(Collectors.toList())); + System.out.println("winner 3 = " + id2); - return res; - } + assertEquals("50|dedup_wf_001::2c56cc1914bffdb30fdff354e0099612", id1); + assertEquals("50|dedup_doi___::128ead3ed8d9ecf262704b6fcf592b8d", id2); + } - public static StructuredProperty pid(String pid, String classid, String classname){ + public static List> readSample(String path, Class clazz) { + List> res = new ArrayList<>(); + BufferedReader reader; + try { + reader = new BufferedReader(new FileReader(path)); + String line = reader.readLine(); + while (line != null) { + res + .add( + new Tuple2<>( + MapDocumentUtil.getJPathString("$.id", line), + new ObjectMapper().readValue(line, clazz))); + // read next line + line = reader.readLine(); + } + reader.close(); + } catch (IOException e) { + e.printStackTrace(); + } - StructuredProperty sp = new StructuredProperty(); - sp.setValue(pid); - Qualifier q = new Qualifier(); - q.setSchemeid(classid); - q.setSchemename(classname); - q.setClassname(classname); - q.setClassid(classid); - sp.setQualifier(q); - return sp; - } + return res; + } - public static List keyValue(String key, String value){ + public static StructuredProperty pid(String pid, String classid, String classname) { - KeyValue kv = new KeyValue(); - kv.setKey(key); - kv.setValue(value); - return Lists.newArrayList(kv); - } + StructuredProperty sp = new StructuredProperty(); + sp.setValue(pid); + Qualifier q = new Qualifier(); + q.setSchemeid(classid); + q.setSchemename(classname); + q.setClassname(classname); + q.setClassid(classid); + sp.setQualifier(q); + return sp; + } + + public static List keyValue(String key, String value) { + + KeyValue kv = new KeyValue(); + kv.setKey(key); + kv.setValue(value); + return Lists.newArrayList(kv); + } } diff --git a/dhp-workflows/dhp-dedup-openaire/src/test/java/eu/dnetlib/dhp/oa/dedup/SparkDedupTest.java b/dhp-workflows/dhp-dedup-openaire/src/test/java/eu/dnetlib/dhp/oa/dedup/SparkDedupTest.java index 6516eda52..b849160ff 100644 --- a/dhp-workflows/dhp-dedup-openaire/src/test/java/eu/dnetlib/dhp/oa/dedup/SparkDedupTest.java +++ b/dhp-workflows/dhp-dedup-openaire/src/test/java/eu/dnetlib/dhp/oa/dedup/SparkDedupTest.java @@ -1,18 +1,12 @@ package eu.dnetlib.dhp.oa.dedup; -import static java.nio.file.Files.createTempDirectory; - -import static org.apache.spark.sql.functions.count; -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.mockito.Mockito.lenient; - -import java.io.File; -import java.io.IOException; -import java.io.Serializable; -import java.net.URISyntaxException; -import java.nio.file.Paths; - +import com.fasterxml.jackson.databind.ObjectMapper; +import eu.dnetlib.dhp.application.ArgumentApplicationParser; +import eu.dnetlib.dhp.schema.oaf.Relation; +import eu.dnetlib.enabling.is.lookup.rmi.ISLookUpException; +import eu.dnetlib.enabling.is.lookup.rmi.ISLookUpService; +import eu.dnetlib.pace.util.MapDocumentUtil; import org.apache.commons.io.FileUtils; import org.apache.commons.io.IOUtils; import org.apache.spark.SparkConf; @@ -22,22 +16,28 @@ import org.apache.spark.api.java.JavaSparkContext; import org.apache.spark.api.java.function.FilterFunction; import org.apache.spark.api.java.function.MapFunction; import org.apache.spark.api.java.function.PairFunction; -import org.apache.spark.sql.*; +import org.apache.spark.sql.Dataset; +import org.apache.spark.sql.Encoders; +import org.apache.spark.sql.Row; +import org.apache.spark.sql.SparkSession; import org.junit.jupiter.api.*; import org.junit.jupiter.api.extension.ExtendWith; import org.mockito.Mock; import org.mockito.Mockito; import org.mockito.junit.jupiter.MockitoExtension; - -import com.fasterxml.jackson.databind.ObjectMapper; - -import eu.dnetlib.dhp.application.ArgumentApplicationParser; -import eu.dnetlib.dhp.schema.oaf.Relation; -import eu.dnetlib.enabling.is.lookup.rmi.ISLookUpException; -import eu.dnetlib.enabling.is.lookup.rmi.ISLookUpService; -import eu.dnetlib.pace.util.MapDocumentUtil; import scala.Tuple2; +import java.io.File; +import java.io.IOException; +import java.io.Serializable; +import java.net.URISyntaxException; +import java.nio.file.Paths; + +import static java.nio.file.Files.createTempDirectory; +import static org.apache.spark.sql.functions.count; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.mockito.Mockito.lenient; + @ExtendWith(MockitoExtension.class) @TestMethodOrder(MethodOrderer.OrderAnnotation.class) public class SparkDedupTest implements Serializable { From 708d887e64bcc2038d94d769fd2a025a850b3ebe Mon Sep 17 00:00:00 2001 From: miconis Date: Tue, 20 Oct 2020 15:12:19 +0200 Subject: [PATCH 12/12] minor changes --- .../test/java/eu/dnetlib/dhp/oa/dedup/EntityMergerTest.java | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/dhp-workflows/dhp-dedup-openaire/src/test/java/eu/dnetlib/dhp/oa/dedup/EntityMergerTest.java b/dhp-workflows/dhp-dedup-openaire/src/test/java/eu/dnetlib/dhp/oa/dedup/EntityMergerTest.java index 30b213ff2..c2bbf9e0e 100644 --- a/dhp-workflows/dhp-dedup-openaire/src/test/java/eu/dnetlib/dhp/oa/dedup/EntityMergerTest.java +++ b/dhp-workflows/dhp-dedup-openaire/src/test/java/eu/dnetlib/dhp/oa/dedup/EntityMergerTest.java @@ -53,6 +53,7 @@ public class EntityMergerTest implements Serializable { @Test public void softwareMergerTest() throws InstantiationException, IllegalAccessException { + List> softwares = readSample( testEntityBasePath + "/software_merge.json", Software.class); @@ -131,7 +132,6 @@ public class EntityMergerTest implements Serializable { assertEquals("50|dedup_doi___::0ca46ff10b2b4c756191719d85302b14", pub_merged.getId()); assertEquals(pub_merged.getAuthor().size(), 27); - } @Test @@ -142,7 +142,6 @@ public class EntityMergerTest implements Serializable { // verify id assertEquals("50|dedup_doi___::0ca46ff10b2b4c756191719d85302b14", pub_merged.getId()); - } @Test @@ -153,7 +152,6 @@ public class EntityMergerTest implements Serializable { // verify id assertEquals("50|dedup_wf_001::2d2bbbbcfb285e3fb3590237b79e2fa8", pub_merged.getId()); - } @Test @@ -164,7 +162,6 @@ public class EntityMergerTest implements Serializable { // verify id assertEquals("50|dedup_wf_001::584b89679c3ccd1015b647ec63cc2699", pub_merged.getId()); - } public DataInfo setDI() {