diff --git a/src/main/java/eu/dnetlib/dhp/schema/oaf/Relation.java b/src/main/java/eu/dnetlib/dhp/schema/oaf/Relation.java index 17f1378..11812da 100644 --- a/src/main/java/eu/dnetlib/dhp/schema/oaf/Relation.java +++ b/src/main/java/eu/dnetlib/dhp/schema/oaf/Relation.java @@ -9,18 +9,21 @@ import java.util.Objects; /** * Relation models any edge between two nodes in the OpenAIRE graph. It has a source id and a target id pointing to - * graph node identifiers and it is further characterised by the semantic of the link through the fields relType, + * graph node identifiers, and it is further characterised by the semantic of the link through the fields relType, * subRelType and relClass. Provenance information is modeled according to the dataInfo element and collectedFrom, while * individual relationship types can provide extra information via the properties field. */ public class Relation extends Oaf implements Serializable { + public enum RELTYPE { resultResult, resultProject, resultOrganization, projectOrganization, datasourceOrganization + + //TODO organizationOrganization ???? } public enum SUBRELTYPE { @@ -36,8 +39,7 @@ public class Relation extends Oaf implements Serializable { similarity, supplement, version; - - public boolean exists(String subreltype) { + public static boolean exists(String subreltype) { try { SUBRELTYPE.valueOf(subreltype); return true; @@ -83,6 +85,7 @@ public class Relation extends Oaf implements Serializable { IsVariantFormOf, isProducedBy, IsMetadataFor, + HasAssociationWith, Cites, IsRequiredBy, IsOriginalFormOf, @@ -95,6 +98,7 @@ public class Relation extends Oaf implements Serializable { IsDerivedFrom, Obsoletes, Reviews, + isSimilarTo, produces; public static boolean exists(String relclass) { @@ -105,6 +109,75 @@ public class Relation extends Oaf implements Serializable { return false; } } + @Transient + public SUBRELTYPE getSubRel() { + switch (this) { + case isParticipant: + case hasParticipant: + return SUBRELTYPE.participation; + case isAuthorInstitutionOf: + case hasAuthorInstitution: + return SUBRELTYPE.affiliation; + case isMergedIn: + case merges: + case isSimilarTo: + return SUBRELTYPE.dedup; + case isProducedBy: + case produces: + return SUBRELTYPE.outcome; + case isProvidedBy: + case provides: + return SUBRELTYPE.provision; + case IsAmongTopNSimilarDocuments: + case HasAmongTopNSimilarDocuments: + return SUBRELTYPE.similarity; + case IsSupplementedBy: + case IsSupplementTo: + return SUBRELTYPE.supplement; + case IsPartOf: + case HasPart: + return SUBRELTYPE.part; + case IsCitedBy: + case Cites: + return SUBRELTYPE.citation; + case IsIdenticalTo: + case IsReferencedBy: + case References: + case IsContinuedBy: + case Continues: + case IsDocumentedBy: + case Documents: + case IsDerivedFrom: + case IsSourceOf: + case IsRelatedTo: + case IsCompiledBy: + case Compiles: + case IsDescribedBy: + case Describes: + case IsMetadataFor: + case IsMetadataOf: + case HasAssociationWith: + case IsRequiredBy: + case Requires: + case IsChildOf: + case IsParentOf: + return SUBRELTYPE.relationship; + case IsPreviousVersionOf: + case IsNewVersionOf: + case IsVariantFormOf: + case IsOriginalFormOf: + case IsObsoletedBy: + case Obsoletes: + case IsVersionOf: + case HasVersion: + return SUBRELTYPE.version; + case IsReviewedBy: + case Reviews: + return SUBRELTYPE.review; + } + // makes the compiler happy + throw new IllegalArgumentException("missing SubRel mapping for" + this); + } @Transient public RELCLASS getInverse() { @@ -341,6 +414,20 @@ public class Relation extends Oaf implements Serializable { && target.equals(relation.target); } + public Relation inverse() { + final Relation inverse = new Relation(); + inverse.setSource(this.target); + inverse.setTarget(this.source); + inverse.setRelClass(this.relClass.getInverse()); + inverse.setRelType(this.relType); + inverse.setSubRelType(this.subRelType); + inverse.setProperties(this.properties); + inverse.setValidated(validated); + inverse.setProvenance(provenance); + inverse.setValidationDate(validationDate); + return inverse; + } + @Override public int hashCode() { return Objects.hash(relType, subRelType, relClass, source, target, provenance); diff --git a/src/test/java/eu/dnetlib/dhp/schema/oaf/RelationTest.java b/src/test/java/eu/dnetlib/dhp/schema/oaf/RelationTest.java new file mode 100644 index 0000000..6b14242 --- /dev/null +++ b/src/test/java/eu/dnetlib/dhp/schema/oaf/RelationTest.java @@ -0,0 +1,26 @@ +package eu.dnetlib.dhp.schema.oaf; + +import static org.junit.jupiter.api.Assertions.*; + +import org.junit.jupiter.api.Test; + +public class RelationTest { + + @Test + public void checkExistRelType() { + assertTrue(Relation.SUBRELTYPE.exists(Relation.SUBRELTYPE.dedup.toString())); + assertFalse(Relation.SUBRELTYPE.exists("foo")); + + } + @Test + public void checSubRelType() { + Relation.RELCLASS rc = Relation.RELCLASS.merges; + assertEquals(Relation.SUBRELTYPE.dedup, rc.getSubRel()); + + for (Relation.RELCLASS value : Relation.RELCLASS.values()) { + System.out.printf("%s => %s\n", value, value.getSubRel()); + + } + } + +}