diff --git a/dhp-workflows/dhp-aggregation/src/main/java/eu/dnetlib/dhp/actionmanager/datacite/DataciteToOAFTransformation.scala b/dhp-workflows/dhp-aggregation/src/main/java/eu/dnetlib/dhp/actionmanager/datacite/DataciteToOAFTransformation.scala index aab2488a3..6005c7e95 100644 --- a/dhp-workflows/dhp-aggregation/src/main/java/eu/dnetlib/dhp/actionmanager/datacite/DataciteToOAFTransformation.scala +++ b/dhp-workflows/dhp-aggregation/src/main/java/eu/dnetlib/dhp/actionmanager/datacite/DataciteToOAFTransformation.scala @@ -3,9 +3,8 @@ package eu.dnetlib.dhp.actionmanager.datacite import com.fasterxml.jackson.databind.ObjectMapper import eu.dnetlib.dhp.common.vocabulary.VocabularyGroup import eu.dnetlib.dhp.schema.action.AtomicAction -import eu.dnetlib.dhp.schema.common.{ModelConstants, ModelSupport} import eu.dnetlib.dhp.schema.common.ModelConstants -import eu.dnetlib.dhp.schema.oaf.utils.{IdentifierFactory, OafMapperUtils, PidType} +import eu.dnetlib.dhp.schema.oaf.utils.{IdentifierFactory, OafMapperUtils} import eu.dnetlib.dhp.schema.oaf.{AccessRight, Author, DataInfo, Instance, KeyValue, Oaf, OtherResearchProduct, Publication, Qualifier, Relation, Result, Software, StructuredProperty, Dataset => OafDataset} import eu.dnetlib.dhp.utils.DHPUtils import org.apache.commons.lang3.StringUtils @@ -17,8 +16,9 @@ import java.nio.charset.CodingErrorAction import java.text.SimpleDateFormat import java.time.LocalDate import java.time.format.DateTimeFormatter -import java.util.{Date, Locale} +import java.util import java.util.regex.Pattern +import java.util.{Date, Locale} import scala.collection.JavaConverters._ import scala.io.{Codec, Source} @@ -46,32 +46,32 @@ object DataciteToOAFTransformation { val REL_TYPE_VALUE:String = "resultResult" - val subRelTypeMapping: Map[String,String] = Map( - "References" ->"relationship", - "IsSupplementTo" ->"supplement", - "IsPartOf" ->"part", - "HasPart" ->"part", - "IsVersionOf" ->"version", - "HasVersion" ->"version", - "IsIdenticalTo" ->"relationship", - "IsPreviousVersionOf" ->"version", - "IsContinuedBy" ->"relationship", - "Continues" ->"relationship", - "IsNewVersionOf" ->"version", - "IsSupplementedBy" ->"supplement", - "IsDocumentedBy" ->"relationship", - "IsSourceOf" ->"relationship", - "Cites" ->"citation", - "IsCitedBy" ->"citation", - "IsDerivedFrom" ->"relationship", - "IsVariantFormOf" ->"version", - "IsReferencedBy" ->"relationship", - "IsObsoletedBy" ->"version", - "Reviews" ->"review", - "Documents" ->"relationship", - "IsCompiledBy" ->"relationship", - "Compiles" ->"relationship", - "IsReviewedBy" ->"review" + val subRelTypeMapping: Map[String,(String,String)] = Map( + "References" ->("IsReferencedBy","relationship"), + "IsSupplementTo" ->("IsSupplementedBy","supplement"), + "IsPartOf" ->("HasPart","part"), + "HasPart" ->("IsPartOf","part"), + "IsVersionOf" ->("HasVersion","version"), + "HasVersion" ->("IsVersionOf","version"), + "IsIdenticalTo" ->("IsIdenticalTo","relationship"), + "IsPreviousVersionOf" ->("IsNewVersionOf","version"), + "IsContinuedBy" ->("Continues","relationship"), + "Continues" ->("IsContinuedBy","relationship"), + "IsNewVersionOf" ->("IsPreviousVersionOf","version"), + "IsSupplementedBy" ->("IsSupplementTo","supplement"), + "IsDocumentedBy" ->("Documents","relationship"), + "IsSourceOf" ->("IsDerivedFrom","relationship"), + "Cites" ->("IsCitedBy","citation"), + "IsCitedBy" ->("Cites","citation"), + "IsDerivedFrom" ->("IsSourceOf","relationship"), + "IsVariantFormOf" ->("IsDerivedFrom","version"), + "IsReferencedBy" ->("References","relationship"), + "IsObsoletedBy" ->("IsNewVersionOf","version"), + "Reviews" ->("IsReviewedBy","review"), + "Documents" ->("IsDocumentedBy","relationship"), + "IsCompiledBy" ->("Compiles","relationship"), + "Compiles" ->("IsCompiledBy","relationship"), + "IsReviewedBy" ->("Reviews","review") ) implicit val codec: Codec = Codec("UTF-8") @@ -523,26 +523,7 @@ val REL_TYPE_VALUE:String = "resultResult" } yield RelatedIdentifierType(relationType, relatedIdentifier, relatedIdentifierType) - relations = relations ::: rels - .filter(r => - subRelTypeMapping.contains(r.relationType) && ( - r.relatedIdentifierType.equalsIgnoreCase("doi") || - r.relatedIdentifierType.equalsIgnoreCase("pmid") || - r.relatedIdentifierType.equalsIgnoreCase("arxiv") ) - ) - .map(r => { - val rel = new Relation - - val subRelType = subRelTypeMapping.get(r.relationType) - rel.setRelType(REL_TYPE_VALUE) - rel.setSubRelType(subRelType.get) - rel.setRelClass(r.relationType) - rel.setSource(result.getId) - rel.setCollectedfrom(List(DATACITE_COLLECTED_FROM).asJava) - rel.setDataInfo(dataInfo) - rel.setTarget(createDNetTargetIdentifier(r.relatedIdentifier, r.relatedIdentifierType, "50|")) - rel - }) + relations = relations ::: generateRelations(rels,result.getId) } if (relations != null && relations.nonEmpty) { List(result) ::: relations @@ -551,6 +532,47 @@ val REL_TYPE_VALUE:String = "resultResult" List(result) } + private def generateRelations(rels: List[RelatedIdentifierType], id:String):List[Relation] = { + rels + .filter(r => + subRelTypeMapping.contains(r.relationType) && ( + r.relatedIdentifierType.equalsIgnoreCase("doi") || + r.relatedIdentifierType.equalsIgnoreCase("pmid") || + r.relatedIdentifierType.equalsIgnoreCase("arxiv")) + ) + .flatMap(r => { + val rel = new Relation + val inverseRel = new Relation + rel.setCollectedfrom(List(DATACITE_COLLECTED_FROM).asJava) + rel.setDataInfo(dataInfo) + + inverseRel.setCollectedfrom(List(DATACITE_COLLECTED_FROM).asJava) + inverseRel.setDataInfo(dataInfo) + + val subRelType = subRelTypeMapping(r.relationType)._2 + val inverseRelSemantic = subRelTypeMapping(r.relationType)._1 + val inversesubRelType = subRelTypeMapping(inverseRelSemantic)._2 + + + rel.setRelType(REL_TYPE_VALUE) + rel.setSubRelType(subRelType) + rel.setRelClass(r.relationType) + + + inverseRel.setRelType(REL_TYPE_VALUE) + inverseRel.setSubRelType(inversesubRelType) + inverseRel.setRelClass(inverseRelSemantic) + + rel.setSource(id) + rel.setTarget(createDNetTargetIdentifier(r.relatedIdentifier, r.relatedIdentifierType, "50|")) + + inverseRel.setTarget(id) + inverseRel.setSource(createDNetTargetIdentifier(r.relatedIdentifier, r.relatedIdentifierType, "50|")) + + List(rel, inverseRel) + }) + } + def generateDataInfo(trust: String): DataInfo = { val di = new DataInfo di.setDeletedbyinference(false) diff --git a/dhp-workflows/dhp-aggregation/src/main/resources/eu/dnetlib/dhp/actionmanager/datacite/generate_dataset_params.json b/dhp-workflows/dhp-aggregation/src/main/resources/eu/dnetlib/dhp/actionmanager/datacite/generate_dataset_params.json index dea037fd4..67e7f37dc 100644 --- a/dhp-workflows/dhp-aggregation/src/main/resources/eu/dnetlib/dhp/actionmanager/datacite/generate_dataset_params.json +++ b/dhp-workflows/dhp-aggregation/src/main/resources/eu/dnetlib/dhp/actionmanager/datacite/generate_dataset_params.json @@ -23,5 +23,12 @@ "paramLongName": "isLookupUrl", "paramDescription": "the isLookup URL", "paramRequired": true + }, + { + "paramName": "l", + "paramLongName": "exportLinks", + "paramDescription": "should export also links", + "paramRequired": false } + ] \ No newline at end of file diff --git a/dhp-workflows/dhp-aggregation/src/main/resources/eu/dnetlib/dhp/actionmanager/datacite/oozie_app/workflow.xml b/dhp-workflows/dhp-aggregation/src/main/resources/eu/dnetlib/dhp/actionmanager/datacite/oozie_app/workflow.xml index 30a7448a8..036178b37 100644 --- a/dhp-workflows/dhp-aggregation/src/main/resources/eu/dnetlib/dhp/actionmanager/datacite/oozie_app/workflow.xml +++ b/dhp-workflows/dhp-aggregation/src/main/resources/eu/dnetlib/dhp/actionmanager/datacite/oozie_app/workflow.xml @@ -16,7 +16,7 @@ - + Action failed, error message[${wf:errorMessage(wf:lastErrorNode())}] @@ -70,6 +70,7 @@ --sourcePath${mainPath}/datacite_dump --targetPath${mainPath}/datacite_oaf --isLookupUrl${isLookupUrl} + --exportLinkstrue --masteryarn-cluster