mapping relationship from trasformed records based on oaf:relation
#219
|
@ -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
you here assume the attribute targetType will be in the result once this method will run. Is it correct?
We assume the presence of the
targetType
attribute is part of theoaf:relation
specification, just like the other attributes. I suppose it is reasonable to assume to know, when defining the transformation rules, the main entity type at which a relationsh will refer to.