forked from D-Net/dnet-hadoop
Merge pull request 'mapping relationship from trasformed records based on `oaf:relation`' (#219) from oaf_relation_mapping into beta
Reviewed-on: D-Net/dnet-hadoop#219
This commit is contained in:
commit
875ae29961
|
@ -18,14 +18,7 @@ import static eu.dnetlib.dhp.schema.oaf.utils.OafMapperUtils.oaiIProvenance;
|
||||||
import static eu.dnetlib.dhp.schema.oaf.utils.OafMapperUtils.qualifier;
|
import static eu.dnetlib.dhp.schema.oaf.utils.OafMapperUtils.qualifier;
|
||||||
import static eu.dnetlib.dhp.schema.oaf.utils.OafMapperUtils.structuredProperty;
|
import static eu.dnetlib.dhp.schema.oaf.utils.OafMapperUtils.structuredProperty;
|
||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.*;
|
||||||
import java.util.Arrays;
|
|
||||||
import java.util.Date;
|
|
||||||
import java.util.HashMap;
|
|
||||||
import java.util.List;
|
|
||||||
import java.util.Map;
|
|
||||||
import java.util.Optional;
|
|
||||||
import java.util.Set;
|
|
||||||
|
|
||||||
import org.apache.commons.lang3.StringUtils;
|
import org.apache.commons.lang3.StringUtils;
|
||||||
import org.dom4j.*;
|
import org.dom4j.*;
|
||||||
|
@ -35,6 +28,7 @@ import com.google.common.collect.Sets;
|
||||||
|
|
||||||
import eu.dnetlib.dhp.common.vocabulary.VocabularyGroup;
|
import eu.dnetlib.dhp.common.vocabulary.VocabularyGroup;
|
||||||
import eu.dnetlib.dhp.schema.common.ModelConstants;
|
import eu.dnetlib.dhp.schema.common.ModelConstants;
|
||||||
|
import eu.dnetlib.dhp.schema.common.ModelSupport;
|
||||||
import eu.dnetlib.dhp.schema.oaf.AccessRight;
|
import eu.dnetlib.dhp.schema.oaf.AccessRight;
|
||||||
import eu.dnetlib.dhp.schema.oaf.Author;
|
import eu.dnetlib.dhp.schema.oaf.Author;
|
||||||
import eu.dnetlib.dhp.schema.oaf.Context;
|
import eu.dnetlib.dhp.schema.oaf.Context;
|
||||||
|
@ -199,8 +193,13 @@ public abstract class AbstractMdRecordToOafMapper {
|
||||||
final List<Oaf> oafs = Lists.newArrayList(entity);
|
final List<Oaf> oafs = Lists.newArrayList(entity);
|
||||||
|
|
||||||
if (!oafs.isEmpty()) {
|
if (!oafs.isEmpty()) {
|
||||||
oafs.addAll(addProjectRels(doc, entity));
|
Set<Oaf> rels = Sets.newHashSet();
|
||||||
oafs.addAll(addOtherResultRels(doc, entity));
|
|
||||||
|
rels.addAll(addProjectRels(doc, entity));
|
||||||
|
rels.addAll(addOtherResultRels(doc, entity));
|
||||||
|
rels.addAll(addRelations(doc, entity));
|
||||||
|
|
||||||
|
oafs.addAll(rels);
|
||||||
}
|
}
|
||||||
|
|
||||||
return oafs;
|
return oafs;
|
||||||
|
@ -278,6 +277,46 @@ public abstract class AbstractMdRecordToOafMapper {
|
||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private List<Oaf> addRelations(Document doc, OafEntity entity) {
|
||||||
|
|
||||||
|
final List<Oaf> rels = Lists.newArrayList();
|
||||||
|
|
||||||
|
for (Object o : doc.selectNodes("//oaf:relation")) {
|
||||||
|
Element element = (Element) o;
|
||||||
|
|
||||||
|
final String target = StringUtils.trim(element.getText());
|
||||||
|
final String relType = element.attributeValue("relType");
|
||||||
|
final String subRelType = element.attributeValue("subRelType");
|
||||||
|
final String relClass = element.attributeValue("relClass");
|
||||||
|
|
||||||
|
if (StringUtils.isNotBlank(target) && StringUtils.isNotBlank(relType) && StringUtils.isNotBlank(subRelType)
|
||||||
|
&& StringUtils.isNotBlank(relClass)) {
|
||||||
|
|
||||||
|
final String relClassInverse = ModelSupport
|
||||||
|
.findInverse(ModelSupport.rel(relType, subRelType, relClass))
|
||||||
|
.getInverseRelClass();
|
||||||
|
final String validationdDate = ((Node) o).valueOf("@validationDate");
|
||||||
|
|
||||||
|
if (StringUtils.isNotBlank(target)) {
|
||||||
|
final String targetType = element.attributeValue("targetType");
|
||||||
|
if (StringUtils.isNotBlank(targetType)) {
|
||||||
|
final String targetId = createOpenaireId(targetType, target, true);
|
||||||
|
rels
|
||||||
|
.add(
|
||||||
|
getRelation(
|
||||||
|
entity.getId(), targetId, relType, subRelType, relClass, entity, validationdDate));
|
||||||
|
rels
|
||||||
|
.add(
|
||||||
|
getRelation(
|
||||||
|
targetId, entity.getId(), relType, subRelType, relClassInverse, entity,
|
||||||
|
validationdDate));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return rels;
|
||||||
|
}
|
||||||
|
|
||||||
protected Relation getRelation(final String source,
|
protected Relation getRelation(final String source,
|
||||||
final String target,
|
final String target,
|
||||||
final String relType,
|
final String relType,
|
||||||
|
|
|
@ -57,14 +57,10 @@ class MappersTest {
|
||||||
|
|
||||||
final List<Oaf> list = new OafToOafMapper(vocs, false, true).processMdRecord(xml);
|
final List<Oaf> list = new OafToOafMapper(vocs, false, true).processMdRecord(xml);
|
||||||
|
|
||||||
assertEquals(3, list.size());
|
assertEquals(1, list.stream().filter(o -> o instanceof Publication).count());
|
||||||
assertTrue(list.get(0) instanceof Publication);
|
assertEquals(4, list.stream().filter(o -> o instanceof Relation).count());
|
||||||
assertTrue(list.get(1) instanceof Relation);
|
|
||||||
assertTrue(list.get(2) instanceof Relation);
|
|
||||||
|
|
||||||
final Publication p = (Publication) list.get(0);
|
Publication p = (Publication) list.stream().filter(o -> o instanceof Publication).findFirst().get();
|
||||||
final Relation r1 = (Relation) list.get(1);
|
|
||||||
final Relation r2 = (Relation) list.get(2);
|
|
||||||
|
|
||||||
assertValidId(p.getId());
|
assertValidId(p.getId());
|
||||||
|
|
||||||
|
@ -125,26 +121,58 @@ class MappersTest {
|
||||||
|
|
||||||
assertNotNull(p.getBestaccessright());
|
assertNotNull(p.getBestaccessright());
|
||||||
assertEquals("OPEN", p.getBestaccessright().getClassid());
|
assertEquals("OPEN", p.getBestaccessright().getClassid());
|
||||||
assertValidId(r1.getSource());
|
|
||||||
assertValidId(r1.getTarget());
|
// RESULT PROJECT
|
||||||
assertValidId(r2.getSource());
|
List<Relation> resultProject = list
|
||||||
assertValidId(r2.getTarget());
|
.stream()
|
||||||
assertValidId(r1.getCollectedfrom().get(0).getKey());
|
.filter(o -> o instanceof Relation)
|
||||||
assertValidId(r2.getCollectedfrom().get(0).getKey());
|
.map(o -> (Relation) o)
|
||||||
assertNotNull(r1.getDataInfo());
|
.filter(r -> ModelConstants.RESULT_PROJECT.equals(r.getRelType()))
|
||||||
assertNotNull(r2.getDataInfo());
|
.collect(Collectors.toList());
|
||||||
assertNotNull(r1.getDataInfo().getTrust());
|
|
||||||
assertNotNull(r2.getDataInfo().getTrust());
|
assertEquals(2, resultProject.size());
|
||||||
assertEquals(r1.getSource(), r2.getTarget());
|
final Relation rp1 = resultProject.get(0);
|
||||||
assertEquals(r2.getSource(), r1.getTarget());
|
final Relation rp2 = resultProject.get(1);
|
||||||
assertTrue(StringUtils.isNotBlank(r1.getRelClass()));
|
|
||||||
assertTrue(StringUtils.isNotBlank(r2.getRelClass()));
|
verifyRelation(rp1);
|
||||||
assertTrue(StringUtils.isNotBlank(r1.getRelType()));
|
verifyRelation(rp2);
|
||||||
assertTrue(StringUtils.isNotBlank(r2.getRelType()));
|
|
||||||
assertTrue(r1.getValidated());
|
assertTrue(rp1.getValidated());
|
||||||
assertTrue(r2.getValidated());
|
assertTrue(rp2.getValidated());
|
||||||
assertEquals("2020-01-01", r1.getValidationDate());
|
assertEquals("2020-01-01", rp1.getValidationDate());
|
||||||
assertEquals("2020-01-01", r2.getValidationDate());
|
assertEquals("2020-01-01", rp2.getValidationDate());
|
||||||
|
|
||||||
|
assertEquals(rp1.getSource(), rp2.getTarget());
|
||||||
|
assertEquals(rp2.getSource(), rp1.getTarget());
|
||||||
|
|
||||||
|
// AFFILIATIONS
|
||||||
|
List<Relation> affiliation = list
|
||||||
|
.stream()
|
||||||
|
.filter(o -> o instanceof Relation)
|
||||||
|
.map(o -> (Relation) o)
|
||||||
|
.filter(r -> ModelConstants.RESULT_ORGANIZATION.equals(r.getRelType()))
|
||||||
|
.collect(Collectors.toList());
|
||||||
|
|
||||||
|
assertEquals(2, affiliation.size());
|
||||||
|
final Relation aff1 = affiliation.get(0);
|
||||||
|
final Relation aff2 = affiliation.get(1);
|
||||||
|
|
||||||
|
verifyRelation(aff1);
|
||||||
|
verifyRelation(aff2);
|
||||||
|
|
||||||
|
assertEquals(aff1.getSource(), aff2.getTarget());
|
||||||
|
assertEquals(aff2.getSource(), aff1.getTarget());
|
||||||
|
}
|
||||||
|
|
||||||
|
private void verifyRelation(Relation r) {
|
||||||
|
assertValidId(r.getSource());
|
||||||
|
assertValidId(r.getTarget());
|
||||||
|
assertValidId(r.getCollectedfrom().get(0).getKey());
|
||||||
|
assertNotNull(r.getDataInfo());
|
||||||
|
assertNotNull(r.getDataInfo().getTrust());
|
||||||
|
assertTrue(StringUtils.isNotBlank(r.getRelClass()));
|
||||||
|
assertTrue(StringUtils.isNotBlank(r.getRelType()));
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
|
|
|
@ -60,6 +60,15 @@
|
||||||
<oaf:fulltext>https://oneecosystem.pensoft.net/article/13718/</oaf:fulltext>
|
<oaf:fulltext>https://oneecosystem.pensoft.net/article/13718/</oaf:fulltext>
|
||||||
<oaf:journal eissn="2367-8194" issn="">One Ecosystem</oaf:journal>
|
<oaf:journal eissn="2367-8194" issn="">One Ecosystem</oaf:journal>
|
||||||
<oaf:refereed>0001</oaf:refereed>
|
<oaf:refereed>0001</oaf:refereed>
|
||||||
|
<oaf:relation relClass="hasAuthorInstitution"
|
||||||
|
relType="resultOrganization"
|
||||||
|
subRelType="affiliation"
|
||||||
|
targetType="organization">ror_________::https://ror.org/02gdcn153</oaf:relation>
|
||||||
|
<oaf:relation relClass="isProducedBy"
|
||||||
|
relType="resultProject"
|
||||||
|
subRelType="outcome"
|
||||||
|
targetType="project"
|
||||||
|
validationDate="2020-01-01">corda_______::226852</oaf:relation>
|
||||||
</metadata>
|
</metadata>
|
||||||
<about xmlns:oai="http://www.openarchives.org/OAI/2.0/">
|
<about xmlns:oai="http://www.openarchives.org/OAI/2.0/">
|
||||||
<provenance xmlns="http://www.openarchives.org/OAI/2.0/provenance" xsi:schemaLocation="http://www.openarchives.org/OAI/2.0/provenance http://www.openarchives.org/OAI/2.0/provenance.xsd">
|
<provenance xmlns="http://www.openarchives.org/OAI/2.0/provenance" xsi:schemaLocation="http://www.openarchives.org/OAI/2.0/provenance http://www.openarchives.org/OAI/2.0/provenance.xsd">
|
||||||
|
|
Loading…
Reference in New Issue