diff --git a/CHANGES.md b/CHANGES.md index e229bec..5fce58f 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -2,15 +2,27 @@ ## Changelog -| **Version** | **Changes** | **Readiness** | -|---|---|---| -| 2.7.14 | [Graph model]
Relation types are now inspired by the Datacite definitions https://schema.datacite.org/meta/kernel-4.4/doc/DataCite-MetadataKernel_v4.4.pdf
The changes involve the values stored in `relation.subRelType` and `relation.relClass`:
Updated the casing of the following terms (`relation.relClass`):
1. `isSupplementTo -> IsSupplementTo` / `isSupplementedBy -> IsSupplementedBy`
2. `isPartOf -> IsPartOf` / `hasPart -> HasPart`
3. `cites -> Cites` / `isCitedBy -> IsCitedBy`
4. `reviews -> Reviews` / `isReviewedBy -> IsReviewedBy`
Added the following terms [`subRelType: relClass / relClass (inverse)`]:
1. `relationship: References / IsReferencedBy`
2. `relationship: IsIdenticalTo`
3. `relationship: IsContinuedBy / Continues`
4. `relationship: IsDocumentedBy / Documents`
5. `relationship: Documents / IsDocumentedBy`
6. `relationship: IsCompiledBy / Compiles`
7. `version: IsPreviousVersionOf / IsNewVersionOf`
8. `version: IsSourceOf / IsDerivedFrom`
9. `version: IsVariantFormOf / IsOriginalFormOf`
10. `version: IsObsoletedBy / Obsoletes`
11. `version: IsVersionOf / HasVersion` | beta | -| 2.6.14 | [Scholexplorer]
1. Added model classes for Scholexplorer, package `eu.dnetlib.dhp.schema.sx` | production | -| 2.6.13 | 1. `Result.mergeFrom` handles field `dateOfAcceptance` | production | -| 2.5.12 | 1. delegating the date parsing to https://github.com/sisyphsu/dateparser | production | -| 2.5.[11-9] | 1. support for more date formats
2. enable the possibility to extend the date formats used to parse `Relation.validationDate` | production | -| 2.4.8 | 1. added constant for ORCID datasource name | production | -| 2.4.7 | refactoring | production | -| 2.3.6 | [Aggregation]
1. introduced MetadataStoreManager (MdSM) model classes| production | -| 2.2.5 | [Graph model]
1. introduced fields `Instance.pid` and `Instance.alternateIdentifier`
2. `LicenseComparator` renamed as `AccessRightComparator`
3. introduced `AccessRight` model class defining the `OpenAccessRoute` field to keep track of the OpenAccess color at the `Instance` level
4. `ExternalReference` cleanup (removed description, added alternateLabel(s))
5. added several ModelConstants
[Aggregation]
7. introduced MDStore record model classes
8. Introduced ORCID specific model classes | production | -| 2.2.4 | 1. ORCID specific model classes backported in the version used in PROD
2. added constant for dnet:externalReference_typologies
3. added constant for ORCID datasource name
4. `Result.mergeFrom` handles field `dateOfAcceptance` | production | +| **Version** | **Changes** | **Readiness** | +|--------------|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|---| +| 2.10.25 | [Graph model]
implements enrichment on Result specializing in the method mergefrom. | beta | +| 2.10.24 | [Graph model]
added utility method and constants for checking weather is an OafEntity represents an enrichment. | beta | +| 2.9.24 | [Dump model]
change the names of the classes to be able to automatically create the json schema with specific descriptions | beta | +| 2.9.23 | [Graph model]
Added Instance.measures field, allowing to maintain the association between them and the individual result instance
[Dump model]
added json schemas | beta | +| 2.8.22 | [Graph model]
minor: added serializable to the Measures model class
[Dump model]
added dedicated BestAccessRight class, used at the result level instead of AccessRight | production | +| 2.8.21 | [Graph model]
added the following relation terms Describes/IsDescribedBy, IsMetadataFor/IsMetadataOf, HasAssociationWith/HasAssociationWith, IsRequiredBy/Requires. All these are used in combination with the relation subRelType "relationship" | production | +| 2.8.20 | [Graph model]
added constants declaring the values used for hierarchical relationships among the organizations IsParentOf / IsChildOf | production | +| 2.7.18-19 | [Dump model]
include validation info in relations
[Graph model]
added constants declaring vocabulary names for relation fields | production | +| 2.7.17 | [Dump model]
aligned the graph dump schema to mirror the changes in the model
1. Added openaccessroute at the level of the instance inside the AccessRight element;
2. Added pid and the alternate identifiers at the level of the instance;
3. Added the bipFinder measures | production | +| 2.7.16 | [Graph model]
Updated the casing of the following terms (`relation.relClass`):
1. `isRelatedTo -> IsRelatedTo`
Added the following `relClass` terms:
1. `IsAmongTopNSimilarDocuments`
2. `HasAmongTopNSimilarDocuments` | production | +| 2.7.15 | 1. added support for delegated authorities
2. fixed regex for DOI cleaning | production | +| 2.7.14 | [Graph model]
Relation types are now inspired by the Datacite definitions https://schema.datacite.org/meta/kernel-4.4/doc/DataCite-MetadataKernel_v4.4.pdf
The changes involve the values stored in `relation.subRelType` and `relation.relClass`:
Updated the casing of the following terms (`relation.relClass`):
1. `isSupplementTo -> IsSupplementTo` / `isSupplementedBy -> IsSupplementedBy`
2. `isPartOf -> IsPartOf` / `hasPart -> HasPart`
3. `cites -> Cites` / `isCitedBy -> IsCitedBy`
4. `reviews -> Reviews` / `isReviewedBy -> IsReviewedBy`
Added the following terms [`subRelType: relClass / relClass (inverse)`]:
1. `relationship: References / IsReferencedBy`
2. `relationship: IsIdenticalTo`
3. `relationship: IsContinuedBy / Continues`
4. `relationship: IsDocumentedBy / Documents`
5. `relationship: Documents / IsDocumentedBy`
6. `relationship: IsCompiledBy / Compiles`
7. `version: IsPreviousVersionOf / IsNewVersionOf`
8. `version: IsSourceOf / IsDerivedFrom`
9. `version: IsVariantFormOf / IsOriginalFormOf`
10. `version: IsObsoletedBy / Obsoletes`
11. `version: IsVersionOf / HasVersion` | production | +| 2.6.14 | [Scholexplorer]
1. Added model classes for Scholexplorer, package `eu.dnetlib.dhp.schema.sx` | production | +| 2.6.13 | 1. `Result.mergeFrom` handles field `dateOfAcceptance` | production | +| 2.5.12 | 1. delegating the date parsing to https://github.com/sisyphsu/dateparser | production | +| 2.5.[11-9] | 1. support for more date formats
2. enable the possibility to extend the date formats used to parse `Relation.validationDate` | production | +| 2.4.8 | 1. added constant for ORCID datasource name | production | +| 2.4.7 | refactoring | production | +| 2.3.6 | [Aggregation]
1. introduced MetadataStoreManager (MdSM) model classes | production | +| 2.2.5 | [Graph model]
1. introduced fields `Instance.pid` and `Instance.alternateIdentifier`
2. `LicenseComparator` renamed as `AccessRightComparator`
3. introduced `AccessRight` model class defining the `OpenAccessRoute` field to keep track of the OpenAccess color at the `Instance` level
4. `ExternalReference` cleanup (removed description, added alternateLabel(s))
5. added several ModelConstants
[Aggregation]
7. introduced MDStore record model classes
8. Introduced ORCID specific model classes | production | +| 2.2.4 | 1. ORCID specific model classes backported in the version used in PROD
2. added constant for dnet:externalReference_typologies
3. added constant for ORCID datasource name
4. `Result.mergeFrom` handles field `dateOfAcceptance` | production | + diff --git a/pom.xml b/pom.xml index f0b6783..6dcfd7b 100644 --- a/pom.xml +++ b/pom.xml @@ -5,7 +5,7 @@ eu.dnetlib.dhp dhp-schemas jar - 2.7.15-SNAPSHOT + 2.10.26-SNAPSHOT @@ -20,7 +20,7 @@ Redmine - https://issue.openaire.research-infrastructures.eu/projects/openaire + https://support.openaire.eu/projects/openaire @@ -32,7 +32,7 @@ scm:git:gitea@code-repo.d4science.org:D-Net/dhp-schemas.git scm:git:gitea@code-repo.d4science.org:D-Net/dhp-schemas.git https://code-repo.d4science.org/D-Net/dhp-schemas/ - HEAD + dhp-schemas-2.10.25 This module contains common schema classes meant to be used across the dnet-hadoop submodules @@ -137,7 +137,23 @@ maven-dependency-plugin 3.0.0 + + org.codehaus.mojo + exec-maven-plugin + 3.0.0 + + + + com.fasterxml.jackson.core + jackson-databind + ${dhp.jackson.version} + + + + + + @@ -229,6 +245,19 @@ ${scala.version} + + org.codehaus.mojo + exec-maven-plugin + + true + eu.dnetlib.dhp.schema.dump.ExecCreateSchemas + + eu.dnetlib.dhp.schema.dump.oaf.GraphResult;eu.dnetlib.dhp.schema.dump.oaf.graph.Organization;eu.dnetlib.dhp.schema.dump.oaf.graph.Project + + + + + @@ -360,6 +389,17 @@ javax.persistence javax.persistence-api + + com.github.victools + jsonschema-generator + ${jsonschemagenerator.version} + + + + com.github.imifou + jsonschema-module-addon + 1.2.1 + @@ -377,6 +417,7 @@ 2.11.12 5.6.1 3.3.3 + 4.13.0 diff --git a/src/main/java/eu/dnetlib/dhp/schema/action/AtomicActionDeserializer.java b/src/main/java/eu/dnetlib/dhp/schema/action/AtomicActionDeserializer.java index 7b88e9c..628d8fe 100644 --- a/src/main/java/eu/dnetlib/dhp/schema/action/AtomicActionDeserializer.java +++ b/src/main/java/eu/dnetlib/dhp/schema/action/AtomicActionDeserializer.java @@ -4,7 +4,6 @@ package eu.dnetlib.dhp.schema.action; import java.io.IOException; import com.fasterxml.jackson.core.JsonParser; -import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.DeserializationContext; import com.fasterxml.jackson.databind.JsonDeserializer; import com.fasterxml.jackson.databind.JsonNode; @@ -12,10 +11,11 @@ import com.fasterxml.jackson.databind.ObjectMapper; import eu.dnetlib.dhp.schema.oaf.Oaf; -public class AtomicActionDeserializer extends JsonDeserializer { +public class AtomicActionDeserializer extends JsonDeserializer> { @Override - public Object deserialize(JsonParser jp, DeserializationContext ctxt) + @SuppressWarnings("unchecked") + public AtomicAction deserialize(JsonParser jp, DeserializationContext ctxt) throws IOException { JsonNode node = jp.getCodec().readTree(jp); String classTag = node.get("clazz").asText(); @@ -23,8 +23,9 @@ public class AtomicActionDeserializer extends JsonDeserializer { ObjectMapper mapper = new ObjectMapper(); try { - final Class clazz = Class.forName(classTag); - return new AtomicAction(clazz, (Oaf) mapper.readValue(payload.toString(), clazz)); + final Class clazz = (Class) Class.forName(classTag); + final T oaf = mapper.readValue(payload.toString(), clazz); + return new AtomicAction(clazz, oaf); } catch (ClassNotFoundException e) { throw new IOException(e); } diff --git a/src/main/java/eu/dnetlib/dhp/schema/common/AccessRightComparator.java b/src/main/java/eu/dnetlib/dhp/schema/common/AccessRightComparator.java index 6116bc4..f77e2af 100644 --- a/src/main/java/eu/dnetlib/dhp/schema/common/AccessRightComparator.java +++ b/src/main/java/eu/dnetlib/dhp/schema/common/AccessRightComparator.java @@ -3,7 +3,6 @@ package eu.dnetlib.dhp.schema.common; import java.util.Comparator; -import eu.dnetlib.dhp.schema.oaf.AccessRight; import eu.dnetlib.dhp.schema.oaf.Qualifier; public class AccessRightComparator implements Comparator { diff --git a/src/main/java/eu/dnetlib/dhp/schema/common/ModelConstants.java b/src/main/java/eu/dnetlib/dhp/schema/common/ModelConstants.java index 44b3755..ae234dd 100644 --- a/src/main/java/eu/dnetlib/dhp/schema/common/ModelConstants.java +++ b/src/main/java/eu/dnetlib/dhp/schema/common/ModelConstants.java @@ -8,6 +8,8 @@ import eu.dnetlib.dhp.schema.oaf.Qualifier; public class ModelConstants { + private ModelConstants() {} + public static final String ORCID = "orcid"; public static final String ORCID_PENDING = "orcid_pending"; public static final String ORCID_CLASSNAME = "Open Researcher and Contributor ID"; @@ -25,6 +27,9 @@ public class ModelConstants { public static final String OPENORGS_NAME = "OpenOrgs Database"; + public static final String OPENOCITATIONS_NAME = "OpenCitations"; + public static final String OPENOCITATIONS_ID = "10|openaire____::c06df618c5de1c786535ccf3f8b7b059"; + // VOCABULARY VALUE public static final String ACCESS_RIGHT_OPEN = "OPEN"; public static final String ACCESS_RIGHT_EMBARGO = "EMBARGO"; @@ -45,6 +50,9 @@ public class ModelConstants { public static final String DNET_REVIEW_LEVELS = "dnet:review_levels"; public static final String DNET_PROGRAMMING_LANGUAGES = "dnet:programming_languages"; public static final String DNET_EXTERNAL_REFERENCE_TYPE = "dnet:externalReference_typologies"; + public static final String DNET_RELATION_RELTYPE = "dnet:relation_relType"; + public static final String DNET_RELATION_SUBRELTYPE = "dnet:relation_subRelType"; + public static final String DNET_RELATION_RELCLASS = "dnet:relation_relClass"; public static final String SYSIMPORT_CROSSWALK_REPOSITORY = "sysimport:crosswalk:repository"; public static final String SYSIMPORT_CROSSWALK_ENTITYREGISTRY = "sysimport:crosswalk:entityregistry"; @@ -55,6 +63,8 @@ public class ModelConstants { public static final String HARVESTED = "Harvested"; public static final String PROVENANCE_DEDUP = "sysimport:dedup"; + public static final String PROVENANCE_ENRICH = "sysimport:enrich"; + public static final Qualifier PROVENANCE_ACTION_SET_QUALIFIER = qualifier( SYSIMPORT_ACTIONSET, SYSIMPORT_ACTIONSET, DNET_PROVENANCE_ACTIONS, DNET_PROVENANCE_ACTIONS); @@ -81,7 +91,7 @@ public class ModelConstants { public static final String RELATIONSHIP = "relationship"; // subreltype - public static final String IS_RELATED_TO = "isRelatedTo"; + public static final String IS_RELATED_TO = "IsRelatedTo"; public static final String IS_IDENTICAL_TO = "IsIdenticalTo"; public static final String REFERENCES = "References"; @@ -94,6 +104,15 @@ public class ModelConstants { public static final String IS_DERIVED_FROM = "IsDerivedFrom"; public static final String COMPILES = "Compiles"; public static final String IS_COMPILED_BY = "IsCompiledBy"; + public static final String DESCRIBES = "Describes"; + public static final String IS_DESCRIBE_DBY = "IsDescribedBy"; + public static final String IS_METADATA_FOR = "IsMetadataFor"; + public static final String IS_METADATA_OF = "IsMetadataOf"; + public static final String HAS_ASSOCIATION_WITH = "HasAssociationWith"; + public static final String IS_REQUIRED_BY = "IsRequiredBy"; + public static final String REQUIRES = "Requires"; + + public static final String CITATION = "citation"; // subreltype public static final String CITES = "Cites"; @@ -134,6 +153,8 @@ public class ModelConstants { public static final String HAS_AUTHOR_INSTITUTION = "hasAuthorInstitution"; public static final String ORG_ORG_RELTYPE = "organizationOrganization"; // relType + public static final String IS_PARENT_OF = "IsParentOf"; + public static final String IS_CHILD_OF = "IsChildOf"; public static final String DEDUP = "dedup"; // subreltype public static final String MERGES = "merges"; @@ -141,6 +162,8 @@ public class ModelConstants { public static final String SIMILARITY = "similarity"; // subreltype public static final String IS_SIMILAR_TO = "isSimilarTo"; + public static final String IS_AMONG_TOP_N_SIMILAR_DOCS = "IsAmongTopNSimilarDocuments"; + public static final String HAS_AMONG_TOP_N_SIMILAR_DOCS = "HasAmongTopNSimilarDocuments"; public static final String IS_DIFFERENT_FROM = "isDifferentFrom"; diff --git a/src/main/java/eu/dnetlib/dhp/schema/common/ModelSupport.java b/src/main/java/eu/dnetlib/dhp/schema/common/ModelSupport.java index a6d164c..1aa0d8f 100644 --- a/src/main/java/eu/dnetlib/dhp/schema/common/ModelSupport.java +++ b/src/main/java/eu/dnetlib/dhp/schema/common/ModelSupport.java @@ -2,18 +2,20 @@ package eu.dnetlib.dhp.schema.common; import static com.google.common.base.Preconditions.checkArgument; +import static eu.dnetlib.dhp.schema.common.ModelConstants.*; import java.nio.charset.StandardCharsets; import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; import java.text.ParseException; -import java.time.format.DateTimeParseException; -import java.util.*; +import java.util.Date; +import java.util.Map; +import java.util.Objects; +import java.util.Optional; import java.util.function.Function; import org.apache.commons.codec.binary.Hex; import org.apache.commons.lang3.StringUtils; -import org.apache.commons.lang3.time.DateUtils; import com.github.sisyphsu.dateparser.DateParserUtils; import com.google.common.collect.Maps; @@ -97,211 +99,104 @@ public class ModelSupport { public static final Map relationInverseMap = Maps.newHashMap(); static { - relationInverseMap - .put( - "personResult_authorship_isAuthorOf", new RelationInverse() - .setRelation("isAuthorOf") - .setInverse("hasAuthor") - .setRelType("personResult") - .setSubReltype("authorship")); - relationInverseMap - .put( - "personResult_authorship_hasAuthor", new RelationInverse() - .setInverse("isAuthorOf") - .setRelation("hasAuthor") - .setRelType("personResult") - .setSubReltype("authorship")); - relationInverseMap - .put( - "projectOrganization_participation_isParticipant", new RelationInverse() - .setRelation(ModelConstants.IS_PARTICIPANT) - .setInverse(ModelConstants.HAS_PARTICIPANT) - .setRelType(ModelConstants.PROJECT_ORGANIZATION) - .setSubReltype(ModelConstants.PARTICIPATION)); - relationInverseMap - .put( - "projectOrganization_participation_hasParticipant", new RelationInverse() - .setInverse(ModelConstants.IS_PARTICIPANT) - .setRelation(ModelConstants.HAS_PARTICIPANT) - .setRelType(ModelConstants.PROJECT_ORGANIZATION) - .setSubReltype(ModelConstants.PARTICIPATION)); - relationInverseMap - .put( - "resultOrganization_affiliation_hasAuthorInstitution", new RelationInverse() - .setRelation(ModelConstants.HAS_AUTHOR_INSTITUTION) - .setInverse(ModelConstants.IS_AUTHOR_INSTITUTION_OF) - .setRelType(ModelConstants.RESULT_ORGANIZATION) - .setSubReltype(ModelConstants.AFFILIATION)); - relationInverseMap - .put( - "resultOrganization_affiliation_isAuthorInstitutionOf", new RelationInverse() - .setInverse(ModelConstants.HAS_AUTHOR_INSTITUTION) - .setRelation(ModelConstants.IS_AUTHOR_INSTITUTION_OF) - .setRelType(ModelConstants.RESULT_ORGANIZATION) - .setSubReltype(ModelConstants.AFFILIATION)); - relationInverseMap - .put( - "organizationOrganization_dedup_merges", new RelationInverse() - .setRelation(ModelConstants.MERGES) - .setInverse(ModelConstants.IS_MERGED_IN) - .setRelType(ModelConstants.ORG_ORG_RELTYPE) - .setSubReltype(ModelConstants.DEDUP)); - relationInverseMap - .put( - "organizationOrganization_dedup_isMergedIn", new RelationInverse() - .setInverse(ModelConstants.MERGES) - .setRelation(ModelConstants.IS_MERGED_IN) - .setRelType(ModelConstants.ORG_ORG_RELTYPE) - .setSubReltype(ModelConstants.DEDUP)); - relationInverseMap - .put( - "organizationOrganization_dedupSimilarity_isSimilarTo", new RelationInverse() - .setInverse(ModelConstants.IS_SIMILAR_TO) - .setRelation(ModelConstants.IS_SIMILAR_TO) - .setRelType(ModelConstants.ORG_ORG_RELTYPE) - .setSubReltype(ModelConstants.DEDUP)); + set(relationInverseMap, PROJECT_ORGANIZATION, PARTICIPATION, IS_PARTICIPANT, HAS_PARTICIPANT); - relationInverseMap - .put( - "resultProject_outcome_isProducedBy", new RelationInverse() - .setRelation(ModelConstants.IS_PRODUCED_BY) - .setInverse(ModelConstants.PRODUCES) - .setRelType(ModelConstants.RESULT_PROJECT) - .setSubReltype(ModelConstants.OUTCOME)); - relationInverseMap - .put( - "resultProject_outcome_produces", new RelationInverse() - .setInverse(ModelConstants.IS_PRODUCED_BY) - .setRelation(ModelConstants.PRODUCES) - .setRelType(ModelConstants.RESULT_PROJECT) - .setSubReltype(ModelConstants.OUTCOME)); - relationInverseMap - .put( - "projectPerson_contactPerson_isContact", new RelationInverse() - .setRelation("isContact") - .setInverse("hasContact") - .setRelType("projectPerson") - .setSubReltype("contactPerson")); - relationInverseMap - .put( - "projectPerson_contactPerson_hasContact", new RelationInverse() - .setInverse("isContact") - .setRelation("hasContact") - .setRelType("personPerson") - .setSubReltype("coAuthorship")); - relationInverseMap - .put( - "personPerson_coAuthorship_isCoauthorOf", new RelationInverse() - .setInverse("isCoAuthorOf") - .setRelation("isCoAuthorOf") - .setRelType("personPerson") - .setSubReltype("coAuthorship")); - relationInverseMap - .put( - "personPerson_dedup_merges", new RelationInverse() - .setInverse(ModelConstants.IS_MERGED_IN) - .setRelation(ModelConstants.MERGES) - .setRelType("personPerson") - .setSubReltype(ModelConstants.DEDUP)); - relationInverseMap - .put( - "personPerson_dedup_isMergedIn", new RelationInverse() - .setInverse(ModelConstants.MERGES) - .setRelation(ModelConstants.IS_MERGED_IN) - .setRelType("personPerson") - .setSubReltype(ModelConstants.DEDUP)); - relationInverseMap - .put( - "personPerson_dedupSimilarity_isSimilarTo", new RelationInverse() - .setInverse(ModelConstants.IS_SIMILAR_TO) - .setRelation(ModelConstants.IS_SIMILAR_TO) - .setRelType("personPerson") - .setSubReltype(ModelConstants.DEDUP)); - relationInverseMap - .put( - "datasourceOrganization_provision_isProvidedBy", new RelationInverse() - .setInverse(ModelConstants.PROVIDES) - .setRelation(ModelConstants.IS_PROVIDED_BY) - .setRelType(ModelConstants.DATASOURCE_ORGANIZATION) - .setSubReltype(ModelConstants.PROVISION)); - relationInverseMap - .put( - "datasourceOrganization_provision_provides", new RelationInverse() - .setInverse(ModelConstants.IS_PROVIDED_BY) - .setRelation(ModelConstants.PROVIDES) - .setRelType(ModelConstants.DATASOURCE_ORGANIZATION) - .setSubReltype(ModelConstants.PROVISION)); - relationInverseMap - .put( - "resultResult_similarity_hasAmongTopNSimilarDocuments", new RelationInverse() - .setInverse("isAmongTopNSimilarDocuments") - .setRelation("hasAmongTopNSimilarDocuments") - .setRelType(ModelConstants.RESULT_RESULT) - .setSubReltype(ModelConstants.SIMILARITY)); - relationInverseMap - .put( - "resultResult_similarity_isAmongTopNSimilarDocuments", new RelationInverse() - .setInverse("hasAmongTopNSimilarDocuments") - .setRelation("isAmongTopNSimilarDocuments") - .setRelType(ModelConstants.RESULT_RESULT) - .setSubReltype(ModelConstants.SIMILARITY)); - relationInverseMap - .put( - "resultResult_relationship_isRelatedTo", new RelationInverse() - .setInverse(ModelConstants.IS_RELATED_TO) - .setRelation(ModelConstants.IS_RELATED_TO) - .setRelType(ModelConstants.RESULT_RESULT) - .setSubReltype(ModelConstants.RELATIONSHIP)); - relationInverseMap - .put( - "resultResult_supplement_isSupplementTo", new RelationInverse() - .setInverse(ModelConstants.IS_SUPPLEMENTED_BY) - .setRelation(ModelConstants.IS_SUPPLEMENT_TO) - .setRelType(ModelConstants.RESULT_RESULT) - .setSubReltype(ModelConstants.SUPPLEMENT)); - relationInverseMap - .put( - "resultResult_supplement_isSupplementedBy", new RelationInverse() - .setInverse(ModelConstants.IS_SUPPLEMENT_TO) - .setRelation(ModelConstants.IS_SUPPLEMENTED_BY) - .setRelType(ModelConstants.RESULT_RESULT) - .setSubReltype(ModelConstants.SUPPLEMENT)); - relationInverseMap - .put( - "resultResult_part_isPartOf", new RelationInverse() - .setInverse(ModelConstants.HAS_PART) - .setRelation(ModelConstants.IS_PART_OF) - .setRelType(ModelConstants.RESULT_RESULT) - .setSubReltype(ModelConstants.PART)); - relationInverseMap - .put( - "resultResult_part_hasPart", new RelationInverse() - .setInverse(ModelConstants.IS_PART_OF) - .setRelation(ModelConstants.HAS_PART) - .setRelType(ModelConstants.RESULT_RESULT) - .setSubReltype(ModelConstants.PART)); - relationInverseMap - .put( - "resultResult_dedup_merges", new RelationInverse() - .setInverse(ModelConstants.IS_MERGED_IN) - .setRelation(ModelConstants.MERGES) - .setRelType(ModelConstants.RESULT_RESULT) - .setSubReltype(ModelConstants.DEDUP)); - relationInverseMap - .put( - "resultResult_dedup_isMergedIn", new RelationInverse() - .setInverse(ModelConstants.MERGES) - .setRelation(ModelConstants.IS_MERGED_IN) - .setRelType(ModelConstants.RESULT_RESULT) - .setSubReltype(ModelConstants.DEDUP)); - relationInverseMap - .put( - "resultResult_dedupSimilarity_isSimilarTo", new RelationInverse() - .setInverse(ModelConstants.IS_SIMILAR_TO) - .setRelation(ModelConstants.IS_SIMILAR_TO) - .setRelType(ModelConstants.RESULT_RESULT) - .setSubReltype(ModelConstants.DEDUP)); + set(relationInverseMap, RESULT_ORGANIZATION, AFFILIATION, IS_AUTHOR_INSTITUTION_OF, HAS_AUTHOR_INSTITUTION); + set(relationInverseMap, ORG_ORG_RELTYPE, DEDUP, IS_MERGED_IN, MERGES); + set(relationInverseMap, ORG_ORG_RELTYPE, DEDUP, IS_SIMILAR_TO, IS_SIMILAR_TO); + + set(relationInverseMap, RESULT_PROJECT, OUTCOME, IS_PRODUCED_BY, PRODUCES); + + set(relationInverseMap, DATASOURCE_ORGANIZATION, PROVISION, IS_PROVIDED_BY, PROVIDES); + + set(relationInverseMap, RESULT_RESULT, SIMILARITY, IS_AMONG_TOP_N_SIMILAR_DOCS, HAS_AMONG_TOP_N_SIMILAR_DOCS); + set(relationInverseMap, RESULT_RESULT, SUPPLEMENT, IS_SUPPLEMENT_TO, IS_SUPPLEMENTED_BY); + set(relationInverseMap, RESULT_RESULT, PART, IS_PART_OF, HAS_PART); + set(relationInverseMap, RESULT_RESULT, DEDUP, IS_MERGED_IN, MERGES); + set(relationInverseMap, RESULT_RESULT, DEDUP, IS_SIMILAR_TO, IS_SIMILAR_TO); + set(relationInverseMap, RESULT_RESULT, CITATION, IS_CITED_BY, CITES); + + set(relationInverseMap, RESULT_RESULT, RELATIONSHIP, IS_IDENTICAL_TO, IS_IDENTICAL_TO); + set(relationInverseMap, RESULT_RESULT, RELATIONSHIP, IS_REFERENCED_BY, REFERENCES); + set(relationInverseMap, RESULT_RESULT, RELATIONSHIP, IS_CONTINUED_BY, CONTINUES); + set(relationInverseMap, RESULT_RESULT, RELATIONSHIP, IS_DOCUMENTED_BY, DOCUMENTS); + set(relationInverseMap, RESULT_RESULT, RELATIONSHIP, IS_DERIVED_FROM, IS_SOURCE_OF); + set(relationInverseMap, RESULT_RESULT, RELATIONSHIP, IS_RELATED_TO, IS_RELATED_TO); + set(relationInverseMap, RESULT_RESULT, RELATIONSHIP, IS_COMPILED_BY, COMPILES); + + set(relationInverseMap, RESULT_RESULT, RELATIONSHIP, IS_DESCRIBE_DBY, DESCRIBES); + set(relationInverseMap, RESULT_RESULT, RELATIONSHIP, IS_METADATA_FOR, IS_METADATA_OF); + set(relationInverseMap, RESULT_RESULT, RELATIONSHIP, HAS_ASSOCIATION_WITH, HAS_ASSOCIATION_WITH); + set(relationInverseMap, RESULT_RESULT, RELATIONSHIP, IS_REQUIRED_BY, REQUIRES); + + + set(relationInverseMap, RESULT_RESULT, VERSION, IS_PREVIOUS_VERSION_OF, IS_NEW_VERSION_OF); + set(relationInverseMap, RESULT_RESULT, VERSION, IS_VARIANT_FORM_OF, IS_ORIGINAL_FORM_OF); + set(relationInverseMap, RESULT_RESULT, VERSION, IS_OBSOLETED_BY, OBSOLETES); + set(relationInverseMap, RESULT_RESULT, VERSION, IS_VERSION_OF, HAS_VERSION); + + set(relationInverseMap, RESULT_RESULT, REVIEW, IS_REVIEWED_BY, REVIEWS); + } + + private static void set(Map relationInverseMap, String relType, String subRelType, String relClass, String inverseRelClass) { + relationInverseMap + .put( + rel(relType, subRelType, relClass), new RelationInverse() + .setInverseRelClass(inverseRelClass) + .setRelClass(relClass) + .setRelType(relType) + .setSubReltype(subRelType)); + if (!relClass.equals(inverseRelClass)) { + relationInverseMap + .put( + rel(relType, subRelType, inverseRelClass), new RelationInverse() + .setInverseRelClass(relClass) + .setRelClass(inverseRelClass) + .setRelType(relType) + .setSubReltype(subRelType)); + } + } + + /** + * Helper method: lookup relation inverse, given the direct relation encoding (case insensitive) + * @param encoding + * @return the relation inverse descriptor, throws @IllegalArgumentException when not found. + */ + public static RelationInverse findInverse(String encoding) { + return ModelSupport.relationInverseMap + .entrySet() + .stream() + .filter(r -> encoding.equalsIgnoreCase(r.getKey())) + .findFirst() + .map(r -> r.getValue()) + .orElseThrow(() -> new IllegalArgumentException("invalid relationship: " + encoding)); + } + + /** + * Helper method: fina a relation filtering by a relation name + * @param relationName + * @return + */ + public static RelationInverse findRelation(final String relationName) { + return relationInverseMap.values() + .stream() + .filter(r -> relationName.equalsIgnoreCase(r.getRelClass())) + .findFirst() + .orElse(null); + + + } + + /** + * Helper method: combines the relation attributes + * @param relType + * @param subRelType + * @param relClass + * @return + */ + public static String rel(String relType, String subRelType, String relClass) { + return String.format("%s_%s_%s", relType, subRelType, relClass); } private static final String schemeTemplate = "dnet:%s_%s_relations"; diff --git a/src/main/java/eu/dnetlib/dhp/schema/common/RelationInverse.java b/src/main/java/eu/dnetlib/dhp/schema/common/RelationInverse.java index 4757c63..2b9ed94 100644 --- a/src/main/java/eu/dnetlib/dhp/schema/common/RelationInverse.java +++ b/src/main/java/eu/dnetlib/dhp/schema/common/RelationInverse.java @@ -2,8 +2,8 @@ package eu.dnetlib.dhp.schema.common; public class RelationInverse { - private String relation; - private String inverse; + private String relClass; + private String inverseRelClass; private String relType; private String subReltype; @@ -25,21 +25,21 @@ public class RelationInverse { return this; } - public String getRelation() { - return relation; + public String getRelClass() { + return relClass; } - public RelationInverse setRelation(String relation) { - this.relation = relation; + public RelationInverse setRelClass(String relClass) { + this.relClass = relClass; return this; } - public String getInverse() { - return inverse; + public String getInverseRelClass() { + return inverseRelClass; } - public RelationInverse setInverse(String inverse) { - this.inverse = inverse; + public RelationInverse setInverseRelClass(String inverseRelClass) { + this.inverseRelClass = inverseRelClass; return this; } diff --git a/src/main/java/eu/dnetlib/dhp/schema/dump/ExecCreateSchemas.java b/src/main/java/eu/dnetlib/dhp/schema/dump/ExecCreateSchemas.java new file mode 100644 index 0000000..ca520cc --- /dev/null +++ b/src/main/java/eu/dnetlib/dhp/schema/dump/ExecCreateSchemas.java @@ -0,0 +1,75 @@ +package eu.dnetlib.dhp.schema.dump; + +import java.io.*; +import java.lang.reflect.Type; +import java.net.URL; +import java.nio.file.Files; +import java.nio.file.Paths; + +import com.fasterxml.jackson.databind.JsonNode; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.databind.SerializationFeature; +import com.github.imifou.jsonschema.module.addon.AddonModule; +import com.github.victools.jsonschema.generator.*; + +import eu.dnetlib.dhp.schema.dump.oaf.community.CommunityResult; +import eu.dnetlib.dhp.schema.dump.oaf.graph.*; + +public class ExecCreateSchemas { + final static String DIRECTORY = "/eu/dnetlib/dhp/schema/oaf/dump/jsonschemas/"; + SchemaGenerator generator; + + private void init(){ + + AddonModule module = new AddonModule(); + SchemaGeneratorConfigBuilder configBuilder = new SchemaGeneratorConfigBuilder( + new ObjectMapper().enable(SerializationFeature.INDENT_OUTPUT), + SchemaVersion.DRAFT_7, + OptionPreset.PLAIN_JSON) + .with(module) + .with(Option.SCHEMA_VERSION_INDICATOR) + .without(Option.NONPUBLIC_NONSTATIC_FIELDS_WITHOUT_GETTERS); + SchemaGeneratorConfig config = configBuilder.build(); + generator = new SchemaGenerator(config); + } + + private void generate(Type targetType, String directory, String filename) throws IOException { + JsonNode jsonSchema = generator.generateSchema(targetType); + + String dir = Paths.get(Paths.get(getClass().getResource("/").getPath()).toAbsolutePath() + directory).toString(); + + if(!Files.exists(Paths.get(dir))){ + Files.createDirectories(Paths.get(dir)); + } + + if(!Files.exists(Paths.get(dir + "/" + filename))) { + Files.createFile(Paths.get(dir + "/" + filename)); + } + + File f = new File(dir + "/" + filename); + + try(PrintWriter writer = new PrintWriter(new BufferedWriter(new FileWriter(f)))) { + writer.println(new ObjectMapper().writerWithDefaultPrettyPrinter().writeValueAsString(jsonSchema)); + } + + + } + public static void main(String[] args) throws IOException { + + ExecCreateSchemas ecs = new ExecCreateSchemas(); + ecs.init(); + ecs.generate(GraphResult.class, DIRECTORY , "result_schema.json"); + ecs.generate(ResearchCommunity.class, DIRECTORY , "community_infrastructure_schema.json"); + ecs.generate(Datasource.class, DIRECTORY , "datasource_schema.json"); + ecs.generate(Project.class, DIRECTORY , "project_schema.json"); + ecs.generate(Relation.class, DIRECTORY , "relation_schema.json"); + ecs.generate(Organization.class, DIRECTORY , "organization_schema.json"); + + ecs.generate(CommunityResult.class, DIRECTORY , "community_result_schema.json"); + + + + + + } +} diff --git a/src/main/java/eu/dnetlib/dhp/schema/dump/oaf/AccessRight.java b/src/main/java/eu/dnetlib/dhp/schema/dump/oaf/AccessRight.java index f28c544..195da21 100644 --- a/src/main/java/eu/dnetlib/dhp/schema/dump/oaf/AccessRight.java +++ b/src/main/java/eu/dnetlib/dhp/schema/dump/oaf/AccessRight.java @@ -2,24 +2,15 @@ package eu.dnetlib.dhp.schema.dump.oaf; /** - * AccessRight. Used to represent the result access rights. It extends the eu.dnet.lib.dhp.schema.dump.oaf.Qualifier - * element with a parameter scheme of type String to store the scheme. Values for this element are found against the - * COAR access right scheme. The classid of the element accessright in eu.dnetlib.dhp.schema.oaf.Result is used to get - * the COAR corresponding code whose value will be used to set the code parameter. The COAR label corresponding to the - * COAR code will be used to set the label parameter. The scheme value will always be the one referring to the COAR - * access right scheme + * AccessRight. Used to represent the result access rights. It extends the eu.dnet.lib.dhp.schema.dump.oaf.BestAccessRight + * element with value for the openaccess route */ -public class AccessRight extends Qualifier { +public class AccessRight extends BestAccessRight { - private String scheme; - public String getScheme() { - return scheme; - } - public void setScheme(String scheme) { - this.scheme = scheme; - } + private OpenAccessRoute openAccessRoute ; + public static AccessRight newInstance(String code, String label, String scheme) { AccessRight ar = new AccessRight(); @@ -28,4 +19,12 @@ public class AccessRight extends Qualifier { ar.setScheme(scheme); return ar; } + + public OpenAccessRoute getOpenAccessRoute() { + return openAccessRoute; + } + + public void setOpenAccessRoute(OpenAccessRoute openAccessRoute) { + this.openAccessRoute = openAccessRoute; + } } diff --git a/src/main/java/eu/dnetlib/dhp/schema/dump/oaf/AlternateIdentifier.java b/src/main/java/eu/dnetlib/dhp/schema/dump/oaf/AlternateIdentifier.java new file mode 100644 index 0000000..e48a564 --- /dev/null +++ b/src/main/java/eu/dnetlib/dhp/schema/dump/oaf/AlternateIdentifier.java @@ -0,0 +1,40 @@ +package eu.dnetlib.dhp.schema.dump.oaf; + +import java.io.Serializable; + +import com.github.imifou.jsonschema.module.addon.annotation.JsonSchema; + +public class AlternateIdentifier implements Serializable { + @JsonSchema(description="The scheme of the identifier. It can be a persistent identifier (i.e. doi). If it is present in the alternate identifiers " + + "it means it has not been forged by an authority for that pid. For example we collect metadata from an institutional repository that provides " + + "as identifier for the result also the doi") + private String scheme; + + @JsonSchema(description="The value expressed in the scheme") + private String value; + + public String getScheme() { + return scheme; + } + + public void setScheme(String scheme) { + this.scheme = scheme; + } + + public String getValue() { + return value; + } + + public void setValue(String value) { + this.value = value; + } + + public static AlternateIdentifier newInstance(String scheme, String value) { + AlternateIdentifier cf = new AlternateIdentifier(); + + cf.setScheme(scheme); + cf.setValue(value); + + return cf; + } +} diff --git a/src/main/java/eu/dnetlib/dhp/schema/dump/oaf/Author.java b/src/main/java/eu/dnetlib/dhp/schema/dump/oaf/Author.java index 34920bc..3c7710b 100644 --- a/src/main/java/eu/dnetlib/dhp/schema/dump/oaf/Author.java +++ b/src/main/java/eu/dnetlib/dhp/schema/dump/oaf/Author.java @@ -2,7 +2,8 @@ package eu.dnetlib.dhp.schema.dump.oaf; import java.io.Serializable; -import java.util.List; + +import com.github.imifou.jsonschema.module.addon.annotation.JsonSchema; /** * Used to represent the generic author of the result. It has six parameters: - name of type String to store the given @@ -28,7 +29,8 @@ public class Author implements Serializable { private Integer rank; - private Pid pid; + @JsonSchema(description="The author's persistent identifiers") + private AuthorPid pid; public String getFullname() { return fullname; @@ -62,11 +64,11 @@ public class Author implements Serializable { this.rank = rank; } - public Pid getPid() { + public AuthorPid getPid() { return pid; } - public void setPid(Pid pid) { + public void setPid(AuthorPid pid) { this.pid = pid; } diff --git a/src/main/java/eu/dnetlib/dhp/schema/dump/oaf/AuthorPid.java b/src/main/java/eu/dnetlib/dhp/schema/dump/oaf/AuthorPid.java new file mode 100644 index 0000000..e77a078 --- /dev/null +++ b/src/main/java/eu/dnetlib/dhp/schema/dump/oaf/AuthorPid.java @@ -0,0 +1,54 @@ + +package eu.dnetlib.dhp.schema.dump.oaf; + +import java.io.Serializable; + +import com.github.imifou.jsonschema.module.addon.annotation.JsonSchema; + +/** + * To represent the generic persistent identifier. It has two parameters: + * - id of type + * eu.dnetlib.dhp.schema.dump.oaf.AuthorPidSchemeValue to store the scheme and value of the Persistent Identifier. + * - provenance of type eu.dnetlib.dhp.schema.dump.oaf.Provenance to store the provenance and trust of the information + */ +public class AuthorPid implements Serializable { + + private AuthorPidSchemeValue id; + + @JsonSchema(description="The reason why the pid was associated to the author") + private Provenance provenance; + + public AuthorPidSchemeValue getId() { + return id; + } + + public void setId(AuthorPidSchemeValue pid) { + this.id = pid; + } + + public Provenance getProvenance() { + return provenance; + } + + public void setProvenance(Provenance provenance) { + this.provenance = provenance; + } + + public static AuthorPid newInstance(AuthorPidSchemeValue pid, Provenance provenance) { + AuthorPid p = new AuthorPid(); + p.id = pid; + p.provenance = provenance; + + return p; + } + + public static AuthorPid newInstance(AuthorPidSchemeValue pid) { + AuthorPid p = new AuthorPid(); + p.id = pid; + + return p; + } + + +} + diff --git a/src/main/java/eu/dnetlib/dhp/schema/dump/oaf/AuthorPidSchemeValue.java b/src/main/java/eu/dnetlib/dhp/schema/dump/oaf/AuthorPidSchemeValue.java new file mode 100644 index 0000000..3e22c9f --- /dev/null +++ b/src/main/java/eu/dnetlib/dhp/schema/dump/oaf/AuthorPidSchemeValue.java @@ -0,0 +1,39 @@ +package eu.dnetlib.dhp.schema.dump.oaf; + +import java.io.Serializable; + +import com.github.imifou.jsonschema.module.addon.annotation.JsonSchema; + +public class AuthorPidSchemeValue implements Serializable { + + @JsonSchema(description="The author's pid scheme. OpenAIRE currently supports 'ORCID'") + private String scheme; + + @JsonSchema(description="The author's pid value in that scheme (i.e. 0000-1111-2222-3333)") + private String value; + + public String getScheme() { + return scheme; + } + + public void setScheme(String scheme) { + this.scheme = scheme; + } + + public String getValue() { + return value; + } + + public void setValue(String value) { + this.value = value; + } + + public static AuthorPidSchemeValue newInstance(String scheme, String value) { + AuthorPidSchemeValue cf = new AuthorPidSchemeValue(); + + cf.setScheme(scheme); + cf.setValue(value); + + return cf; + } +} diff --git a/src/main/java/eu/dnetlib/dhp/schema/dump/oaf/BestAccessRight.java b/src/main/java/eu/dnetlib/dhp/schema/dump/oaf/BestAccessRight.java new file mode 100644 index 0000000..6ae9b54 --- /dev/null +++ b/src/main/java/eu/dnetlib/dhp/schema/dump/oaf/BestAccessRight.java @@ -0,0 +1,59 @@ +package eu.dnetlib.dhp.schema.dump.oaf; + +import java.io.Serializable; + +import com.github.imifou.jsonschema.module.addon.annotation.JsonSchema; + +/** + * BestAccessRight. Used to represent the result best access rights. Values for this element are found against the + * COAR access right scheme. The classid of the element accessright in eu.dnetlib.dhp.schema.oaf.Result is used to get + * the COAR corresponding code whose value will be used to set the code parameter. The COAR label corresponding to the + * COAR code will be used to set the label parameter. The scheme value will always be the one referring to the COAR + * access right scheme + */ + +public class BestAccessRight implements Serializable { + + @JsonSchema(description="COAR access mode code: http://vocabularies.coar-repositories.org/documentation/access_rights/") + private String code; // the classid in the Qualifier + + @JsonSchema(description="Label for the access mode") + private String label; // the classname in the Qualifier + + @JsonSchema(description="Scheme of reference for access right code. Always set to COAR access rights vocabulary: http://vocabularies.coar-repositories.org/documentation/access_rights/") + private String scheme; + + public String getScheme() { + return scheme; + } + + public void setScheme(String scheme) { + this.scheme = scheme; + } + + public String getCode() { + return code; + } + + public void setCode(String code) { + this.code = code; + } + + public String getLabel() { + return label; + } + + public void setLabel(String label) { + this.label = label; + } + + + public static BestAccessRight newInstance(String code, String label, String scheme) { + BestAccessRight ar = new BestAccessRight(); + ar.code = code ; + ar.label = label; + ar.scheme = scheme; + return ar; + } +} + diff --git a/src/main/java/eu/dnetlib/dhp/schema/dump/oaf/Container.java b/src/main/java/eu/dnetlib/dhp/schema/dump/oaf/Container.java index 8699528..bef5f74 100644 --- a/src/main/java/eu/dnetlib/dhp/schema/dump/oaf/Container.java +++ b/src/main/java/eu/dnetlib/dhp/schema/dump/oaf/Container.java @@ -2,7 +2,8 @@ package eu.dnetlib.dhp.schema.dump.oaf; import java.io.Serializable; -import java.util.Objects; + +import com.github.imifou.jsonschema.module.addon.annotation.JsonSchema; /** * To store information about the conference or journal where the result has been presented or published. It contains @@ -23,6 +24,7 @@ import java.util.Objects; */ public class Container implements Serializable { + @JsonSchema(description="Name of the journal or conference") private String name; private String issnPrinted; @@ -31,14 +33,19 @@ public class Container implements Serializable { private String issnLinking; + @JsonSchema(description="End page") private String ep; + @JsonSchema(description="Journal issue number") private String iss; + @JsonSchema(description="Start page") private String sp; + @JsonSchema(description = "Volume") private String vol; + @JsonSchema(description="Edition of the journal or conference proceeding") private String edition; private String conferenceplace; diff --git a/src/main/java/eu/dnetlib/dhp/schema/dump/oaf/ControlledField.java b/src/main/java/eu/dnetlib/dhp/schema/dump/oaf/ControlledField.java deleted file mode 100644 index cad7b8b..0000000 --- a/src/main/java/eu/dnetlib/dhp/schema/dump/oaf/ControlledField.java +++ /dev/null @@ -1,38 +0,0 @@ - -package eu.dnetlib.dhp.schema.dump.oaf; - -import java.io.Serializable; - -/** - * To represent the information described by a scheme and a value in that scheme (i.e. pid). It has two parameters: - - * scheme of type String to store the scheme - value of type String to store the value in that scheme - */ -public class ControlledField implements Serializable { - private String scheme; - private String value; - - public String getScheme() { - return scheme; - } - - public void setScheme(String scheme) { - this.scheme = scheme; - } - - public String getValue() { - return value; - } - - public void setValue(String value) { - this.value = value; - } - - public static ControlledField newInstance(String scheme, String value) { - ControlledField cf = new ControlledField(); - - cf.setScheme(scheme); - cf.setValue(value); - - return cf; - } -} diff --git a/src/main/java/eu/dnetlib/dhp/schema/dump/oaf/Country.java b/src/main/java/eu/dnetlib/dhp/schema/dump/oaf/Country.java index 3ab4d90..0cf58b3 100644 --- a/src/main/java/eu/dnetlib/dhp/schema/dump/oaf/Country.java +++ b/src/main/java/eu/dnetlib/dhp/schema/dump/oaf/Country.java @@ -1,8 +1,12 @@ package eu.dnetlib.dhp.schema.dump.oaf; +import java.io.Serializable; + +import com.github.imifou.jsonschema.module.addon.annotation.JsonSchema; + /** - * Represents the country associated to this result. It extends eu.dnetlib.dhp.schema.dump.oaf.Qualifier with a + * Represents the country associated to the generic entity. It extends eu.dnetlib.dhp.schema.dump.oaf.Qualifier with a * provenance parameter of type eu.dnetlib.dhp.schema.dumo.oaf.Provenance. The country in not mapped if its value in the * result reprensented in the internal format is Unknown. The value for this element correspond to: - code corresponds * to the classid of eu.dnetlib.dhp.schema.oaf.Country - label corresponds to the classname of @@ -10,28 +14,36 @@ package eu.dnetlib.dhp.schema.dump.oaf; * dumped is not null. In this case : - provenance corresponds to dataInfo.provenanceaction.classid (to be modified with * datainfo.provenanceaction.classname) - trust corresponds to dataInfo.trust */ -public class Country extends Qualifier { +public class Country implements Serializable { + @JsonSchema(description="ISO 3166-1 alpha-2 country code (i.e. IT)") + private String code; // the classid in the Qualifier - private Provenance provenance; + @JsonSchema(description="The label for that code (i.e. Italy)") + private String label; // the classname in the Qualifier - public Provenance getProvenance() { - return provenance; + public String getCode() { + return code; } - public void setProvenance(Provenance provenance) { - this.provenance = provenance; + public void setCode(String code) { + this.code = code; } - public static Country newInstance(String code, String label, Provenance provenance) { + public String getLabel() { + return label; + } + + public void setLabel(String label) { + this.label = label; + } + + public static Country newInstance(String code, String label) { Country c = new Country(); - c.setProvenance(provenance); c.setCode(code); c.setLabel(label); return c; } - public static Country newInstance(String code, String label, String provenance, String trust) { - return newInstance(code, label, Provenance.newInstance(provenance, trust)); - } + } diff --git a/src/main/java/eu/dnetlib/dhp/schema/dump/oaf/Funder.java b/src/main/java/eu/dnetlib/dhp/schema/dump/oaf/Funder.java index 16cab22..674b8b3 100644 --- a/src/main/java/eu/dnetlib/dhp/schema/dump/oaf/Funder.java +++ b/src/main/java/eu/dnetlib/dhp/schema/dump/oaf/Funder.java @@ -3,11 +3,17 @@ package eu.dnetlib.dhp.schema.dump.oaf; import java.io.Serializable; +import com.github.imifou.jsonschema.module.addon.annotation.JsonSchema; + public class Funder implements Serializable { + + @JsonSchema(description = "The short name of the funder (EC)") private String shortName; + @JsonSchema(description = "The name of the funder (European Commission)") private String name; + @JsonSchema(description = "Geographical jurisdiction (e.g. for European Commission is EU, for Croatian Science Foundation is HR)") private String jurisdiction; public String getJurisdiction() { diff --git a/src/main/java/eu/dnetlib/dhp/schema/dump/oaf/Instance.java b/src/main/java/eu/dnetlib/dhp/schema/dump/oaf/Instance.java index d0974a1..b8b2fbc 100644 --- a/src/main/java/eu/dnetlib/dhp/schema/dump/oaf/Instance.java +++ b/src/main/java/eu/dnetlib/dhp/schema/dump/oaf/Instance.java @@ -4,6 +4,11 @@ package eu.dnetlib.dhp.schema.dump.oaf; import java.io.Serializable; import java.util.List; +import org.apache.commons.lang3.StringUtils; + +import com.fasterxml.jackson.annotation.JsonIgnore; +import com.github.imifou.jsonschema.module.addon.annotation.JsonSchema; + /** * Represents the manifestations (i.e. different versions) of the result. For example: the pre-print and the published * versions are two manifestations of the same research result. It has the following parameters: - license of type @@ -12,28 +17,48 @@ import java.util.List; * type of type String to store the type of the instance as defined in the corresponding dnet vocabulary * (dnet:pubication_resource). It corresponds to the instancetype.classname of the instance to be mapped - url of type * List list of locations where the instance is accessible. It corresponds to url of the instance to be dumped - - * publicationdate of type String to store the publication date of the instance ;// dateofacceptance; - * - refereed of type + * publicationdate of type String to store the publication date of the instance ;// dateofacceptance; - refereed of type * String to store information abour the review status of the instance. Possible values are 'Unknown', * 'nonPeerReviewed', 'peerReviewed'. It corresponds to refereed.classname of the instance to be dumped * - articleprocessingcharge of type APC to store the article processing charges possibly associated to the instance + * -pid of type List that is the list of pids associated to the result coming from authoritative sources for that pid + * -alternateIdentifier of type List that is the list of pids associated to the result coming from NON authoritative + * sources for that pid + * -measure list to represent the measure computed for this instance (for example the Bip!Finder ones). It corresponds to measures in the model */ public class Instance implements Serializable { + @JsonSchema(description = "Measures computed for this instance, for example Bip!Finder ones") + private List measures; + + private List pid; + + @JsonSchema(description = "All the identifiers other than pids forged by an authorithy for the pid type (i.e. Crossref for DOIs") + private List alternateIdentifier; + private String license; + @JsonSchema(description = "The accessRights for this materialization of the result") private AccessRight accessright; + @JsonSchema(description = "The specific sub-type of this instance (see https://api.openaire.eu/vocabularies/dnet:result_typologies following the links)") private String type; + @JsonSchema(description = "URLs to the instance. They may link to the actual full-text or to the landing page at the hosting source. ") private List url; - private String publicationdate;// dateofacceptance; - + @JsonSchema(description = "The money spent to make this book or article available in Open Access. Source for this information is the OpenAPC initiative.") private APC articleprocessingcharge; + @JsonSchema(description = "Date of the research product") + private String publicationdate;// dateofacceptance; + + @JsonSchema(description = "If this instance has been peer-reviewed or not. Allowed values are peerReviewed, " + + "nonPeerReviewed, UNKNOWN (as defined in https://api.openaire.eu/vocabularies/dnet:review_levels)") private String refereed; // peer-review status + + public String getLicense() { return license; } @@ -89,4 +114,31 @@ public class Instance implements Serializable { public void setArticleprocessingcharge(APC articleprocessingcharge) { this.articleprocessingcharge = articleprocessingcharge; } + + public List getPid() { + return pid; + } + + public void setPid(List pid) { + this.pid = pid; + } + + public List getAlternateIdentifier() { + return alternateIdentifier; + } + + public void setAlternateIdentifier(List alternateIdentifier) { + this.alternateIdentifier = alternateIdentifier; + } + + public List getMeasures() { + return measures; + } + + public void setMeasures(List measures) { + this.measures = measures; + } } + + + diff --git a/src/main/java/eu/dnetlib/dhp/schema/dump/oaf/KeyValue.java b/src/main/java/eu/dnetlib/dhp/schema/dump/oaf/KeyValue.java deleted file mode 100644 index 849aa4d..0000000 --- a/src/main/java/eu/dnetlib/dhp/schema/dump/oaf/KeyValue.java +++ /dev/null @@ -1,48 +0,0 @@ - -package eu.dnetlib.dhp.schema.dump.oaf; - -import java.io.Serializable; - -import org.apache.commons.lang3.StringUtils; - -import com.fasterxml.jackson.annotation.JsonIgnore; - -/** - * To represent the information described by a key and a value. It has two parameters: - key to store the key (generally - * the OpenAIRE id for some entity) - value to store the value (generally the OpenAIRE name for the key) - */ -public class KeyValue implements Serializable { - - private String key; - - private String value; - - public String getKey() { - return key; - } - - public void setKey(String key) { - this.key = key; - } - - public String getValue() { - return value; - } - - public void setValue(String value) { - this.value = value; - } - - public static KeyValue newInstance(String key, String value) { - KeyValue inst = new KeyValue(); - inst.key = key; - inst.value = value; - return inst; - } - - @JsonIgnore - public boolean isBlank() { - return StringUtils.isBlank(key) && StringUtils.isBlank(value); - } - -} diff --git a/src/main/java/eu/dnetlib/dhp/schema/dump/oaf/Language.java b/src/main/java/eu/dnetlib/dhp/schema/dump/oaf/Language.java new file mode 100644 index 0000000..6d4de35 --- /dev/null +++ b/src/main/java/eu/dnetlib/dhp/schema/dump/oaf/Language.java @@ -0,0 +1,37 @@ +package eu.dnetlib.dhp.schema.dump.oaf; + +import java.io.Serializable; + +import com.github.imifou.jsonschema.module.addon.annotation.JsonSchema; + +public class Language implements Serializable { + + @JsonSchema(description="alpha-3/ISO 639-2 code of the language") + private String code; // the classid in the Qualifier + + @JsonSchema(description="Language label in English") + private String label; // the classname in the Qualifier + + public String getCode() { + return code; + } + + public void setCode(String code) { + this.code = code; + } + + public String getLabel() { + return label; + } + + public void setLabel(String label) { + this.label = label; + } + + public static Language newInstance(String code, String value) { + Language qualifier = new Language(); + qualifier.setCode(code); + qualifier.setLabel(value); + return qualifier; + } +} diff --git a/src/main/java/eu/dnetlib/dhp/schema/dump/oaf/Measure.java b/src/main/java/eu/dnetlib/dhp/schema/dump/oaf/Measure.java new file mode 100644 index 0000000..4c86001 --- /dev/null +++ b/src/main/java/eu/dnetlib/dhp/schema/dump/oaf/Measure.java @@ -0,0 +1,45 @@ +package eu.dnetlib.dhp.schema.dump.oaf; + +import java.io.Serializable; + +import org.apache.commons.lang3.StringUtils; + +import com.fasterxml.jackson.annotation.JsonIgnore; +import com.github.imifou.jsonschema.module.addon.annotation.JsonSchema; + +public class Measure implements Serializable { + @JsonSchema(description = "The measure (i.e. popularity)") + private String key; + + @JsonSchema(description = "The value for that measure") + private String value; + + public String getKey() { + return key; + } + + public void setKey(String key) { + this.key = key; + } + + public String getValue() { + return value; + } + + public void setValue(String value) { + this.value = value; + } + + public static Measure newInstance(String key, String value) { + Measure inst = new Measure(); + inst.key = key; + inst.value = value; + return inst; + } + + @JsonIgnore + public boolean isBlank() { + return StringUtils.isBlank(key) && StringUtils.isBlank(value); + } + +} diff --git a/src/main/java/eu/dnetlib/dhp/schema/dump/oaf/OpenAccessRoute.java b/src/main/java/eu/dnetlib/dhp/schema/dump/oaf/OpenAccessRoute.java new file mode 100644 index 0000000..fbef655 --- /dev/null +++ b/src/main/java/eu/dnetlib/dhp/schema/dump/oaf/OpenAccessRoute.java @@ -0,0 +1,13 @@ + +package eu.dnetlib.dhp.schema.dump.oaf; + +/** + * This Enum models the OpenAccess status, currently including only the values from Unpaywall + * + * https://support.unpaywall.org/support/solutions/articles/44001777288-what-do-the-types-of-oa-status-green-gold-hybrid-and-bronze-mean- + */ +public enum OpenAccessRoute { + + gold, green, hybrid, bronze + +} diff --git a/src/main/java/eu/dnetlib/dhp/schema/dump/oaf/Pid.java b/src/main/java/eu/dnetlib/dhp/schema/dump/oaf/Pid.java deleted file mode 100644 index 786ddb1..0000000 --- a/src/main/java/eu/dnetlib/dhp/schema/dump/oaf/Pid.java +++ /dev/null @@ -1,45 +0,0 @@ - -package eu.dnetlib.dhp.schema.dump.oaf; - -import java.io.Serializable; - -/** - * To represent the generic persistent identifier. It has two parameters: - id of type - * eu.dnetlib.dhp.schema.dump.oaf.ControlledField to store the scheme and value of the Persistent Identifier. - - * provenance of type eu.dnetlib.dhp.schema.dump.oaf.Provenance to store the provenance and trust of the information - */ -public class Pid implements Serializable { - private ControlledField id; - private Provenance provenance; - - public ControlledField getId() { - return id; - } - - public void setId(ControlledField pid) { - this.id = pid; - } - - public Provenance getProvenance() { - return provenance; - } - - public void setProvenance(Provenance provenance) { - this.provenance = provenance; - } - - public static Pid newInstance(ControlledField pid, Provenance provenance) { - Pid p = new Pid(); - p.id = pid; - p.provenance = provenance; - - return p; - } - - public static Pid newInstance(ControlledField pid) { - Pid p = new Pid(); - p.id = pid; - - return p; - } -} diff --git a/src/main/java/eu/dnetlib/dhp/schema/dump/oaf/Project.java b/src/main/java/eu/dnetlib/dhp/schema/dump/oaf/Project.java index 00cd7a0..fc7472b 100644 --- a/src/main/java/eu/dnetlib/dhp/schema/dump/oaf/Project.java +++ b/src/main/java/eu/dnetlib/dhp/schema/dump/oaf/Project.java @@ -3,6 +3,8 @@ package eu.dnetlib.dhp.schema.dump.oaf; import java.io.Serializable; +import com.github.imifou.jsonschema.module.addon.annotation.JsonSchema; + /** * This class to store the common information about the project that will be dumped for community and for the whole * graph - private String id to store the id of the project (OpenAIRE id) - private String code to store the grant @@ -10,9 +12,13 @@ import java.io.Serializable; * the tile of the project */ public class Project implements Serializable { + @JsonSchema(description = "The OpenAIRE id for the project") protected String id;// OpenAIRE id + + @JsonSchema(description = "The grant agreement number") protected String code; + @JsonSchema(description = "The acronym of the project") protected String acronym; protected String title; diff --git a/src/main/java/eu/dnetlib/dhp/schema/dump/oaf/Provenance.java b/src/main/java/eu/dnetlib/dhp/schema/dump/oaf/Provenance.java index 28fb3aa..2870ba5 100644 --- a/src/main/java/eu/dnetlib/dhp/schema/dump/oaf/Provenance.java +++ b/src/main/java/eu/dnetlib/dhp/schema/dump/oaf/Provenance.java @@ -3,6 +3,8 @@ package eu.dnetlib.dhp.schema.dump.oaf; import java.io.Serializable; +import com.github.imifou.jsonschema.module.addon.annotation.JsonSchema; + /** * Indicates the process that produced (or provided) the information, and the trust associated to the information. It * has two parameters: - provenance of type String to store the provenance of the information, - trust of type String to diff --git a/src/main/java/eu/dnetlib/dhp/schema/dump/oaf/Qualifier.java b/src/main/java/eu/dnetlib/dhp/schema/dump/oaf/Qualifier.java deleted file mode 100644 index 348c22b..0000000 --- a/src/main/java/eu/dnetlib/dhp/schema/dump/oaf/Qualifier.java +++ /dev/null @@ -1,42 +0,0 @@ - -package eu.dnetlib.dhp.schema.dump.oaf; - -import java.io.Serializable; - -import org.apache.commons.lang3.StringUtils; - -import com.fasterxml.jackson.annotation.JsonIgnore; - -/** - * To represent the information described by a code and a value It has two parameters: - code to store the code - * (generally the classid of the eu.dnetlib.dhp.schema.oaf.Qualifier element) - label to store the label (generally the - * classname of the eu.dnetlib.dhp.schema.oaf.Qualifier element - */ -public class Qualifier implements Serializable { - - private String code; // the classid in the Qualifier - private String label; // the classname in the Qualifier - - public String getCode() { - return code; - } - - public void setCode(String code) { - this.code = code; - } - - public String getLabel() { - return label; - } - - public void setLabel(String label) { - this.label = label; - } - - public static Qualifier newInstance(String code, String value) { - Qualifier qualifier = new Qualifier(); - qualifier.setCode(code); - qualifier.setLabel(value); - return qualifier; - } -} diff --git a/src/main/java/eu/dnetlib/dhp/schema/dump/oaf/Result.java b/src/main/java/eu/dnetlib/dhp/schema/dump/oaf/Result.java index 88ab2c3..560f74b 100644 --- a/src/main/java/eu/dnetlib/dhp/schema/dump/oaf/Result.java +++ b/src/main/java/eu/dnetlib/dhp/schema/dump/oaf/Result.java @@ -4,17 +4,21 @@ package eu.dnetlib.dhp.schema.dump.oaf; import java.io.Serializable; import java.util.List; -import eu.dnetlib.dhp.schema.dump.oaf.community.Project; +import com.github.imifou.jsonschema.module.addon.annotation.JsonSchema; /** * To represent the dumped result. It will be extended in the dump for Research Communities - Research - * Initiative/Infrastructures. It has the following parameters: - author of type + * Initiative/Infrastructures. It has the following parameters: + * - author of type * List to describe the authors of a result. For each author in the result - * represented in the internal model one author in the esternal model is produced. - type of type String to represent + * represented in the internal model one author in the esternal model is produced. + * - type of type String to represent * the category of the result. Possible values are publication, dataset, software, other. It corresponds to - * resulttype.classname of the dumped result - language of type eu.dnetlib.dhp.schema.dump.oaf.Qualifier to store + * resulttype.classname of the dumped result + * - language of type eu.dnetlib.dhp.schema.dump.oaf.Language to store * information about the language of the result. It is dumped as - code corresponds to language.classid - value - * corresponds to language.classname - country of type List to store the country + * corresponds to language.classname + * - country of type List to store the country * list to which the result is associated. For each country in the result respresented in the internal model one country * in the external model is produces - subjects of type List to store the subjects for * the result. For each subject in the result represented in the internal model one subject in the external model is @@ -62,73 +66,101 @@ import eu.dnetlib.dhp.schema.dump.oaf.community.Project; * to store information about the time OpenAIRE collected the record. It corresponds to dateofcollection of the result * represented in the internal model - lasteupdatetimestamp of type String to store the timestamp of the last update of * the record. It corresponds to lastupdatetimestamp of the resord represented in the internal model + * */ public class Result implements Serializable { private List author; // resulttype allows subclassing results into publications | datasets | software + @JsonSchema(description = "Type of the result: one of 'publication', 'dataset', 'software', 'other' (see also https://api.openaire.eu/vocabularies/dnet:result_typologies)") private String type; // resulttype // common fields - private Qualifier language; + private Language language; - private List country; + @JsonSchema(description="The list of countries associated to this result") + private List country; + @JsonSchema(description="Keywords associated to the result") private List subjects; + @JsonSchema(description = "A name or title by which a scientific result is known. May be the title of a publication, of a dataset or the name of a piece of software.") private String maintitle; + @JsonSchema(description = "Explanatory or alternative name by which a scientific result is known.") private String subtitle; private List description; + @JsonSchema(description = "Main date of the research product: typically the publication or issued date. In case of a research result with different versions with different dates, the date of the result is selected as the most frequent well-formatted date. If not available, then the most recent and complete date among those that are well-formatted. For statistics, the year is extracted and the result is counted only among the result of that year. Example: Pre-print date: 2019-02-03, Article date provided by repository: 2020-02, Article date provided by Crossref: 2020, OpenAIRE will set as date 2019-02-03, because it’s the most recent among the complete and well-formed dates. If then the repository updates the metadata and set a complete date (e.g. 2020-02-12), then this will be the new date for the result because it becomes the most recent most complete date. However, if OpenAIRE then collects the pre-print from another repository with date 2019-02-03, then this will be the “winning date” because it becomes the most frequent well-formatted date.") private String publicationdate; // dateofacceptance; + @JsonSchema(description = "The name of the entity that holds, archives, publishes prints, distributes, releases, issues, or produces the resource.") private String publisher; + @JsonSchema(description = "Date when the embargo ends and this result turns Open Access") private String embargoenddate; + @JsonSchema(description = "See definition of Dublin Core field dc:source") private List source; private List format; + @JsonSchema(description="Contributors for the result") private List contributor; private List coverage; - private AccessRight bestaccessright; + @JsonSchema(description="The openest of the access rights of this result.") + private BestAccessRight bestaccessright; + @JsonSchema(description="Container has information about the conference or journal where the result has been presented or published") private Container container;// Journal + @JsonSchema(description = "Only for results with type 'software': URL to the software documentation") private List documentationUrl; // software + @JsonSchema(description="Only for results with type 'software': the URL to the repository with the source code") private String codeRepositoryUrl; // software + @JsonSchema(description = "Only for results with type 'software': the programming language") private String programmingLanguage; // software + @JsonSchema(description="Only for results with type 'software': Information on the person responsible for providing further information regarding the resource") private List contactperson; // orp + @JsonSchema(description="Only for results with type 'software': Information on the group responsible for providing further information regarding the resource") private List contactgroup; // orp + @JsonSchema(description = "Only for results with type 'other': tool useful for the interpretation and/or re-used of the research product") private List tool; // orp + @JsonSchema(description = "Only for results with type 'dataset': the declared size of the dataset") private String size; // dataset + @JsonSchema(description = "Version of the result") private String version; // dataset + @JsonSchema(description = "Geolocation information") private List geolocation; // dataset + @JsonSchema(description = "The OpenAIRE identifiers for this result") private String id; + @JsonSchema(description = "Identifiers of the record at the original sources") private List originalId; - private List pid; + @JsonSchema(description = "Persistent identifiers of the result") + private List pid; + @JsonSchema(description="When OpenAIRE collected the record the last time") private String dateofcollection; + @JsonSchema(description = "Timestamp of last update of the record in OpenAIRE") private Long lastupdatetimestamp; + public Long getLastupdatetimestamp() { return lastupdatetimestamp; } @@ -153,11 +185,11 @@ public class Result implements Serializable { this.originalId = originalId; } - public List getPid() { + public List getPid() { return pid; } - public void setPid(List pid) { + public void setPid(List pid) { this.pid = pid; } @@ -193,19 +225,19 @@ public class Result implements Serializable { this.author = author; } - public Qualifier getLanguage() { + public Language getLanguage() { return language; } - public void setLanguage(Qualifier language) { + public void setLanguage(Language language) { this.language = language; } - public List getCountry() { + public List getCountry() { return country; } - public void setCountry(List country) { + public void setCountry(List country) { this.country = country; } @@ -297,11 +329,11 @@ public class Result implements Serializable { this.coverage = coverage; } - public AccessRight getBestaccessright() { + public BestAccessRight getBestaccessright() { return bestaccessright; } - public void setBestaccessright(AccessRight bestaccessright) { + public void setBestaccessright(BestAccessRight bestaccessright) { this.bestaccessright = bestaccessright; } @@ -376,4 +408,6 @@ public class Result implements Serializable { public void setGeolocation(List geolocation) { this.geolocation = geolocation; } + + } diff --git a/src/main/java/eu/dnetlib/dhp/schema/dump/oaf/ResultCountry.java b/src/main/java/eu/dnetlib/dhp/schema/dump/oaf/ResultCountry.java new file mode 100644 index 0000000..df2650b --- /dev/null +++ b/src/main/java/eu/dnetlib/dhp/schema/dump/oaf/ResultCountry.java @@ -0,0 +1,40 @@ +package eu.dnetlib.dhp.schema.dump.oaf; + +import com.github.imifou.jsonschema.module.addon.annotation.JsonSchema; + +/** + * Represents the country associated to the generic result. It extends eu.dnetlib.dhp.schema.dump.oaf.Country with a + * provenance parameter of type eu.dnetlib.dhp.schema.dumo.oaf.Provenance. The country is not mapped if its value in the + * result reprensented in the internal format is Unknown. The value for this element correspond to: + * - code corresponds to the classid of eu.dnetlib.dhp.schema.oaf.Country + * - label corresponds to the classname of eu.dnetlib.dhp.schema.oaf.Country + * - provenance set only if the dataInfo associated to the Country of the result to be dumped is not null. In this case: + * - provenance corresponds to dataInfo.provenanceaction.classid (to be modified with datainfo.provenanceaction.classname) + * - trust corresponds to dataInfo.trust + */ + +public class ResultCountry extends Country { + + @JsonSchema(description="Why this result is associated to the country.") + private Provenance provenance; + + public Provenance getProvenance() { + return provenance; + } + + public void setProvenance(Provenance provenance) { + this.provenance = provenance; + } + + public static ResultCountry newInstance(String code, String label, Provenance provenance) { + ResultCountry c = new ResultCountry(); + c.setProvenance(provenance); + c.setCode(code); + c.setLabel(label); + return c; + } + + public static ResultCountry newInstance(String code, String label, String provenance, String trust) { + return newInstance(code, label, Provenance.newInstance(provenance, trust)); + } +} diff --git a/src/main/java/eu/dnetlib/dhp/schema/dump/oaf/ResultPid.java b/src/main/java/eu/dnetlib/dhp/schema/dump/oaf/ResultPid.java new file mode 100644 index 0000000..f95d06e --- /dev/null +++ b/src/main/java/eu/dnetlib/dhp/schema/dump/oaf/ResultPid.java @@ -0,0 +1,41 @@ +package eu.dnetlib.dhp.schema.dump.oaf; + +import java.io.Serializable; + +import com.github.imifou.jsonschema.module.addon.annotation.JsonSchema; + +public class ResultPid implements Serializable { + @JsonSchema(description="The scheme of the persistent identifier for the result (i.e. doi). " + + "If the pid is here it means the information for the pid has been collected from an authority for " + + "that pid type (i.e. Crossref/Datacite for doi). The set of authoritative pid is: doi when collected from Crossref or Datacite " + + "pmid when collected from EuroPubmed, arxiv when collected from arXiv, handle from the repositories") + private String scheme; + + @JsonSchema(description="The value expressed in the scheme (i.e. 10.1000/182)") + private String value; + + public String getScheme() { + return scheme; + } + + public void setScheme(String scheme) { + this.scheme = scheme; + } + + public String getValue() { + return value; + } + + public void setValue(String value) { + this.value = value; + } + + public static ResultPid newInstance(String scheme, String value) { + ResultPid cf = new ResultPid(); + + cf.setScheme(scheme); + cf.setValue(value); + + return cf; + } +} diff --git a/src/main/java/eu/dnetlib/dhp/schema/dump/oaf/Subject.java b/src/main/java/eu/dnetlib/dhp/schema/dump/oaf/Subject.java index 5c4bbef..2edee2f 100644 --- a/src/main/java/eu/dnetlib/dhp/schema/dump/oaf/Subject.java +++ b/src/main/java/eu/dnetlib/dhp/schema/dump/oaf/Subject.java @@ -3,23 +3,29 @@ package eu.dnetlib.dhp.schema.dump.oaf; import java.io.Serializable; +import com.github.imifou.jsonschema.module.addon.annotation.JsonSchema; + /** - * To represent keywords associated to the result. It has two parameters: - subject of type - * eu.dnetlib.dhp.schema.dump.oaf.ControlledField to describe the subject. It mapped as: - schema it corresponds to - * qualifier.classid of the dumped subject - value it corresponds to the subject value - provenance of type - * eu.dnetlib.dhp.schema.dump.oaf.Provenance to represent the provenance of the subject. It is dumped only if dataInfo - * is not null. In this case: - provenance corresponds to dataInfo.provenanceaction.classname - trust corresponds to - * dataInfo.trust + * To represent keywords associated to the result. It has two parameters: + * - subject of type eu.dnetlib.dhp.schema.dump.oaf.SubjectSchemeValue to describe the subject. It mapped as: + * - schema it corresponds to qualifier.classid of the dumped subject + * - value it corresponds to the subject value + * - provenance of type eu.dnetlib.dhp.schema.dump.oaf.Provenance to represent the provenance of the subject. It is dumped only if dataInfo + * is not null. In this case: + * - provenance corresponds to dataInfo.provenanceaction.classname + * - trust corresponds to dataInfo.trust */ public class Subject implements Serializable { - private ControlledField subject; + private SubjectSchemeValue subject; + + @JsonSchema(description = "Why this subject is associated to the result") private Provenance provenance; - public ControlledField getSubject() { + public SubjectSchemeValue getSubject() { return subject; } - public void setSubject(ControlledField subject) { + public void setSubject(SubjectSchemeValue subject) { this.subject = subject; } diff --git a/src/main/java/eu/dnetlib/dhp/schema/dump/oaf/SubjectSchemeValue.java b/src/main/java/eu/dnetlib/dhp/schema/dump/oaf/SubjectSchemeValue.java new file mode 100644 index 0000000..9228088 --- /dev/null +++ b/src/main/java/eu/dnetlib/dhp/schema/dump/oaf/SubjectSchemeValue.java @@ -0,0 +1,39 @@ +package eu.dnetlib.dhp.schema.dump.oaf; + +import java.io.Serializable; + +import com.github.imifou.jsonschema.module.addon.annotation.JsonSchema; + +public class SubjectSchemeValue implements Serializable { + @JsonSchema(description="OpenAIRE subject classification scheme (https://api.openaire.eu/vocabularies/dnet:subject_classification_typologies).") + private String scheme; + + @JsonSchema(description="The value for the subject in the selected scheme. When the scheme is 'keyword', it means that the subject is free-text (i.e. not a term from a controlled vocabulary).") + private String value; + + public String getScheme() { + return scheme; + } + + public void setScheme(String scheme) { + this.scheme = scheme; + } + + public String getValue() { + return value; + } + + public void setValue(String value) { + this.value = value; + } + + public static SubjectSchemeValue newInstance(String scheme, String value) { + SubjectSchemeValue cf = new SubjectSchemeValue(); + + cf.setScheme(scheme); + cf.setValue(value); + + return cf; + } + +} diff --git a/src/main/java/eu/dnetlib/dhp/schema/dump/oaf/community/CfHbKeyValue.java b/src/main/java/eu/dnetlib/dhp/schema/dump/oaf/community/CfHbKeyValue.java new file mode 100644 index 0000000..68bda2d --- /dev/null +++ b/src/main/java/eu/dnetlib/dhp/schema/dump/oaf/community/CfHbKeyValue.java @@ -0,0 +1,46 @@ +package eu.dnetlib.dhp.schema.dump.oaf.community; + +import java.io.Serializable; + +import org.apache.commons.lang3.StringUtils; + +import com.fasterxml.jackson.annotation.JsonIgnore; +import com.github.imifou.jsonschema.module.addon.annotation.JsonSchema; + +public class CfHbKeyValue implements Serializable { + + @JsonSchema(description = "the OpenAIRE identifier of the data source") + private String key; + + @JsonSchema(description = "the name of the data source") + private String value; + + public String getKey() { + return key; + } + + public void setKey(String key) { + this.key = key; + } + + public String getValue() { + return value; + } + + public void setValue(String value) { + this.value = value; + } + + public static CfHbKeyValue newInstance(String key, String value) { + CfHbKeyValue inst = new CfHbKeyValue(); + inst.key = key; + inst.value = value; + return inst; + } + + @JsonIgnore + public boolean isBlank() { + return StringUtils.isBlank(key) && StringUtils.isBlank(value); + } + +} diff --git a/src/main/java/eu/dnetlib/dhp/schema/dump/oaf/community/CommunityInstance.java b/src/main/java/eu/dnetlib/dhp/schema/dump/oaf/community/CommunityInstance.java index 6a605d7..5e5a87e 100644 --- a/src/main/java/eu/dnetlib/dhp/schema/dump/oaf/community/CommunityInstance.java +++ b/src/main/java/eu/dnetlib/dhp/schema/dump/oaf/community/CommunityInstance.java @@ -1,8 +1,9 @@ package eu.dnetlib.dhp.schema.dump.oaf.community; +import com.github.imifou.jsonschema.module.addon.annotation.JsonSchema; + import eu.dnetlib.dhp.schema.dump.oaf.Instance; -import eu.dnetlib.dhp.schema.dump.oaf.KeyValue; /** * It extends eu.dnetlib.dhp.dump.oaf.Instance with values related to the community dump. In the Result dump this @@ -15,22 +16,25 @@ import eu.dnetlib.dhp.schema.dump.oaf.KeyValue; * collectedfrom.key - value corresponds to collectedfrom.value */ public class CommunityInstance extends Instance { - private KeyValue hostedby; - private KeyValue collectedfrom; + @JsonSchema(description = "Information about the source from which the instance can be viewed or downloaded.") + private CfHbKeyValue hostedby; - public KeyValue getHostedby() { + @JsonSchema(description = "Information about the source from which the record has been collected") + private CfHbKeyValue collectedfrom; + + public CfHbKeyValue getHostedby() { return hostedby; } - public void setHostedby(KeyValue hostedby) { + public void setHostedby(CfHbKeyValue hostedby) { this.hostedby = hostedby; } - public KeyValue getCollectedfrom() { + public CfHbKeyValue getCollectedfrom() { return collectedfrom; } - public void setCollectedfrom(KeyValue collectedfrom) { + public void setCollectedfrom(CfHbKeyValue collectedfrom) { this.collectedfrom = collectedfrom; } } diff --git a/src/main/java/eu/dnetlib/dhp/schema/dump/oaf/community/CommunityResult.java b/src/main/java/eu/dnetlib/dhp/schema/dump/oaf/community/CommunityResult.java index 690a537..9decf82 100644 --- a/src/main/java/eu/dnetlib/dhp/schema/dump/oaf/community/CommunityResult.java +++ b/src/main/java/eu/dnetlib/dhp/schema/dump/oaf/community/CommunityResult.java @@ -3,7 +3,8 @@ package eu.dnetlib.dhp.schema.dump.oaf.community; import java.util.List; -import eu.dnetlib.dhp.schema.dump.oaf.KeyValue; +import com.github.imifou.jsonschema.module.addon.annotation.JsonSchema; + import eu.dnetlib.dhp.schema.dump.oaf.Result; /** @@ -20,12 +21,16 @@ import eu.dnetlib.dhp.schema.dump.oaf.Result; */ public class CommunityResult extends Result { + @JsonSchema(description = "List of projects (i.e. grants) that (co-)funded the production ofn the research results") private List projects; + @JsonSchema(description = "Reference to a relevant research infrastructure, initiative or community (RI/RC) among those collaborating with OpenAIRE. Please see https://connect.openaire.eu") private List context; - protected List collectedfrom; + @JsonSchema(description = "Information about the sources from which the record has been collected") + protected List collectedfrom; + @JsonSchema(description = "Each instance is one specific materialisation or version of the result. For example, you can have one result with three instance: one is the pre-print, one is the post-print, one is te published version") private List instance; public List getInstance() { @@ -36,11 +41,11 @@ public class CommunityResult extends Result { this.instance = instance; } - public List getCollectedfrom() { + public List getCollectedfrom() { return collectedfrom; } - public void setCollectedfrom(List collectedfrom) { + public void setCollectedfrom(List collectedfrom) { this.collectedfrom = collectedfrom; } @@ -61,3 +66,5 @@ public class CommunityResult extends Result { } } + + diff --git a/src/main/java/eu/dnetlib/dhp/schema/dump/oaf/community/Context.java b/src/main/java/eu/dnetlib/dhp/schema/dump/oaf/community/Context.java index 16d5a6e..79c1647 100644 --- a/src/main/java/eu/dnetlib/dhp/schema/dump/oaf/community/Context.java +++ b/src/main/java/eu/dnetlib/dhp/schema/dump/oaf/community/Context.java @@ -3,9 +3,12 @@ package eu.dnetlib.dhp.schema.dump.oaf.community; import java.util.List; import java.util.Objects; +import java.util.Optional; +import java.util.stream.Collectors; + +import com.github.imifou.jsonschema.module.addon.annotation.JsonSchema; import eu.dnetlib.dhp.schema.dump.oaf.Provenance; -import eu.dnetlib.dhp.schema.dump.oaf.Qualifier; /** * Reference to a relevant research infrastructure, initiative or community (RI/RC) among those collaborating with @@ -19,7 +22,14 @@ import eu.dnetlib.dhp.schema.dump.oaf.Qualifier; * instantiated if the element datainfo.provenanceaction is not null. In this case - provenance corresponds to * dataInfo.provenanceaction.classname - trust corresponds to dataInfo.trust */ -public class Context extends Qualifier { +public class Context { + @JsonSchema(description="Code identifying the RI/RC") + private String code; + + @JsonSchema(description="Label of the RI/RC") + private String label; + + @JsonSchema(description = "Why this result is associated to the RI/RC.") private List provenance; public List getProvenance() { @@ -30,11 +40,32 @@ public class Context extends Qualifier { this.provenance = provenance; } + public String getCode() { + return code; + } + + public void setCode(String code) { + this.code = code; + } + + public String getLabel() { + return label; + } + + public void setLabel(String label) { + this.label = label; + } + + @Override public int hashCode() { - String provenance = ""; - this.provenance.forEach(p -> provenance.concat(p.toString())); - return Objects.hash(getCode(), getLabel(), provenance); + final String p = Optional.ofNullable(getProvenance()) + .map(prov -> prov.stream() + .map(Provenance::toString) + .collect(Collectors.joining())) + .orElse(""); + + return Objects.hash(getCode(), getLabel(), p); } } diff --git a/src/main/java/eu/dnetlib/dhp/schema/dump/oaf/community/Funder.java b/src/main/java/eu/dnetlib/dhp/schema/dump/oaf/community/Funder.java index adb4163..5e17e0c 100644 --- a/src/main/java/eu/dnetlib/dhp/schema/dump/oaf/community/Funder.java +++ b/src/main/java/eu/dnetlib/dhp/schema/dump/oaf/community/Funder.java @@ -1,7 +1,7 @@ package eu.dnetlib.dhp.schema.dump.oaf.community; -import java.io.Serializable; +import com.github.imifou.jsonschema.module.addon.annotation.JsonSchema; /** * To store information about the funder funding the project related to the result. It has the following parameters: - @@ -11,6 +11,7 @@ import java.io.Serializable; */ public class Funder extends eu.dnetlib.dhp.schema.dump.oaf.Funder { + @JsonSchema(description = "Stream of funding (e.g. for European Commission can be H2020 or FP7)") private String fundingStream; public String getFundingStream() { diff --git a/src/main/java/eu/dnetlib/dhp/schema/dump/oaf/community/Project.java b/src/main/java/eu/dnetlib/dhp/schema/dump/oaf/community/Project.java index 030b565..88c5216 100644 --- a/src/main/java/eu/dnetlib/dhp/schema/dump/oaf/community/Project.java +++ b/src/main/java/eu/dnetlib/dhp/schema/dump/oaf/community/Project.java @@ -1,7 +1,7 @@ package eu.dnetlib.dhp.schema.dump.oaf.community; -import java.io.Serializable; +import com.github.imifou.jsonschema.module.addon.annotation.JsonSchema; import eu.dnetlib.dhp.schema.dump.oaf.Provenance; @@ -15,10 +15,21 @@ import eu.dnetlib.dhp.schema.dump.oaf.Provenance; */ public class Project extends eu.dnetlib.dhp.schema.dump.oaf.Project { + @JsonSchema(description = "Information about the funder funding the project") private Funder funder; private Provenance provenance; + private Validated validated; + + public void setValidated(Validated validated){ + this.validated = validated; + } + + public Validated getValidated(){ + return validated; + } + public Provenance getProvenance() { return provenance; } diff --git a/src/main/java/eu/dnetlib/dhp/schema/dump/oaf/community/Validated.java b/src/main/java/eu/dnetlib/dhp/schema/dump/oaf/community/Validated.java new file mode 100644 index 0000000..0d136f0 --- /dev/null +++ b/src/main/java/eu/dnetlib/dhp/schema/dump/oaf/community/Validated.java @@ -0,0 +1,39 @@ + +package eu.dnetlib.dhp.schema.dump.oaf.community; + +import java.io.Serializable; + +/** + * To store information about the funder funding the project related to the result. It has the following parameters: - + * shortName of type String to store the funder short name (e.c. AKA). - name of type String to store the funder name + * (e.c. Akademy of Finland) - fundingStream of type String to store the funding stream - jurisdiction of type String to + * store the jurisdiction of the funder + */ +public class Validated implements Serializable { + + private String validationDate; + private Boolean validatedByFunder; + + public void setValidationDate(String validationDate){ + this.validationDate = validationDate; + } + + public String getValidationDate(){ + return validationDate; + } + + public void setValidatedByFunder(Boolean validated){ + this.validatedByFunder = validated; + } + + public Boolean getValidatedByFunder(){ + return validatedByFunder; + } + + public static Validated newInstance(Boolean validated, String validationDate){ + Validated v = new Validated(); + v.validatedByFunder = validated; + v.validationDate = validationDate; + return v; + } +} diff --git a/src/main/java/eu/dnetlib/dhp/schema/dump/oaf/graph/Datasource.java b/src/main/java/eu/dnetlib/dhp/schema/dump/oaf/graph/Datasource.java index 6b2b7b1..3c2a7b3 100644 --- a/src/main/java/eu/dnetlib/dhp/schema/dump/oaf/graph/Datasource.java +++ b/src/main/java/eu/dnetlib/dhp/schema/dump/oaf/graph/Datasource.java @@ -4,9 +4,9 @@ package eu.dnetlib.dhp.schema.dump.oaf.graph; import java.io.Serializable; import java.util.List; +import com.github.imifou.jsonschema.module.addon.annotation.JsonSchema; + import eu.dnetlib.dhp.schema.dump.oaf.Container; -import eu.dnetlib.dhp.schema.dump.oaf.ControlledField; -import eu.dnetlib.dhp.schema.dump.oaf.KeyValue; /** * To store information about the datasource OpenAIRE collects information from. It contains the following parameters: - @@ -34,70 +34,91 @@ import eu.dnetlib.dhp.schema.dump.oaf.KeyValue; * datasource. It corresponds to description.value of the datasource represented in the internal model */ public class Datasource implements Serializable { - + @JsonSchema(description = "The OpenAIRE id of the data source") private String id; // string + @JsonSchema(description = "Original identifiers for the datasource") private List originalId; // list string - private List pid; // list + @JsonSchema(description = "Persistent identifiers of the datasource") + private List pid; // list - private ControlledField datasourcetype; // value + @JsonSchema(description = "The type of the datasource. See https://api.openaire.eu/vocabularies/dnet:datasource_typologies") + private DatasourceSchemeValue datasourcetype; // value + @JsonSchema(description = "OpenAIRE guidelines the data source comply with. See also https://guidelines.openaire.eu.") private String openairecompatibility; // value + @JsonSchema(description = "The official name of the datasource") private String officialname; // string + @JsonSchema(description = "The English name of the datasource") private String englishname; // string private String websiteurl; // string private String logourl; // string + @JsonSchema(description = "The date of last validation against the OpenAIRE guidelines for the datasource records") private String dateofvalidation; // string private String description; // description + @JsonSchema(description = "List of subjects associated to the datasource") private List subjects; // List // opendoar specific fields (od*) + @JsonSchema(description = "The languages present in the data source's content, as defined by OpenDOAR.") private List languages; // odlanguages List + @JsonSchema(description = "Types of content in the data source, as defined by OpenDOAR") private List contenttypes; // odcontent types List // re3data fields + @JsonSchema(description = "Releasing date of the data source, as defined by re3data.org") private String releasestartdate; // string + @JsonSchema(description = "Date when the data source went offline or stopped ingesting new research data. As defined by re3data.org") private String releaseenddate; // string + @JsonSchema(description = "The URL of a mission statement describing the designated community of the data source. As defined by re3data.org") private String missionstatementurl; // string - // {open, restricted or closed} + @JsonSchema(description = "Type of access to the data source, as defined by re3data.org. Possible values: " + + "{open, restricted, closed}") private String accessrights; // databaseaccesstype string // {open, restricted or closed} + @JsonSchema(description = "Type of data upload. As defined by re3data.org: one of {open, restricted,closed}") private String uploadrights; // datauploadtype string - // {feeRequired, registration, other} + @JsonSchema(description = "Access restrinctions to the data source, as defined by re3data.org. One of {feeRequired, registration, other}") private String databaseaccessrestriction; // string - // {feeRequired, registration, other} + @JsonSchema(description = "Upload restrictions applied by the datasource, as defined by re3data.org. One of {feeRequired, registration, other}") private String datauploadrestriction; // string + @JsonSchema(description = "As defined by redata.org: 'yes' if the data source supports versioning, 'no' otherwise.") private Boolean versioning; // boolean + @JsonSchema(description = "The URL of the data source providing information on how to cite its items. As defined by re3data.org.") private String citationguidelineurl; // string // {yes, no, uknown} - + @JsonSchema(description = "The persistent identifier system that is used by the data source. As defined by re3data.org") private String pidsystems; // string + @JsonSchema(description = "The certificate, seal or standard the data source complies with. As defined by re3data.org.") private String certificates; // string - private List policies; // + @JsonSchema(description = "Policies of the data source, as defined in OpenDOAR.") + private List policies; // + @JsonSchema(description = "Information about the journal, if this data source is of type Journal.") private Container journal; // issn etc del Journal + public String getId() { return id; } @@ -114,19 +135,19 @@ public class Datasource implements Serializable { this.originalId = originalId; } - public List getPid() { + public List getPid() { return pid; } - public void setPid(List pid) { + public void setPid(List pid) { this.pid = pid; } - public ControlledField getDatasourcetype() { + public DatasourceSchemeValue getDatasourcetype() { return datasourcetype; } - public void setDatasourcetype(ControlledField datasourcetype) { + public void setDatasourcetype(DatasourceSchemeValue datasourcetype) { this.datasourcetype = datasourcetype; } @@ -298,11 +319,11 @@ public class Datasource implements Serializable { this.certificates = certificates; } - public List getPolicies() { + public List getPolicies() { return policies; } - public void setPolicies(List policiesr3) { + public void setPolicies(List policiesr3) { this.policies = policiesr3; } @@ -314,3 +335,5 @@ public class Datasource implements Serializable { this.journal = journal; } } + + diff --git a/src/main/java/eu/dnetlib/dhp/schema/dump/oaf/graph/DatasourcePid.java b/src/main/java/eu/dnetlib/dhp/schema/dump/oaf/graph/DatasourcePid.java new file mode 100644 index 0000000..6ecdccc --- /dev/null +++ b/src/main/java/eu/dnetlib/dhp/schema/dump/oaf/graph/DatasourcePid.java @@ -0,0 +1,40 @@ +package eu.dnetlib.dhp.schema.dump.oaf.graph; + +import java.io.Serializable; + +import com.github.imifou.jsonschema.module.addon.annotation.JsonSchema; + +public class DatasourcePid implements Serializable { + + @JsonSchema(description="The scheme used to express the value ") + private String scheme; + + @JsonSchema(description="The value expressed in the scheme ") + private String value; + + public String getScheme() { + return scheme; + } + + public void setScheme(String scheme) { + this.scheme = scheme; + } + + public String getValue() { + return value; + } + + public void setValue(String value) { + this.value = value; + } + + public static DatasourcePid newInstance(String scheme, String value) { + DatasourcePid cf = new DatasourcePid(); + + cf.setScheme(scheme); + cf.setValue(value); + + return cf; + } + +} diff --git a/src/main/java/eu/dnetlib/dhp/schema/dump/oaf/graph/DatasourceSchemeValue.java b/src/main/java/eu/dnetlib/dhp/schema/dump/oaf/graph/DatasourceSchemeValue.java new file mode 100644 index 0000000..8963444 --- /dev/null +++ b/src/main/java/eu/dnetlib/dhp/schema/dump/oaf/graph/DatasourceSchemeValue.java @@ -0,0 +1,39 @@ +package eu.dnetlib.dhp.schema.dump.oaf.graph; + +import java.io.Serializable; + +import com.github.imifou.jsonschema.module.addon.annotation.JsonSchema; + +public //TODO change the DatasourceSchemaValue to DatasourceKeyValue. The scheme is always the dnet one. What we show here is the entry in the scheme (the key) and its understandable value +class DatasourceSchemeValue implements Serializable { + @JsonSchema(description="The scheme used to express the value (i.e. pubsrepository::journal)") + private String scheme; + + @JsonSchema(description="The value expressed in the scheme (Journal)") + private String value; + + public String getScheme() { + return scheme; + } + + public void setScheme(String scheme) { + this.scheme = scheme; + } + + public String getValue() { + return value; + } + + public void setValue(String value) { + this.value = value; + } + + public static DatasourceSchemeValue newInstance(String scheme, String value) { + DatasourceSchemeValue cf = new DatasourceSchemeValue(); + + cf.setScheme(scheme); + cf.setValue(value); + + return cf; + } +} diff --git a/src/main/java/eu/dnetlib/dhp/schema/dump/oaf/graph/Funder.java b/src/main/java/eu/dnetlib/dhp/schema/dump/oaf/graph/Funder.java index 3b298c8..81721d2 100644 --- a/src/main/java/eu/dnetlib/dhp/schema/dump/oaf/graph/Funder.java +++ b/src/main/java/eu/dnetlib/dhp/schema/dump/oaf/graph/Funder.java @@ -1,7 +1,7 @@ package eu.dnetlib.dhp.schema.dump.oaf.graph; -import java.io.Serializable; +import com.github.imifou.jsonschema.module.addon.annotation.JsonSchema; /** * To store information about the funder funding the project related to the result. It extends @@ -10,6 +10,7 @@ import java.io.Serializable; */ public class Funder extends eu.dnetlib.dhp.schema.dump.oaf.Funder { + @JsonSchema(description = "Description of the funding stream") private Fundings funding_stream; public Fundings getFunding_stream() { diff --git a/src/main/java/eu/dnetlib/dhp/schema/dump/oaf/graph/Fundings.java b/src/main/java/eu/dnetlib/dhp/schema/dump/oaf/graph/Fundings.java index a74c347..56dacda 100644 --- a/src/main/java/eu/dnetlib/dhp/schema/dump/oaf/graph/Fundings.java +++ b/src/main/java/eu/dnetlib/dhp/schema/dump/oaf/graph/Fundings.java @@ -3,6 +3,8 @@ package eu.dnetlib.dhp.schema.dump.oaf.graph; import java.io.Serializable; +import com.github.imifou.jsonschema.module.addon.annotation.JsonSchema; + /** * To store inforamtion about the funding stream. It has two parameters: - private String id to store the id of the * fundings stream. The id is created by appending the shortname of the funder to the name of each level in the xml @@ -14,6 +16,7 @@ import java.io.Serializable; */ public class Fundings implements Serializable { + @JsonSchema(description = "Id of the funding stream") private String id; private String description; diff --git a/src/main/java/eu/dnetlib/dhp/schema/dump/oaf/graph/Granted.java b/src/main/java/eu/dnetlib/dhp/schema/dump/oaf/graph/Granted.java index 94ace55..a4d3fa2 100644 --- a/src/main/java/eu/dnetlib/dhp/schema/dump/oaf/graph/Granted.java +++ b/src/main/java/eu/dnetlib/dhp/schema/dump/oaf/graph/Granted.java @@ -2,7 +2,8 @@ package eu.dnetlib.dhp.schema.dump.oaf.graph; import java.io.Serializable; -import java.util.Optional; + +import com.github.imifou.jsonschema.module.addon.annotation.JsonSchema; /** * To describe the funded amount. It has the following parameters: - private String currency to store the currency of @@ -10,8 +11,13 @@ import java.util.Optional; * funded amount by the funder */ public class Granted implements Serializable { + @JsonSchema(description = "The currency of the granted amount (e.g. EUR)") private String currency; + + @JsonSchema(description = "The total cost of the project") private float totalcost; + + @JsonSchema(description = "The funded amount") private float fundedamount; public String getCurrency() { diff --git a/src/main/java/eu/dnetlib/dhp/schema/dump/oaf/graph/GraphResult.java b/src/main/java/eu/dnetlib/dhp/schema/dump/oaf/graph/GraphResult.java index 1675f9e..654b75e 100644 --- a/src/main/java/eu/dnetlib/dhp/schema/dump/oaf/graph/GraphResult.java +++ b/src/main/java/eu/dnetlib/dhp/schema/dump/oaf/graph/GraphResult.java @@ -3,6 +3,8 @@ package eu.dnetlib.dhp.schema.dump.oaf.graph; import java.util.List; +import com.github.imifou.jsonschema.module.addon.annotation.JsonSchema; + import eu.dnetlib.dhp.schema.dump.oaf.Instance; import eu.dnetlib.dhp.schema.dump.oaf.Result; @@ -12,6 +14,7 @@ import eu.dnetlib.dhp.schema.dump.oaf.Result; * the same parameter in the result represented in the internal model */ public class GraphResult extends Result { + @JsonSchema(description = "Each instance is one specific materialisation or version of the result. For example, you can have one result with three instance: one is the pre-print, one is the post-print, one is te published version") private List instance; public List getInstance() { diff --git a/src/main/java/eu/dnetlib/dhp/schema/dump/oaf/graph/Node.java b/src/main/java/eu/dnetlib/dhp/schema/dump/oaf/graph/Node.java index 00f1a29..0151239 100644 --- a/src/main/java/eu/dnetlib/dhp/schema/dump/oaf/graph/Node.java +++ b/src/main/java/eu/dnetlib/dhp/schema/dump/oaf/graph/Node.java @@ -3,6 +3,8 @@ package eu.dnetlib.dhp.schema.dump.oaf.graph; import java.io.Serializable; +import com.github.imifou.jsonschema.module.addon.annotation.JsonSchema; + /** * To represent the generic node in a relation. It has the following parameters: - private String id the openaire id of * the entity in the relation - private String type the type of the entity in the relation. Consider the generic diff --git a/src/main/java/eu/dnetlib/dhp/schema/dump/oaf/graph/Organization.java b/src/main/java/eu/dnetlib/dhp/schema/dump/oaf/graph/Organization.java index 2407c9c..36fdff9 100644 --- a/src/main/java/eu/dnetlib/dhp/schema/dump/oaf/graph/Organization.java +++ b/src/main/java/eu/dnetlib/dhp/schema/dump/oaf/graph/Organization.java @@ -4,28 +4,36 @@ package eu.dnetlib.dhp.schema.dump.oaf.graph; import java.io.Serializable; import java.util.List; -import eu.dnetlib.dhp.schema.dump.oaf.ControlledField; +import com.github.imifou.jsonschema.module.addon.annotation.JsonSchema; + import eu.dnetlib.dhp.schema.dump.oaf.Country; -import eu.dnetlib.dhp.schema.dump.oaf.KeyValue; -import eu.dnetlib.dhp.schema.dump.oaf.Qualifier; -import eu.dnetlib.dhp.schema.dump.oaf.community.Project; /** - * To represent the generic organizaiton. It has the following parameters: - private String legalshortname to store the - * legalshortname of the organizaiton - private String legalname to store the legal name of the organization - private - * String websiteurl to store the websiteurl of the organization - private List alternativenames to store the - * alternative names of the organization - private Qualifier country to store the country of the organization - private - * String id to store the id of the organization - private List pid to store the list of pids for the - * organization + * To represent the generic organizaiton. It has the following parameters: + * - private String legalshortname to store the legalshortname of the organizaiton + * - private String legalname to store the legal name of the organization + * - private String websiteurl to store the websiteurl of the organization + * - private List alternativenames to store the alternative names of the organization + * - private Country country to store the country of the organization + * - private String id to store the openaire id of the organization + * - private List pid to store the list of pids for the organization */ public class Organization implements Serializable { private String legalshortname; private String legalname; private String websiteurl; + + @JsonSchema(description="Alternative names that identify the organisation") private List alternativenames; - private Qualifier country; + + @JsonSchema(description="The organisation country") + private Country country; + + @JsonSchema(description="The OpenAIRE id for the organisation") private String id; - private List pid; + + @JsonSchema(description="Persistent identifiers for the organisation i.e. isni 0000000090326370") + private List pid; public String getLegalshortname() { return legalshortname; @@ -59,11 +67,11 @@ public class Organization implements Serializable { this.alternativenames = alternativenames; } - public Qualifier getCountry() { + public Country getCountry() { return country; } - public void setCountry(Qualifier country) { + public void setCountry(Country country) { this.country = country; } @@ -75,12 +83,15 @@ public class Organization implements Serializable { this.id = id; } - public List getPid() { + public List getPid() { return pid; } - public void setPid(List pid) { + public void setPid(List pid) { this.pid = pid; } } + + + diff --git a/src/main/java/eu/dnetlib/dhp/schema/dump/oaf/graph/OrganizationPid.java b/src/main/java/eu/dnetlib/dhp/schema/dump/oaf/graph/OrganizationPid.java new file mode 100644 index 0000000..399daec --- /dev/null +++ b/src/main/java/eu/dnetlib/dhp/schema/dump/oaf/graph/OrganizationPid.java @@ -0,0 +1,42 @@ +package eu.dnetlib.dhp.schema.dump.oaf.graph; + +import java.io.Serializable; + +import com.github.imifou.jsonschema.module.addon.annotation.JsonSchema; + +public + +class OrganizationPid implements Serializable { + @JsonSchema(description="The scheme of the identifier (i.e. isni)") + private String scheme; + + @JsonSchema(description="The value in the schema (i.e. 0000000090326370)") + private String value; + + public String getScheme() { + return scheme; + } + + public void setScheme(String scheme) { + this.scheme = scheme; + } + + public String getValue() { + return value; + } + + public void setValue(String value) { + this.value = value; + } + + public static OrganizationPid newInstance(String scheme, String value) { + OrganizationPid cf = new OrganizationPid(); + + cf.setScheme(scheme); + cf.setValue(value); + + return cf; + } + + +} diff --git a/src/main/java/eu/dnetlib/dhp/schema/dump/oaf/graph/Programme.java b/src/main/java/eu/dnetlib/dhp/schema/dump/oaf/graph/Programme.java index 9892790..6ffaaac 100644 --- a/src/main/java/eu/dnetlib/dhp/schema/dump/oaf/graph/Programme.java +++ b/src/main/java/eu/dnetlib/dhp/schema/dump/oaf/graph/Programme.java @@ -3,12 +3,17 @@ package eu.dnetlib.dhp.schema.dump.oaf.graph; import java.io.Serializable; +import com.github.imifou.jsonschema.module.addon.annotation.JsonSchema; + /** * To store information about the ec programme for the project. It has the following parameters: - private String code * to store the code of the programme - private String description to store the description of the programme */ public class Programme implements Serializable { + @JsonSchema(description = "The code of the programme") private String code; + + @JsonSchema(description = "The description of the programme") private String description; public String getCode() { diff --git a/src/main/java/eu/dnetlib/dhp/schema/dump/oaf/graph/Project.java b/src/main/java/eu/dnetlib/dhp/schema/dump/oaf/graph/Project.java index 612be9d..d7ddc3e 100644 --- a/src/main/java/eu/dnetlib/dhp/schema/dump/oaf/graph/Project.java +++ b/src/main/java/eu/dnetlib/dhp/schema/dump/oaf/graph/Project.java @@ -4,6 +4,8 @@ package eu.dnetlib.dhp.schema.dump.oaf.graph; import java.io.Serializable; import java.util.List; +import com.github.imifou.jsonschema.module.addon.annotation.JsonSchema; + /** * This is the class representing the Project in the model used for the dumps of the whole graph. At the moment the dump * of the Projects differs from the other dumps because we do not create relations between Funders (Organization) and @@ -41,6 +43,7 @@ public class Project implements Serializable { private String code; private String acronym; private String title; + private String startdate; private String enddate; @@ -54,12 +57,15 @@ public class Project implements Serializable { private boolean openaccessmandatefordataset; private List subject; + @JsonSchema(description = "Funding information for the project") private List funding; private String summary; + @JsonSchema(description = "The money granted to the project") private Granted granted; + @JsonSchema(description = "The h2020 programme funding the project") private List h2020programme; public String getId() { diff --git a/src/main/java/eu/dnetlib/dhp/schema/dump/oaf/graph/RelType.java b/src/main/java/eu/dnetlib/dhp/schema/dump/oaf/graph/RelType.java index 629b30e..a66012c 100644 --- a/src/main/java/eu/dnetlib/dhp/schema/dump/oaf/graph/RelType.java +++ b/src/main/java/eu/dnetlib/dhp/schema/dump/oaf/graph/RelType.java @@ -3,6 +3,8 @@ package eu.dnetlib.dhp.schema.dump.oaf.graph; import java.io.Serializable; +import com.github.imifou.jsonschema.module.addon.annotation.JsonSchema; + /** * To represent the semantics of the generic relation between two entities. It has the following parameters: - private * String name to store the semantics of the relation (i.e. isAuthorInstitutionOf). It corresponds to the relclass diff --git a/src/main/java/eu/dnetlib/dhp/schema/dump/oaf/graph/Relation.java b/src/main/java/eu/dnetlib/dhp/schema/dump/oaf/graph/Relation.java index e2b126e..07bc3c4 100644 --- a/src/main/java/eu/dnetlib/dhp/schema/dump/oaf/graph/Relation.java +++ b/src/main/java/eu/dnetlib/dhp/schema/dump/oaf/graph/Relation.java @@ -4,6 +4,8 @@ package eu.dnetlib.dhp.schema.dump.oaf.graph; import java.io.Serializable; import java.util.Objects; +import com.github.imifou.jsonschema.module.addon.annotation.JsonSchema; + import eu.dnetlib.dhp.schema.dump.oaf.Provenance; /** @@ -13,11 +15,24 @@ import eu.dnetlib.dhp.schema.dump.oaf.Provenance; * provenance of the relation */ public class Relation implements Serializable { + @JsonSchema(description = "The node source in the relation") private Node source; + + @JsonSchema(description = "The node target in the relation") private Node target; + + @JsonSchema(description = "To represent the semantics of a relation between two entities") private RelType reltype; + + @JsonSchema(description = "The reason why OpenAIRE holds the relation ") private Provenance provenance; + @JsonSchema(description = "True if the relation is related to a project and it has been collected from an authoritative source (i.e. the funder)") + private boolean validated; + + @JsonSchema(description = "The date when the relation was collected from OpenAIRE") + private String validationDate; + public Node getSource() { return source; } @@ -50,6 +65,23 @@ public class Relation implements Serializable { this.provenance = provenance; } + public void setValidated(boolean validate){ + this.validated = validate; + } + + public boolean getValidated(){ + return validated; + } + + public void setValidationDate(String validationDate){ + this.validationDate = validationDate; + } + + public String getValidationDate(){ + return validationDate; + } + + @Override public int hashCode() { diff --git a/src/main/java/eu/dnetlib/dhp/schema/dump/oaf/graph/ResearchCommunity.java b/src/main/java/eu/dnetlib/dhp/schema/dump/oaf/graph/ResearchCommunity.java index 026042c..95fe861 100644 --- a/src/main/java/eu/dnetlib/dhp/schema/dump/oaf/graph/ResearchCommunity.java +++ b/src/main/java/eu/dnetlib/dhp/schema/dump/oaf/graph/ResearchCommunity.java @@ -3,11 +3,14 @@ package eu.dnetlib.dhp.schema.dump.oaf.graph; import java.util.List; +import com.github.imifou.jsonschema.module.addon.annotation.JsonSchema; + /** * To represent RC entities. It extends eu.dnetlib.dhp.dump.oaf.grap.ResearchInitiative by adding the parameter subject * to store the list of subjects related to the community */ public class ResearchCommunity extends ResearchInitiative { + @JsonSchema(description = "Only for research communities: the list of the subjects associated to the research community") private List subject; public List getSubject() { diff --git a/src/main/java/eu/dnetlib/dhp/schema/dump/oaf/graph/ResearchInitiative.java b/src/main/java/eu/dnetlib/dhp/schema/dump/oaf/graph/ResearchInitiative.java index ad4ad88..4ea9730 100644 --- a/src/main/java/eu/dnetlib/dhp/schema/dump/oaf/graph/ResearchInitiative.java +++ b/src/main/java/eu/dnetlib/dhp/schema/dump/oaf/graph/ResearchInitiative.java @@ -3,6 +3,8 @@ package eu.dnetlib.dhp.schema.dump.oaf.graph; import java.io.Serializable; +import com.github.imifou.jsonschema.module.addon.annotation.JsonSchema; + /** * To represent entity of type RC/RI. It has the following parameters, which are mostly derived by the profile * - private @@ -18,11 +20,22 @@ import java.io.Serializable; * zenodo_community to store the zenodo community associated to the context (main zenodo community) */ public class ResearchInitiative implements Serializable { + @JsonSchema(description = "The OpenAIRE id for the community/research infrastructure") private String id; // openaireId - private String originalId; // context id + + @JsonSchema(description = "The acronym of the community") + private String acronym; // context id + + @JsonSchema(description = "The long name of the community") private String name; // context name + + @JsonSchema(description = "One of {Research Community, Research infrastructure}") private String type; // context type: research initiative or research community + + @JsonSchema(description = "Description of the research community/research infrastructure") private String description; + + @JsonSchema(description = "The URL of the Zenodo community associated to the Research community/Research infrastructure") private String zenodo_community; public String getZenodo_community() { @@ -57,12 +70,12 @@ public class ResearchInitiative implements Serializable { this.name = label; } - public String getOriginalId() { - return originalId; + public String getAcronym() { + return acronym; } - public void setOriginalId(String originalId) { - this.originalId = originalId; + public void setAcronym(String acronym) { + this.acronym = acronym; } public String getDescription() { diff --git a/src/main/java/eu/dnetlib/dhp/schema/oaf/AccessRight.java b/src/main/java/eu/dnetlib/dhp/schema/oaf/AccessRight.java index 14fe748..c680555 100644 --- a/src/main/java/eu/dnetlib/dhp/schema/oaf/AccessRight.java +++ b/src/main/java/eu/dnetlib/dhp/schema/oaf/AccessRight.java @@ -18,6 +18,7 @@ public class AccessRight extends Qualifier { this.openAccessRoute = openAccessRoute; } + @Override public String toComparableString() { String s = super.toComparableString(); return Optional diff --git a/src/main/java/eu/dnetlib/dhp/schema/oaf/Datasource.java b/src/main/java/eu/dnetlib/dhp/schema/oaf/Datasource.java index 7217982..0e7606d 100644 --- a/src/main/java/eu/dnetlib/dhp/schema/oaf/Datasource.java +++ b/src/main/java/eu/dnetlib/dhp/schema/oaf/Datasource.java @@ -6,8 +6,15 @@ import java.util.List; public class Datasource extends OafEntity implements Serializable { + /** + * + */ + private static final long serialVersionUID = 1019089598408414496L; + private Qualifier datasourcetype; + private Qualifier datasourcetypeui; + private Qualifier openairecompatibility; private Field officialname; @@ -83,19 +90,45 @@ public class Datasource extends OafEntity implements Serializable { private Journal journal; + // New field for EOSC + private List providedentitytypes; + + // New field for EOSC + private List providedproducttypes; + + // New field for EOSC + private Qualifier jurisdiction; + + // New field for EOSC + private Boolean thematic; + + // New field for EOSC + private Boolean knowledgegraph; + + // New field for EOSC + private List contentpolicies; + public Qualifier getDatasourcetype() { return datasourcetype; } - public void setDatasourcetype(Qualifier datasourcetype) { + public void setDatasourcetype(final Qualifier datasourcetype) { this.datasourcetype = datasourcetype; } + public Qualifier getDatasourcetypeui() { + return datasourcetypeui; + } + + public void setDatasourcetypeui(final Qualifier datasourcetypeui) { + this.datasourcetypeui = datasourcetypeui; + } + public Qualifier getOpenairecompatibility() { return openairecompatibility; } - public void setOpenairecompatibility(Qualifier openairecompatibility) { + public void setOpenairecompatibility(final Qualifier openairecompatibility) { this.openairecompatibility = openairecompatibility; } @@ -103,7 +136,7 @@ public class Datasource extends OafEntity implements Serializable { return officialname; } - public void setOfficialname(Field officialname) { + public void setOfficialname(final Field officialname) { this.officialname = officialname; } @@ -111,7 +144,7 @@ public class Datasource extends OafEntity implements Serializable { return englishname; } - public void setEnglishname(Field englishname) { + public void setEnglishname(final Field englishname) { this.englishname = englishname; } @@ -119,7 +152,7 @@ public class Datasource extends OafEntity implements Serializable { return websiteurl; } - public void setWebsiteurl(Field websiteurl) { + public void setWebsiteurl(final Field websiteurl) { this.websiteurl = websiteurl; } @@ -127,7 +160,7 @@ public class Datasource extends OafEntity implements Serializable { return logourl; } - public void setLogourl(Field logourl) { + public void setLogourl(final Field logourl) { this.logourl = logourl; } @@ -135,7 +168,7 @@ public class Datasource extends OafEntity implements Serializable { return contactemail; } - public void setContactemail(Field contactemail) { + public void setContactemail(final Field contactemail) { this.contactemail = contactemail; } @@ -143,7 +176,7 @@ public class Datasource extends OafEntity implements Serializable { return namespaceprefix; } - public void setNamespaceprefix(Field namespaceprefix) { + public void setNamespaceprefix(final Field namespaceprefix) { this.namespaceprefix = namespaceprefix; } @@ -151,7 +184,7 @@ public class Datasource extends OafEntity implements Serializable { return latitude; } - public void setLatitude(Field latitude) { + public void setLatitude(final Field latitude) { this.latitude = latitude; } @@ -159,7 +192,7 @@ public class Datasource extends OafEntity implements Serializable { return longitude; } - public void setLongitude(Field longitude) { + public void setLongitude(final Field longitude) { this.longitude = longitude; } @@ -167,7 +200,7 @@ public class Datasource extends OafEntity implements Serializable { return dateofvalidation; } - public void setDateofvalidation(Field dateofvalidation) { + public void setDateofvalidation(final Field dateofvalidation) { this.dateofvalidation = dateofvalidation; } @@ -175,7 +208,7 @@ public class Datasource extends OafEntity implements Serializable { return description; } - public void setDescription(Field description) { + public void setDescription(final Field description) { this.description = description; } @@ -183,7 +216,7 @@ public class Datasource extends OafEntity implements Serializable { return subjects; } - public void setSubjects(List subjects) { + public void setSubjects(final List subjects) { this.subjects = subjects; } @@ -191,7 +224,7 @@ public class Datasource extends OafEntity implements Serializable { return odnumberofitems; } - public void setOdnumberofitems(Field odnumberofitems) { + public void setOdnumberofitems(final Field odnumberofitems) { this.odnumberofitems = odnumberofitems; } @@ -199,7 +232,7 @@ public class Datasource extends OafEntity implements Serializable { return odnumberofitemsdate; } - public void setOdnumberofitemsdate(Field odnumberofitemsdate) { + public void setOdnumberofitemsdate(final Field odnumberofitemsdate) { this.odnumberofitemsdate = odnumberofitemsdate; } @@ -207,7 +240,7 @@ public class Datasource extends OafEntity implements Serializable { return odpolicies; } - public void setOdpolicies(Field odpolicies) { + public void setOdpolicies(final Field odpolicies) { this.odpolicies = odpolicies; } @@ -215,7 +248,7 @@ public class Datasource extends OafEntity implements Serializable { return odlanguages; } - public void setOdlanguages(List> odlanguages) { + public void setOdlanguages(final List> odlanguages) { this.odlanguages = odlanguages; } @@ -223,7 +256,7 @@ public class Datasource extends OafEntity implements Serializable { return odcontenttypes; } - public void setOdcontenttypes(List> odcontenttypes) { + public void setOdcontenttypes(final List> odcontenttypes) { this.odcontenttypes = odcontenttypes; } @@ -231,7 +264,7 @@ public class Datasource extends OafEntity implements Serializable { return accessinfopackage; } - public void setAccessinfopackage(List> accessinfopackage) { + public void setAccessinfopackage(final List> accessinfopackage) { this.accessinfopackage = accessinfopackage; } @@ -239,7 +272,7 @@ public class Datasource extends OafEntity implements Serializable { return releasestartdate; } - public void setReleasestartdate(Field releasestartdate) { + public void setReleasestartdate(final Field releasestartdate) { this.releasestartdate = releasestartdate; } @@ -247,7 +280,7 @@ public class Datasource extends OafEntity implements Serializable { return releaseenddate; } - public void setReleaseenddate(Field releaseenddate) { + public void setReleaseenddate(final Field releaseenddate) { this.releaseenddate = releaseenddate; } @@ -255,7 +288,7 @@ public class Datasource extends OafEntity implements Serializable { return missionstatementurl; } - public void setMissionstatementurl(Field missionstatementurl) { + public void setMissionstatementurl(final Field missionstatementurl) { this.missionstatementurl = missionstatementurl; } @@ -263,7 +296,7 @@ public class Datasource extends OafEntity implements Serializable { return dataprovider; } - public void setDataprovider(Field dataprovider) { + public void setDataprovider(final Field dataprovider) { this.dataprovider = dataprovider; } @@ -271,7 +304,7 @@ public class Datasource extends OafEntity implements Serializable { return serviceprovider; } - public void setServiceprovider(Field serviceprovider) { + public void setServiceprovider(final Field serviceprovider) { this.serviceprovider = serviceprovider; } @@ -279,7 +312,7 @@ public class Datasource extends OafEntity implements Serializable { return databaseaccesstype; } - public void setDatabaseaccesstype(Field databaseaccesstype) { + public void setDatabaseaccesstype(final Field databaseaccesstype) { this.databaseaccesstype = databaseaccesstype; } @@ -287,7 +320,7 @@ public class Datasource extends OafEntity implements Serializable { return datauploadtype; } - public void setDatauploadtype(Field datauploadtype) { + public void setDatauploadtype(final Field datauploadtype) { this.datauploadtype = datauploadtype; } @@ -295,7 +328,7 @@ public class Datasource extends OafEntity implements Serializable { return databaseaccessrestriction; } - public void setDatabaseaccessrestriction(Field databaseaccessrestriction) { + public void setDatabaseaccessrestriction(final Field databaseaccessrestriction) { this.databaseaccessrestriction = databaseaccessrestriction; } @@ -303,7 +336,7 @@ public class Datasource extends OafEntity implements Serializable { return datauploadrestriction; } - public void setDatauploadrestriction(Field datauploadrestriction) { + public void setDatauploadrestriction(final Field datauploadrestriction) { this.datauploadrestriction = datauploadrestriction; } @@ -311,7 +344,7 @@ public class Datasource extends OafEntity implements Serializable { return versioning; } - public void setVersioning(Field versioning) { + public void setVersioning(final Field versioning) { this.versioning = versioning; } @@ -319,7 +352,7 @@ public class Datasource extends OafEntity implements Serializable { return citationguidelineurl; } - public void setCitationguidelineurl(Field citationguidelineurl) { + public void setCitationguidelineurl(final Field citationguidelineurl) { this.citationguidelineurl = citationguidelineurl; } @@ -327,7 +360,7 @@ public class Datasource extends OafEntity implements Serializable { return qualitymanagementkind; } - public void setQualitymanagementkind(Field qualitymanagementkind) { + public void setQualitymanagementkind(final Field qualitymanagementkind) { this.qualitymanagementkind = qualitymanagementkind; } @@ -335,7 +368,7 @@ public class Datasource extends OafEntity implements Serializable { return pidsystems; } - public void setPidsystems(Field pidsystems) { + public void setPidsystems(final Field pidsystems) { this.pidsystems = pidsystems; } @@ -343,7 +376,7 @@ public class Datasource extends OafEntity implements Serializable { return certificates; } - public void setCertificates(Field certificates) { + public void setCertificates(final Field certificates) { this.certificates = certificates; } @@ -351,7 +384,7 @@ public class Datasource extends OafEntity implements Serializable { return policies; } - public void setPolicies(List policies) { + public void setPolicies(final List policies) { this.policies = policies; } @@ -359,23 +392,72 @@ public class Datasource extends OafEntity implements Serializable { return journal; } - public void setJournal(Journal journal) { + public void setJournal(final Journal journal) { this.journal = journal; } + public List getProvidedentitytypes() { + return providedentitytypes; + } + + public void setProvidedentitytypes(final List providedentitytypes) { + this.providedentitytypes = providedentitytypes; + } + + public List getProvidedproducttypes() { + return providedproducttypes; + } + + public void setProvidedproducttypes(final List providedproducttypes) { + this.providedproducttypes = providedproducttypes; + } + + public Qualifier getJurisdiction() { + return jurisdiction; + } + + public void setJurisdiction(final Qualifier jurisdiction) { + this.jurisdiction = jurisdiction; + } + + public Boolean getThematic() { + return thematic; + } + + public void setThematic(final Boolean thematic) { + this.thematic = thematic; + } + + public Boolean getKnowledgegraph() { + return knowledgegraph; + } + + public void setKnowledgegraph(final Boolean knowledgegraph) { + this.knowledgegraph = knowledgegraph; + } + + public List getContentpolicies() { + return contentpolicies; + } + + public void setContentpolicies(final List contentpolicies) { + this.contentpolicies = contentpolicies; + } + @Override - public void mergeFrom(OafEntity e) { + public void mergeFrom(final OafEntity e) { super.mergeFrom(e); - if (!Datasource.class.isAssignableFrom(e.getClass())) { - return; - } + if (!Datasource.class.isAssignableFrom(e.getClass())) { return; } - Datasource d = (Datasource) e; + final Datasource d = (Datasource) e; datasourcetype = d.getDatasourcetype() != null && compareTrust(this, e) < 0 ? d.getDatasourcetype() : datasourcetype; + datasourcetypeui = d.getDatasourcetypeui() != null && compareTrust(this, e) < 0 + ? d.getDatasourcetypeui() + : datasourcetypeui; openairecompatibility = d.getOpenairecompatibility() != null && compareTrust(this, e) < 0 ? d.getOpenairecompatibility() : openairecompatibility; @@ -467,6 +549,25 @@ public class Datasource extends OafEntity implements Serializable { journal = d.getJournal() != null && compareTrust(this, e) < 0 ? d.getJournal() : journal; + providedentitytypes = mergeLists(providedentitytypes, d.getProvidedentitytypes());; + + providedproducttypes = mergeLists(providedproducttypes, d.getProvidedproducttypes());; + + jurisdiction = d.getJurisdiction() != null && compareTrust(this, e) < 0 + ? d.getJurisdiction() + : jurisdiction; + + thematic = d.getThematic() != null && compareTrust(this, e) < 0 + ? d.getThematic() + : thematic; + + knowledgegraph = d.getKnowledgegraph() != null && compareTrust(this, e) < 0 + ? d.getKnowledgegraph() + : knowledgegraph; + + contentpolicies = mergeLists(contentpolicies, d.getContentpolicies());; + mergeOAFDataInfo(e); } + } diff --git a/src/main/java/eu/dnetlib/dhp/schema/oaf/Instance.java b/src/main/java/eu/dnetlib/dhp/schema/oaf/Instance.java index c4cde0c..6bb2908 100644 --- a/src/main/java/eu/dnetlib/dhp/schema/oaf/Instance.java +++ b/src/main/java/eu/dnetlib/dhp/schema/oaf/Instance.java @@ -37,6 +37,8 @@ public class Instance implements Serializable { private Qualifier refereed; // peer-review status + private List measures; + public Field getLicense() { return license; } @@ -141,6 +143,14 @@ public class Instance implements Serializable { this.refereed = refereed; } + public List getMeasures() { + return measures; + } + + public void setMeasures(List measures) { + this.measures = measures; + } + public String toComparableString() { return String .format( diff --git a/src/main/java/eu/dnetlib/dhp/schema/oaf/Measure.java b/src/main/java/eu/dnetlib/dhp/schema/oaf/Measure.java index c0c14d1..78a4c68 100644 --- a/src/main/java/eu/dnetlib/dhp/schema/oaf/Measure.java +++ b/src/main/java/eu/dnetlib/dhp/schema/oaf/Measure.java @@ -1,6 +1,7 @@ package eu.dnetlib.dhp.schema.oaf; +import java.io.Serializable; import java.util.List; import com.google.common.base.Objects; @@ -8,7 +9,7 @@ import com.google.common.base.Objects; /** * Represent a measure, must be further described by a system available resource providing name and descriptions. */ -public class Measure { +public class Measure implements Serializable { /** * Unique measure identifier. @@ -16,7 +17,7 @@ public class Measure { private String id; /** - * List of units associated with this measure. KeyValue provides a pair to store the laber (key) and the value, plus + * List of units associated with this measure. KeyValue provides a pair to store the label (key) and the value, plus * common provenance information. */ private List unit; diff --git a/src/main/java/eu/dnetlib/dhp/schema/oaf/OafEntity.java b/src/main/java/eu/dnetlib/dhp/schema/oaf/OafEntity.java index 17c3e6b..0411821 100644 --- a/src/main/java/eu/dnetlib/dhp/schema/oaf/OafEntity.java +++ b/src/main/java/eu/dnetlib/dhp/schema/oaf/OafEntity.java @@ -96,7 +96,8 @@ public abstract class OafEntity extends Oaf implements Serializable { oaiprovenance = e.getOaiprovenance(); } - protected List mergeLists(final List... lists) { + @SafeVarargs + protected final List mergeLists(final List... lists) { return Arrays .stream(lists) diff --git a/src/main/java/eu/dnetlib/dhp/schema/oaf/Project.java b/src/main/java/eu/dnetlib/dhp/schema/oaf/Project.java index 8d77cf9..0798212 100644 --- a/src/main/java/eu/dnetlib/dhp/schema/oaf/Project.java +++ b/src/main/java/eu/dnetlib/dhp/schema/oaf/Project.java @@ -1,11 +1,11 @@ package eu.dnetlib.dhp.schema.oaf; -import org.apache.commons.lang3.StringUtils; - import java.io.Serializable; import java.util.List; +import org.apache.commons.lang3.StringUtils; + public class Project extends OafEntity implements Serializable { private Field websiteurl; @@ -348,10 +348,6 @@ public class Project extends OafEntity implements Serializable { : contactemail; summary = p.getSummary() != null && compareTrust(this, e) < 0 ? p.getSummary() : summary; currency = p.getCurrency() != null && compareTrust(this, e) < 0 ? p.getCurrency() : currency; -// totalcost = p.getTotalcost() != null && compareTrust(this, e) < 0 ? p.getTotalcost() : totalcost; -// fundedamount = p.getFundedamount() != null && compareTrust(this, e) < 0 -// ? p.getFundedamount() -// : fundedamount; if (p.getH2020topiccode() != null && StringUtils.isEmpty(h2020topiccode)){ h2020topiccode = p.getH2020topiccode(); 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 adfc6af..fc6c5e0 100644 --- a/src/main/java/eu/dnetlib/dhp/schema/oaf/Relation.java +++ b/src/main/java/eu/dnetlib/dhp/schema/oaf/Relation.java @@ -4,9 +4,9 @@ package eu.dnetlib.dhp.schema.oaf; import static com.google.common.base.Preconditions.checkArgument; import java.text.ParseException; -import java.util.*; -import java.util.stream.Collectors; -import java.util.stream.Stream; +import java.util.ArrayList; +import java.util.List; +import java.util.Objects; import eu.dnetlib.dhp.schema.common.ModelSupport; diff --git a/src/main/java/eu/dnetlib/dhp/schema/oaf/Result.java b/src/main/java/eu/dnetlib/dhp/schema/oaf/Result.java index 701f9ef..9d1f52c 100644 --- a/src/main/java/eu/dnetlib/dhp/schema/oaf/Result.java +++ b/src/main/java/eu/dnetlib/dhp/schema/oaf/Result.java @@ -2,237 +2,707 @@ package eu.dnetlib.dhp.schema.oaf; import java.io.Serializable; -import java.util.Comparator; -import java.util.List; -import java.util.Objects; +import java.util.*; import java.util.stream.Collectors; -import eu.dnetlib.dhp.schema.common.AccessRightComparator; +import org.apache.commons.lang3.tuple.ImmutablePair; +import org.apache.commons.lang3.tuple.Pair; +import eu.dnetlib.dhp.schema.common.AccessRightComparator; +import eu.dnetlib.dhp.schema.common.ModelConstants; +import eu.dnetlib.dhp.schema.oaf.utils.CleaningFunctions; + +/** + * The type Result. + */ public class Result extends OafEntity implements Serializable { + /** + * The Measures. + */ private List measures; + /** + * The Author. + */ private List author; - // resulttype allows subclassing results into publications | datasets | software + /** + * The Resulttype. + */ +// resulttype allows subclassing results into publications | datasets | software private Qualifier resulttype; - // common fields + /** + * The Language. + */ +// common fields private Qualifier language; + /** + * The Country. + */ private List country; + /** + * The Subject. + */ private List subject; + /** + * The Title. + */ private List title; + /** + * The Relevantdate. + */ private List relevantdate; + /** + * The Description. + */ private List> description; + /** + * The Dateofacceptance. + */ private Field dateofacceptance; + /** + * The Publisher. + */ private Field publisher; + /** + * The Embargoenddate. + */ private Field embargoenddate; + /** + * The Source. + */ private List> source; + /** + * The Fulltext. + */ private List> fulltext; // remove candidate + /** + * The Format. + */ private List> format; + /** + * The Contributor. + */ private List> contributor; + /** + * The Resourcetype. + */ private Qualifier resourcetype; + /** + * The Coverage. + */ private List> coverage; + /** + * The Bestaccessright. + */ private Qualifier bestaccessright; + /** + * The Context. + */ private List context; + /** + * The External reference. + */ private List externalReference; + /** + * The Instance. + */ private List instance; + /** + * Gets measures. + * + * @return the measures + */ public List getMeasures() { return measures; } + /** + * Sets measures. + * + * @param measures the measures + */ public void setMeasures(List measures) { this.measures = measures; } + /** + * Gets author. + * + * @return the author + */ public List getAuthor() { return author; } + /** + * Sets author. + * + * @param author the author + */ public void setAuthor(List author) { this.author = author; } + /** + * Gets resulttype. + * + * @return the resulttype + */ public Qualifier getResulttype() { return resulttype; } + /** + * Sets resulttype. + * + * @param resulttype the resulttype + */ public void setResulttype(Qualifier resulttype) { this.resulttype = resulttype; } + /** + * Gets language. + * + * @return the language + */ public Qualifier getLanguage() { return language; } + /** + * Sets language. + * + * @param language the language + */ public void setLanguage(Qualifier language) { this.language = language; } + /** + * Gets country. + * + * @return the country + */ public List getCountry() { return country; } + /** + * Sets country. + * + * @param country the country + */ public void setCountry(List country) { this.country = country; } + /** + * Gets subject. + * + * @return the subject + */ public List getSubject() { return subject; } + /** + * Sets subject. + * + * @param subject the subject + */ public void setSubject(List subject) { this.subject = subject; } + /** + * Gets title. + * + * @return the title + */ public List getTitle() { return title; } + /** + * Sets title. + * + * @param title the title + */ public void setTitle(List title) { this.title = title; } + /** + * Gets relevantdate. + * + * @return the relevantdate + */ public List getRelevantdate() { return relevantdate; } + /** + * Sets relevantdate. + * + * @param relevantdate the relevantdate + */ public void setRelevantdate(List relevantdate) { this.relevantdate = relevantdate; } + /** + * Gets description. + * + * @return the description + */ public List> getDescription() { return description; } + /** + * Sets description. + * + * @param description the description + */ public void setDescription(List> description) { this.description = description; } + /** + * Gets dateofacceptance. + * + * @return the dateofacceptance + */ public Field getDateofacceptance() { return dateofacceptance; } + /** + * Sets dateofacceptance. + * + * @param dateofacceptance the dateofacceptance + */ public void setDateofacceptance(Field dateofacceptance) { this.dateofacceptance = dateofacceptance; } + /** + * Gets publisher. + * + * @return the publisher + */ public Field getPublisher() { return publisher; } + /** + * Sets publisher. + * + * @param publisher the publisher + */ public void setPublisher(Field publisher) { this.publisher = publisher; } + /** + * Gets embargoenddate. + * + * @return the embargoenddate + */ public Field getEmbargoenddate() { return embargoenddate; } + /** + * Sets embargoenddate. + * + * @param embargoenddate the embargoenddate + */ public void setEmbargoenddate(Field embargoenddate) { this.embargoenddate = embargoenddate; } + /** + * Gets source. + * + * @return the source + */ public List> getSource() { return source; } + /** + * Sets source. + * + * @param source the source + */ public void setSource(List> source) { this.source = source; } + /** + * Gets fulltext. + * + * @return the fulltext + */ public List> getFulltext() { return fulltext; } + /** + * Sets fulltext. + * + * @param fulltext the fulltext + */ public void setFulltext(List> fulltext) { this.fulltext = fulltext; } + /** + * Gets format. + * + * @return the format + */ public List> getFormat() { return format; } + /** + * Sets format. + * + * @param format the format + */ public void setFormat(List> format) { this.format = format; } + /** + * Gets contributor. + * + * @return the contributor + */ public List> getContributor() { return contributor; } + /** + * Sets contributor. + * + * @param contributor the contributor + */ public void setContributor(List> contributor) { this.contributor = contributor; } + /** + * Gets resourcetype. + * + * @return the resourcetype + */ public Qualifier getResourcetype() { return resourcetype; } + /** + * Sets resourcetype. + * + * @param resourcetype the resourcetype + */ public void setResourcetype(Qualifier resourcetype) { this.resourcetype = resourcetype; } + /** + * Gets coverage. + * + * @return the coverage + */ public List> getCoverage() { return coverage; } + /** + * Sets coverage. + * + * @param coverage the coverage + */ public void setCoverage(List> coverage) { this.coverage = coverage; } + /** + * Gets bestaccessright. + * + * @return the bestaccessright + */ public Qualifier getBestaccessright() { return bestaccessright; } + /** + * Sets bestaccessright. + * + * @param bestaccessright the bestaccessright + */ public void setBestaccessright(Qualifier bestaccessright) { this.bestaccessright = bestaccessright; } + /** + * Gets context. + * + * @return the context + */ public List getContext() { return context; } + /** + * Sets context. + * + * @param context the context + */ public void setContext(List context) { this.context = context; } + /** + * Gets external reference. + * + * @return the external reference + */ public List getExternalReference() { return externalReference; } + /** + * Sets external reference. + * + * @param externalReference the external reference + */ public void setExternalReference(List externalReference) { this.externalReference = externalReference; } + /** + * Gets instance. + * + * @return the instance + */ public List getInstance() { return instance; } + /** + * Sets instance. + * + * @param instance the instance + */ public void setInstance(List instance) { this.instance = instance; } + + /** + * Is an enrichment boolean. + * + * @param e the e + * @return the boolean + */ + public static boolean isAnEnrichment(OafEntity e) { + return e.getDataInfo()!= null && + e.getDataInfo().getProvenanceaction()!= null + && ModelConstants.PROVENANCE_ENRICH.equalsIgnoreCase(e.getDataInfo().getProvenanceaction().getClassid()); + } + + + /** + * Normalize pid string. + * + * @param pid the pid + * @return the string + */ + private static String extractKeyFromPid(final StructuredProperty pid) { + if (pid == null) + return null; + final StructuredProperty normalizedPid = CleaningFunctions.normalizePidValue(pid); + + return String.format("%s::%s", normalizedPid.getQualifier().getClassid(), normalizedPid.getValue()); + } + + /** + * Valid pid boolean. + * + * @param p the p + * @return the boolean + */ + private static boolean validPid(final StructuredProperty p) { + return p.getValue()!= null && p.getQualifier()!= null && p.getQualifier().getClassid()!=null; + } + + + /** + * This method converts the list of instance enrichments + * into a Map where the key is the normalized identifier + * and the value is the instance itself + * + * @param ri the list of enrichment instances + * @return the result map + */ + public static Map toInstanceMap(final List ri) { + + + return ri + .stream() + .filter(i -> i.getPid() != null || i.getAlternateIdentifier() != null) + .flatMap(i -> { + final List> result = new ArrayList<>(); + if (i.getPid() != null) + i.getPid().stream().filter(Result::validPid).forEach(p -> result.add(new ImmutablePair<>(extractKeyFromPid(p), i))); + if (i.getAlternateIdentifier() != null) + i.getAlternateIdentifier().stream().filter(Result::validPid).forEach(p -> result.add(new ImmutablePair<>(extractKeyFromPid(p), i))); + return result.stream(); + }).collect(Collectors.toMap( + Pair::getLeft, + Pair::getRight, + (a, b) -> a + )); + } + + /** + * This utility method finds the list of enrichment instances + * that match one or more PIDs in the input list + * + * @param pids the list of PIDs + * @param enrichments the List of enrichment instances having the same pid + * @return the list + */ + private static List findEnrichmentsByPID(final List pids, final Map enrichments) { + if (pids == null || enrichments == null) + return null; + return pids + .stream() + .map(Result::extractKeyFromPid) + .map(enrichments::get) + .filter(Objects::nonNull) + .collect(Collectors.toList()); + } + + /** + * This method apply enrichment on a single instance + * The enrichment consists of replacing values on + * single attribute only if in the current instance is missing + * The only repeatable field enriched is measures + * + * @param currentInstance the current instance + * @param enrichment the enrichment instance + */ + private static void applyEnrichment(final Instance currentInstance, final Instance enrichment) { + if (currentInstance == null || enrichment == null) + return; + + //ENRICH accessright + if (enrichment.getAccessright()!=null && currentInstance.getAccessright() == null) + currentInstance.setAccessright(enrichment.getAccessright()); + + //ENRICH license + if (enrichment.getLicense()!=null && currentInstance.getLicense() == null) + currentInstance.setLicense(enrichment.getLicense()); + + //ENRICH instanceType + if (enrichment.getInstancetype()!=null && currentInstance.getInstancetype() == null) + currentInstance.setInstancetype(enrichment.getInstancetype()); + + //ENRICH hostedby + if (enrichment.getHostedby()!=null && currentInstance.getHostedby() == null) + currentInstance.setHostedby(enrichment.getHostedby()); + + //ENRICH distributionlocation + if (enrichment.getDistributionlocation()!=null && currentInstance.getDistributionlocation() == null) + currentInstance.setDistributionlocation(enrichment.getDistributionlocation()); + + //ENRICH collectedfrom + if (enrichment.getCollectedfrom()!=null && currentInstance.getCollectedfrom() == null) + currentInstance.setCollectedfrom(enrichment.getCollectedfrom()); + + //ENRICH dateofacceptance + if (enrichment.getDateofacceptance()!=null && currentInstance.getDateofacceptance() == null) + currentInstance.setDateofacceptance(enrichment.getDateofacceptance()); + + //ENRICH processingchargeamount + if (enrichment.getProcessingchargeamount()!=null && currentInstance.getProcessingchargeamount() == null) + currentInstance.setProcessingchargeamount(enrichment.getProcessingchargeamount()); + + //ENRICH refereed + if (enrichment.getRefereed()!=null && currentInstance.getRefereed() == null) + currentInstance.setRefereed(enrichment.getRefereed()); + + //ENRICH measures + if (enrichment.getMeasures()!=null) + if (currentInstance.getMeasures() == null) + currentInstance.setMeasures(enrichment.getMeasures()); + else + enrichment.getMeasures().forEach(currentInstance.getMeasures()::add); + + } + + + /** + * This main method apply the enrichment of the instances + * + * @param toEnrichInstances the instances that could be enriched + * @param enrichmentInstances the enrichment instances + * @return list of instances possibly enriched + */ + private static List enrichInstances(final List toEnrichInstances,final List enrichmentInstances) { + final List enrichmentResult = new ArrayList<>(); + + if (toEnrichInstances == null) { + return enrichmentResult; + } + if (enrichmentInstances == null) { + return enrichmentResult; + } + Map ri = toInstanceMap(enrichmentInstances); + + toEnrichInstances.forEach(i -> { + final List e = findEnrichmentsByPID(i.getPid(), ri); + if (e!= null && e.size()> 0) { + e.forEach(enr -> applyEnrichment(i, enr)); + } else { + final List a = findEnrichmentsByPID(i.getAlternateIdentifier(), ri); + if (a!= null && a.size()> 0) { + a.forEach(enr -> applyEnrichment(i, enr)); + } + } + enrichmentResult.add(i); + }); + return enrichmentResult; + } + @Override public void mergeFrom(OafEntity e) { super.mergeFrom(e); @@ -245,7 +715,15 @@ public class Result extends OafEntity implements Serializable { measures = mergeLists(measures, r.getMeasures()); - instance = mergeLists(instance, r.getInstance()); + if( !isAnEnrichment(this) && !isAnEnrichment(e)) + instance = mergeLists(instance, r.getInstance()); + else { + final List enrichmentInstances = isAnEnrichment(this) ? instance : r.getInstance(); + final List enrichedInstances= isAnEnrichment(this) ? r.getInstance(): instance; + if (isAnEnrichment(this)) + setDataInfo(e.getDataInfo()); + instance = enrichInstances(enrichedInstances,enrichmentInstances); + } if (r.getBestaccessright() != null && new AccessRightComparator().compare(r.getBestaccessright(), bestaccessright) < 0) @@ -325,6 +803,13 @@ public class Result extends OafEntity implements Serializable { externalReference = mergeLists(externalReference, r.getExternalReference()); } + /** + * Longest lists list. + * + * @param a the a + * @param b the b + * @return the list + */ private List> longestLists(List> a, List> b) { if (a == null || b == null) return a == null ? b : a; @@ -346,13 +831,19 @@ public class Result extends OafEntity implements Serializable { return a.size() > b.size() ? a : b; } + /** + * Gets main title. + * + * @param titles the titles + * @return the main title + */ private StructuredProperty getMainTitle(List titles) { // need to check if the list of titles contains more than 1 main title? (in that case, we should chose which // main title select in the list) - for (StructuredProperty title : titles) { - if (title.getQualifier() != null && title.getQualifier().getClassid() != null) - if (title.getQualifier().getClassid().equals("main title")) - return title; + for (StructuredProperty t : titles) { + if (t.getQualifier() != null && t.getQualifier().getClassid() != null) + if (t.getQualifier().getClassid().equals("main title")) + return t; } return null; } diff --git a/src/main/java/eu/dnetlib/dhp/schema/oaf/StructuredProperty.java b/src/main/java/eu/dnetlib/dhp/schema/oaf/StructuredProperty.java index 024b915..8750950 100644 --- a/src/main/java/eu/dnetlib/dhp/schema/oaf/StructuredProperty.java +++ b/src/main/java/eu/dnetlib/dhp/schema/oaf/StructuredProperty.java @@ -8,8 +8,6 @@ import java.util.stream.Stream; import org.apache.commons.lang3.StringUtils; -import com.google.common.base.Joiner; - public class StructuredProperty implements Serializable { private String value; diff --git a/src/main/java/eu/dnetlib/dhp/schema/oaf/utils/CleaningFunctions.java b/src/main/java/eu/dnetlib/dhp/schema/oaf/utils/CleaningFunctions.java index 183214c..1d12478 100644 --- a/src/main/java/eu/dnetlib/dhp/schema/oaf/utils/CleaningFunctions.java +++ b/src/main/java/eu/dnetlib/dhp/schema/oaf/utils/CleaningFunctions.java @@ -12,7 +12,7 @@ import eu.dnetlib.dhp.schema.oaf.StructuredProperty; public class CleaningFunctions { - public static final String DOI_PREFIX_REGEX = "(^10\\.|\\/10.)"; + public static final String DOI_PREFIX_REGEX = "(^10\\.|\\/10\\.)"; public static final String DOI_PREFIX = "10."; public static final Set PID_BLACKLIST = new HashSet<>(); @@ -22,6 +22,8 @@ public class CleaningFunctions { PID_BLACKLIST.add("na"); } + public CleaningFunctions() {} + /** * Utility method that filter PID values on a per-type basis. * @param s the PID whose value will be checked. diff --git a/src/main/java/eu/dnetlib/dhp/schema/oaf/utils/IdentifierFactory.java b/src/main/java/eu/dnetlib/dhp/schema/oaf/utils/IdentifierFactory.java index 5939db4..500ff24 100644 --- a/src/main/java/eu/dnetlib/dhp/schema/oaf/utils/IdentifierFactory.java +++ b/src/main/java/eu/dnetlib/dhp/schema/oaf/utils/IdentifierFactory.java @@ -127,7 +127,7 @@ public class IdentifierFactory implements Serializable { return pids .values() .stream() - .flatMap(s -> s.stream()) + .flatMap(Set::stream) .min(new PidComparator<>(entity)) .map( min -> Optional @@ -147,8 +147,7 @@ public class IdentifierFactory implements Serializable { if (entity instanceof Result) { return Optional .ofNullable(((Result) entity).getInstance()) - .map( - instance -> mapPids(instance)) + .map(IdentifierFactory::mapPids) .orElse(new HashMap<>()); } else { return entity @@ -254,7 +253,6 @@ public class IdentifierFactory implements Serializable { 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; } } diff --git a/src/main/java/eu/dnetlib/dhp/schema/oaf/utils/ModelHardLimits.java b/src/main/java/eu/dnetlib/dhp/schema/oaf/utils/ModelHardLimits.java index b8f81ea..ea40509 100644 --- a/src/main/java/eu/dnetlib/dhp/schema/oaf/utils/ModelHardLimits.java +++ b/src/main/java/eu/dnetlib/dhp/schema/oaf/utils/ModelHardLimits.java @@ -3,6 +3,8 @@ package eu.dnetlib.dhp.schema.oaf.utils; public class ModelHardLimits { + private ModelHardLimits() {} + public static final String LAYOUT = "index"; public static final String INTERPRETATION = "openaire"; public static final String SEPARATOR = "-"; diff --git a/src/main/java/eu/dnetlib/dhp/schema/oaf/utils/PidBlacklistProvider.java b/src/main/java/eu/dnetlib/dhp/schema/oaf/utils/PidBlacklistProvider.java index 1c1c21f..3bcd0ab 100644 --- a/src/main/java/eu/dnetlib/dhp/schema/oaf/utils/PidBlacklistProvider.java +++ b/src/main/java/eu/dnetlib/dhp/schema/oaf/utils/PidBlacklistProvider.java @@ -34,4 +34,6 @@ public class PidBlacklistProvider { .orElse(new HashSet<>()); } + private PidBlacklistProvider() {} + } diff --git a/src/main/java/eu/dnetlib/dhp/schema/oaf/utils/ResultTypeComparator.java b/src/main/java/eu/dnetlib/dhp/schema/oaf/utils/ResultTypeComparator.java index 80a7ce0..04d855d 100644 --- a/src/main/java/eu/dnetlib/dhp/schema/oaf/utils/ResultTypeComparator.java +++ b/src/main/java/eu/dnetlib/dhp/schema/oaf/utils/ResultTypeComparator.java @@ -9,6 +9,7 @@ import java.util.Optional; import java.util.stream.Collectors; import eu.dnetlib.dhp.schema.common.ModelConstants; +import eu.dnetlib.dhp.schema.oaf.KeyValue; import eu.dnetlib.dhp.schema.oaf.Result; public class ResultTypeComparator implements Comparator { @@ -69,7 +70,7 @@ public class ResultTypeComparator implements Comparator { .map( cf -> cf .stream() - .map(c -> c.getKey()) + .map(KeyValue::getKey) .collect(Collectors.toCollection(HashSet::new))) .orElse(new HashSet<>()); } diff --git a/src/main/java/eu/dnetlib/dhp/schema/orcid/Contributor.java b/src/main/java/eu/dnetlib/dhp/schema/orcid/Contributor.java index 3b543db..23161d7 100644 --- a/src/main/java/eu/dnetlib/dhp/schema/orcid/Contributor.java +++ b/src/main/java/eu/dnetlib/dhp/schema/orcid/Contributor.java @@ -3,12 +3,9 @@ package eu.dnetlib.dhp.schema.orcid; import java.io.Serializable; -import eu.dnetlib.dhp.schema.orcid.AuthorData; - /** * This class models the data related to a contributor, that are retrieved from an orcid publication */ - public class Contributor extends AuthorData implements Serializable { private String sequence; private String role; diff --git a/src/main/java/eu/dnetlib/dhp/schema/orcid/WorkDetail.java b/src/main/java/eu/dnetlib/dhp/schema/orcid/WorkDetail.java index 614d415..f0e2ceb 100644 --- a/src/main/java/eu/dnetlib/dhp/schema/orcid/WorkDetail.java +++ b/src/main/java/eu/dnetlib/dhp/schema/orcid/WorkDetail.java @@ -4,11 +4,6 @@ package eu.dnetlib.dhp.schema.orcid; import java.io.Serializable; import java.util.List; -import eu.dnetlib.dhp.schema.orcid.Contributor; -import eu.dnetlib.dhp.schema.orcid.ExternalId; -import eu.dnetlib.dhp.schema.orcid.OrcidData; -import eu.dnetlib.dhp.schema.orcid.PublicationDate; - /** * This class models the data that are retrieved from orcid publication */ diff --git a/src/main/resources/eu/dnetlib/dhp/schema/oaf/dump/jsonschemas/community_infrastructure_schema.json b/src/main/resources/eu/dnetlib/dhp/schema/oaf/dump/jsonschemas/community_infrastructure_schema.json new file mode 100644 index 0000000..727432a --- /dev/null +++ b/src/main/resources/eu/dnetlib/dhp/schema/oaf/dump/jsonschemas/community_infrastructure_schema.json @@ -0,0 +1,35 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "type": "object", + "properties": { + "acronym": { + "type": "string", + "description": "The acronym of the community" + }, + "description": { + "type": "string", + "description": "Description of the research community/research infrastructure" + }, + "id": { + "type": "string", + "description": "OpenAIRE id of the research community/research infrastructure" + }, + "name": { + "type": "string", + "description": "The long name of the community" + }, + "subject": { + "description": "Only for research communities: the list of the subjects associated to the research community", + "type": "array", + "items": {"type": "string"} + }, + "type": { + "type": "string", + "description": "One of {Research Community, Research infrastructure}" + }, + "zenodo_community": { + "type": "string", + "description": "The URL of the Zenodo community associated to the Research community/Research infrastructure" + } + } +} \ No newline at end of file diff --git a/src/main/resources/eu/dnetlib/dhp/schema/oaf/dump/jsonschemas/datasource_schema.json b/src/main/resources/eu/dnetlib/dhp/schema/oaf/dump/jsonschemas/datasource_schema.json new file mode 100644 index 0000000..c416f23 --- /dev/null +++ b/src/main/resources/eu/dnetlib/dhp/schema/oaf/dump/jsonschemas/datasource_schema.json @@ -0,0 +1,192 @@ +{ + "$schema":"http://json-schema.org/draft-07/schema#", + "definitions": { + "ControlledField": { + "type": "object", + "properties": { + "scheme": { + "type": "string" + }, + "value": { + "type": "string" + } + }, + "description": "To represent the information described by a scheme and a value in that scheme (i.e. pid)" + } + }, + "type":"object", + "properties": { + "accessrights": { + "type": "string", + "description": "Type of access to the data source, as defined by re3data.org. Possible values: {open, restricted, closed}" + }, + "certificates": { + "type": "string", + "description": "The certificate, seal or standard the data source complies with. As defined by re3data.org." + }, + "citationguidelineurl": { + "type": "string", + "description":"The URL of the data source providing information on how to cite its items. As defined by re3data.org." + }, + "contenttypes": { + "description": "Types of content in the data source, as defined by OpenDOAR", + "type": "array", + "items": { + "type": "string" + } + }, + "databaseaccessrestriction": { + "type": "string", + "description": "Access restrinctions to the data source, as defined by re3data.org. One of {feeRequired, registration, other}" + }, + "datasourcetype": { + "allOf": [ + { + "$ref": "#/definitions/ControlledField" + }, + { + "description": "The type of the datasource. See https://api.openaire.eu/vocabularies/dnet:datasource_typologies" + } + ] + }, + "datauploadrestriction": { + "type": "string", + "description": "Upload restrictions applied by the datasource, as defined by re3data.org. One of {feeRequired, registration, other}" + }, + "dateofvalidation": { + "type": "string", + "description": "The date of last validation against the OpenAIRE guidelines for the datasource records" + }, + "description": { + "type": "string" + }, + "englishname": { + "type": "string", + "description": "The English name of the datasource" + }, + "id": { + "type": "string", + "description": "The OpenAIRE id of the data source" + }, + "journal": { + "type": "object", + "properties": { + "conferencedate": { + "type": "string" + }, + "conferenceplace": { + "type": "string" + }, + "edition": { + "type": "string" + }, + "ep": { + "type": "string", + "description": "End page" + }, + "iss": { + "type": "string", + "description": "Issue number" + }, + "issnLinking": { + "type": "string" + }, + "issnOnline": { + "type": "string" + }, + "issnPrinted": { + "type": "string" + }, + "name": { + "type": "string" + }, + "sp": { + "type": "string", + "description": "Start page" + }, + "vol": { + "type": "string", + "description": "Volume" + } + }, + "description": "Information about the journal, if this data source is of type Journal." + }, + "languages": { + "description": "The languages present in the data source's content, as defined by OpenDOAR.", + "type": "array", + "items": { + "type": "string" + } + }, + "logourl": { + "type": "string" + }, + "missionstatementurl": { + "type": "string", + "description":"The URL of a mission statement describing the designated community of the data source. As defined by re3data.org" + }, + "officialname": { + "type": "string", + "description": "The official name of the datasource" + }, + "openairecompatibility": { + "type": "string", + "description": "OpenAIRE guidelines the data source comply with. See also https://guidelines.openaire.eu." + }, + "originalId": { + "description": "Original identifiers for the datasource" + "type": "array", + "items": { + "type": "string" + } + }, + "pid": { + "description": "Persistent identifiers of the datasource", + "type": "array", + "items": { + "allOf": [ + { + "$ref": "#/definitions/ControlledField" + } + ] + } + }, + "pidsystems": { + "type": "string", + "description": "The persistent identifier system that is used by the data source. As defined by re3data.org" + }, + "policies": { + "description": "Policies of the data source, as defined in OpenDOAR.", + "type": "array", + "items": { + "type": "string" + } + }, + "releaseenddate": { + "type": "string", + "description": "Date when the data source went offline or stopped ingesting new research data. As defined by re3data.org" + }, + "releasestartdate": { + "type": "string", + "description": "Releasing date of the data source, as defined by re3data.org" + }, + "subjects": { + "description": "List of subjects associated to the datasource", + "type": "array", + "items": { + "type": "string" + } + }, + "uploadrights": { + "type": "string", + "description": "Type of data upload. As defined by re3data.org: one of {open, restricted,closed}" + }, + "versioning": { + "type": "boolean", + "description": "As defined by redata.org: 'yes' if the data source supports versioning, 'no' otherwise." + }, + "websiteurl": { + "type": "string" + } + } +} \ No newline at end of file diff --git a/src/main/resources/eu/dnetlib/dhp/schema/oaf/dump/jsonschemas/organization_schema.json b/src/main/resources/eu/dnetlib/dhp/schema/oaf/dump/jsonschemas/organization_schema.json new file mode 100644 index 0000000..16afa38 --- /dev/null +++ b/src/main/resources/eu/dnetlib/dhp/schema/oaf/dump/jsonschemas/organization_schema.json @@ -0,0 +1,57 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "type": "object", + "properties": { + "alternativenames": { + "description": "Alternative names that identify the organisation", + "type": "array", + "items": { + "type": "string" + } + }, + "country": { + "type": "object", + "properties": { + "code": { + "type": "string", + "description": "The organisation country code" + }, + "label": { + "type": "string", + "description": "The organisation country label" + } + }, + "description": "The country of the organisation" + }, + "id": { + "type": "string", + "description": "The OpenAIRE id for the organisation" + }, + "legalname": { + "type": "string" + }, + "legalshortname": { + "type": "string" + }, + "pid": { + "description": "Persistent identifiers for the organisation i.e. isni 0000000090326370", + "type": "array", + "items": { + "type": "object", + "properties": { + "scheme": { + "type": "string", + "description": "The scheme of the identifier (i.e. isni)" + }, + "value": { + "type": "string", + "description": "the value in the schema (i.e. 0000000090326370)" + } + } + } + }, + "websiteurl": { + "type": "string" + } + } +} \ No newline at end of file diff --git a/src/main/resources/eu/dnetlib/dhp/schema/oaf/dump/jsonschemas/project_schema.json b/src/main/resources/eu/dnetlib/dhp/schema/oaf/dump/jsonschemas/project_schema.json new file mode 100644 index 0000000..c811872 --- /dev/null +++ b/src/main/resources/eu/dnetlib/dhp/schema/oaf/dump/jsonschemas/project_schema.json @@ -0,0 +1,119 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "type": "object", + "properties": { + "acronym": { + "type": "string" + }, + "callidentifier": { + "type": "string" + }, + "code": { + "type": "string", + "description": "The grant agreement number" + }, + "enddate": { + "type": "string" + }, + "funding": { + "description": "Funding information for the project", + "type": "array", + "items": { + "type": "object", + "properties": { + "funding_stream": { + "type": "object", + "properties": { + "description": { + "type": "string", + "description": "Description of the funding stream" + }, + "id": { + "type": "string", + "description": "Id of the funding stream" + } + } + }, + "jurisdiction": { + "type": "string", + "description": "The jurisdiction of the funder (i.e. EU)" + }, + "name": { + "type": "string", + "description": "The name of the funder (European Commission)" + }, + "shortName": { + "type": "string", + "description": "The short name of the funder (EC)" + } + } + } + }, + "granted": { + "type": "object", + "properties": { + "currency": { + "type": "string", + "description": "The currency of the granted amount (e.g. EUR)" + }, + "fundedamount": { + "type": "number", + "description": "The funded amount" + }, + "totalcost": { + "type": "number", + "description": "The total cost of the project" + } + }, + "description": "The money granted to the project" + }, + "h2020programme": { + "description": "The h2020 programme funding the project", + "type": "array", + "items": { + "type": "object", + "properties": { + "code": { + "type": "string", + "description": "The code of the programme" + }, + "description": { + "type": "string", + "description": "The description of the programme" + } + } + } + }, + "id": { + "type": "string", + "description": "OpenAIRE id for the project" + }, + "keywords": { + "type": "string" + }, + "openaccessmandatefordataset": { + "type": "boolean" + }, + "openaccessmandateforpublications": { + "type": "boolean" + }, + "startdate": { + "type": "string" + }, + "subject": { + "type": "array", + "items": { + "type": "string" + } + }, + "summary": { + "type": "string" + }, + "title": { + "type": "string" + }, + "websiteurl": { + "type": "string" + } + } +} \ No newline at end of file diff --git a/src/main/resources/eu/dnetlib/dhp/schema/oaf/dump/jsonschemas/relation_schema.json b/src/main/resources/eu/dnetlib/dhp/schema/oaf/dump/jsonschemas/relation_schema.json new file mode 100644 index 0000000..98134a0 --- /dev/null +++ b/src/main/resources/eu/dnetlib/dhp/schema/oaf/dump/jsonschemas/relation_schema.json @@ -0,0 +1,68 @@ +{ + "$schema":"http://json-schema.org/draft-07/schema#", + "definitions": { + "Node": { + "type": "object", + "properties": { + "id": { + "type": "string", + "description": "The OpenAIRE id of the entity" + }, + "type": { + "type": "string", + "description": "The type of the entity (i.e. organisation)" + } + } + } + }, + "type":"object", + "properties": { + "provenance": { + "type": "object", + "properties": { + "provenance": { + "type": "string", + "description": "The reason why OpenAIRE holds the relation " + }, + "trust": { + "type": "string", + "description": "The trust of the relation in the range of [0,1]. Where greater the number, more the trust. Harvested relationships have typically a high trust (0.9). The trust of inferred relationship is calculated by the inference algorithm that generated them, as described in https://graph.openaire.eu/about#architecture (Enrichment --> Mining)" + } + } + }, + "reltype": { + "type": "object", + "properties": { + "name": { + "type": "string", + "description": "The semantics of the relation (i.e. isAuthorInstitutionOf). " + }, + "type": { + "type": "string", + "description": "the type of the relation (i.e. affiliation)" + } + }, + "description": "To represent the semantics of a relation between two entities" + }, + "source": { + "allOf": [ + {"$ref": "#/definitions/Node"}, + {"description": "The node source in the relation"} + ] + }, + "target": { + "allOf": [ + {"$ref": "#/definitions/Node"}, + {"description": "The node target in the relation"} + ] + }, + "validated":{ + "type":"boolean", + "description":"True if the relation is related to a project and it has been collected from an authoritative source (i.e. the funder)" + }, + "validationDate":{ + "type":"string", + "description":"The date when the relation was collected from OpenAIRE" + } + } +} \ No newline at end of file diff --git a/src/main/resources/eu/dnetlib/dhp/schema/oaf/dump/jsonschemas/result_schema.json b/src/main/resources/eu/dnetlib/dhp/schema/oaf/dump/jsonschemas/result_schema.json new file mode 100644 index 0000000..1a2e065 --- /dev/null +++ b/src/main/resources/eu/dnetlib/dhp/schema/oaf/dump/jsonschemas/result_schema.json @@ -0,0 +1,448 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "definitions": { + "ControlledField": { + "type": "object", + "properties": { + "scheme": { + "type": "string" + }, + "value": { + "type": "string" + } + }, + "description": "To represent the information described by a scheme and a value in that scheme (i.e. pid)" + }, + "Provenance": { + "type": "object", + "properties": { + "provenance": { + "type": "string", + "description": "The process that produced/provided the information" + }, + "trust": { + "type": "string" + } + }, + "description": "Indicates the process that produced (or provided) the information, and the trust associated to the information" + } + }, + "type": "object", + "properties": { + "author": { + "type": "array", + "items": { + "type": "object", + "properties": { + "fullname": { + "type": "string" + }, + "name": { + "type": "string" + }, + "pid": { + "type": "object", + "properties": { + "id": { + "allOf": [ + {"$ref": "#/definitions/ControlledField"}, + {"description": "The author's id and scheme. OpenAIRE currently supports 'ORCID'"} + ] + }, + "provenance": { + "allOf": [ + {"$ref": "#/definitions/Provenance"}, + {"description": "Provenance of author's pid"} + ] + } + } + }, + "rank": { + "type": "integer" + }, + "surname": { + "type": "string" + } + } + } + }, + "bestaccessright":{ + "type":"object", + "properties":{ + "code": { + "type": "string", + "description": "COAR access mode code: http://vocabularies.coar-repositories.org/documentation/access_rights/" + }, + "label": { + "type": "string", + "description": "Label for the access mode" + }, + "scheme": { + "type": "string", + "description": "Scheme of reference for access right code. Always set to COAR access rights vocabulary: http://vocabularies.coar-repositories.org/documentation/access_rights/" + } + } + }, + "codeRepositoryUrl": { + "type": "string", + "description": "Only for results with type 'software': the URL to the repository with the source code" + }, + "contactgroup": { + "description": "Only for results with type 'software': Information on the group responsible for providing further information regarding the resource", + "type": "array", + "items": { + "type": "string" + } + }, + "contactperson": { + "description": "Only for results with type 'software': Information on the person responsible for providing further information regarding the resource", + "type": "array", + "items": { + "type": "string" + } + }, + "container": { + "type": "object", + "properties": { + "conferencedate": { + "type": "string" + }, + "conferenceplace": { + "type": "string" + }, + "edition": { + "type": "string", + "description": "Edition of the journal or conference proceeding" + }, + "ep": { + "type": "string", + "description": "End page" + }, + "iss": { + "type": "string", + "description": "Journal issue" + }, + "issnLinking": { + "type": "string" + }, + "issnOnline": { + "type": "string" + }, + "issnPrinted": { + "type": "string" + }, + "name": { + "type": "string", + "description": "Name of the journal or conference" + }, + "sp": { + "type": "string", + "description": "start page" + }, + "vol": { + "type": "string" + } + }, + "description": "Container has information about the conference or journal where the result has been presented or published" + }, + "contributor": { + "type": "array", + "items": { + "type": "string", + "description": "Contributors for the result" + } + }, + "country": { + "type": "array", + "items": { + "type": "object", + "properties": { + "code": { + "type": "string", + "description": "ISO 3166-1 alpha-2 country code" + }, + "label": { + "type": "string" + }, + "provenance": { + "allOf": [ + {"$ref": "#/definitions/Provenance"}, + {"description": "Why this result is associated to the country."} + ] + } + } + } + }, + "coverage": { + "type": "array", + "items": { + "type": "string" + } + }, + "dateofcollection": { + "type": "string", + "description": "When OpenAIRE collected the record the last time" + }, + "description": { + "type": "array", + "items": { + "type": "string" + } + }, + "documentationUrl": { + "description": "Only for results with type 'software': URL to the software documentation", + "type": "array", + "items": { + "type": "string" + } + }, + "embargoenddate": { + "type": "string", + "description": "Date when the embargo ends and this result turns Open Access" + }, + "format": { + "type": "array", + "items": { + "type": "string" + } + }, + "geolocation": { + "description": "Geolocation information", + "type": "array", + "items": { + "type": "object", + "properties": { + "box": { + "type": "string" + }, + "place": { + "type": "string" + }, + "point": { + "type": "string" + } + } + } + }, + "id": { + "type": "string", + "description": "OpenAIRE Identifier" + }, + "instance":{ + "description":"Each instance is one specific materialisation or version of the result. For example, you can have one result with three instance: one is the pre-print, one is the post-print, one is te published version", + "type":"array", + "items":{ + "type":"object", + "properties":{ + "accessright":{ + "type":"object", + "properties":{ + "code": { + "type": "string", + "description": "COAR access mode code: http://vocabularies.coar-repositories.org/documentation/access_rights/" + }, + "label": { + "type": "string", + "description": "Label for the access mode" + }, + "openAccessRoute":{ + "type":"string", + "enum":[ + "gold", + "green", + "hybrid", + "bronze" + ], + "description":"The type of OpenAccess applied to the result" + }, + "scheme": { + "type": "string", + "description": "Scheme of reference for access right code. Always set to COAR access rights vocabulary: http://vocabularies.coar-repositories.org/documentation/access_rights/" + } + } + }, + "alternateIdentifier":{ + "type":"array", + "items":{ + "allOf":[ + { + "$ref":"#/definitions/ControlledField" + }, + { + "description":"All the identifiers other than pids forged by an authorithy for the pid type (i.e. Crossref for DOIs" + } + ] + } + }, + "articleprocessingcharge":{ + "description": "The money spent to make this book or article available in Open Access. Source for this information is the OpenAPC initiative.", + "type":"object", + "properties":{ + "amount":{ + "type":"string" + }, + "currency":{ + "type":"string" + } + } + }, + "license":{ + "type":"string" + }, + "measures":{ + + "type":"array", + "items":{ + "type":"object", + "properties":{ + "key":{ + "type":"string", + "description":"The measure" + }, + "value":{ + "type":"string", + "description":"The value for the measure" + } + }, + "description":"Measures computed for this instance, for example Bip!Finder ones" + } + }, + "pid":{ + "description":"The set of persistent identifiers associated to this instance that have been collected from an authority for the pid type (i.e. Crossref/Datacite for doi)", + "type":"array", + "items":{ + "allOf":[ + { + "$ref":"#/definitions/ControlledField" + }, + { + "description":"The persistent identifier associated to the result" + } + ] + } + }, + "publicationdate":{ + "type":"string", + "description": "Date of the research product" + }, + "refereed":{ + "description": "If this instance has been peer-reviewed or not. Allowed values are peerReviewed, nonPeerReviewed, UNKNOWN (as defined in https://api.openaire.eu/vocabularies/dnet:review_levels)", + "type":"string" + }, + "type":{ + "type":"string", + "description":"The specific sub-type of this instance (see https://api.openaire.eu/vocabularies/dnet:result_typologies following the links)" + }, + "url":{ + "description":"URLs to the instance. They may link to the actual full-text or to the landing page at the hosting source. ", + "type":"array", + "items":{ + "type":"string" + } + } + } + } + }, + "language": { + "type": "object", + "properties": { + "code": { + "type": "string", + "description": "alpha-3/ISO 639-2 code of the language" + }, + "label": { + "type": "string", + "description": "Language label in English" + } + } + }, + "lastupdatetimestamp": { + "type": "integer", + "description": "Timestamp of last update of the record in OpenAIRE" + }, + "maintitle": { + "type": "string", + "descriptio": "A name or title by which a scientific result is known. May be the title of a publication, of a dataset or the name of a piece of software." + }, + "subtitle": { + "type": "string", + "descriptio": "Explanatory or alternative name by which a scientific result is known." + }, + "originalId": { + "description": "Identifiers of the record at the original sources", + "type": "array", + "items": { + "type": "string" + } + }, + "pid": { + "description": "Persistent identifiers of the result", + "type": "array", + "items": { + "allOf": [ + {"$ref": "#/definitions/ControlledField"}, + {"description": "scheme: list of available schemes are at https://api.openaire.eu/vocabularies/dnet:pid_types, value: the PID of the result. Note: the result will have a pid associated only if it was collected from an authority for that pid type. For example a doi will be among the pids for one result if the result metadata were collected from Crossref or Datacite. In all the other cases, the doi will be present among the alteranteIdentifiers for the result "} + ] + } + }, + "programmingLanguage": { + "type": "string", + "description": "Only for results with type 'software': the programming language" + }, + "publicationdate": { + "type": "string", + "description": "Main date of the research product: typically the publication or issued date. In case of a research result with different versions with different dates, the date of the result is selected as the most frequent well-formatted date. If not available, then the most recent and complete date among those that are well-formatted. For statistics, the year is extracted and the result is counted only among the result of that year. Example: Pre-print date: 2019-02-03, Article date provided by repository: 2020-02, Article date provided by Crossref: 2020, OpenAIRE will set as date 2019-02-03, because it’s the most recent among the complete and well-formed dates. If then the repository updates the metadata and set a complete date (e.g. 2020-02-12), then this will be the new date for the result because it becomes the most recent most complete date. However, if OpenAIRE then collects the pre-print from another repository with date 2019-02-03, then this will be the “winning date” because it becomes the most frequent well-formatted date." + }, + "publisher": { + "type": "string", + "description": "The name of the entity that holds, archives, publishes prints, distributes, releases, issues, or produces the resource." + }, + "size": { + "type": "string", + "description": "Only for results with type 'dataset': the declared size of the dataset" + }, + "source": { + "description": "See definition of Dublin Core field dc:source", + "type": "array", + "items": { + "type": "string" + } + }, + "subjects": { + "description": "Keywords associated to the result", + "type": "array", + "items": { + "type": "object", + "properties": { + "provenance": { + "allOf": [ + {"$ref": "#/definitions/Provenance"}, + {"description": "Why this subject is associated to the result"} + ] + }, + "subject": { + "allOf": [ + {"$ref": "#/definitions/ControlledField"}, + {"description": "OpenAIRE subject classification scheme (https://api.openaire.eu/vocabularies/dnet:subject_classification_typologies) and value. When the scheme is 'keyword', it means that the subject is free-text (i.e. not a term from a controlled vocabulary)."} + ] + } + } + } + }, + "tool": { + "description": "Only for results with type 'other': tool useful for the interpretation and/or re-used of the research product", + "type": "array", + "items": { + "type": "string" + } + }, + "type": { + "type": "string", + "description": "Type of the result: one of 'publication', 'dataset', 'software', 'other' (see also https://api.openaire.eu/vocabularies/dnet:result_typologies)" + }, + "version": { + "type": "string", + "description": "Version of the result" + } + } +} \ No newline at end of file diff --git a/src/main/resources/eu/dnetlib/dhp/schema/sql/eosc_patch.sql b/src/main/resources/eu/dnetlib/dhp/schema/sql/eosc_patch.sql new file mode 100644 index 0000000..3b089dc --- /dev/null +++ b/src/main/resources/eu/dnetlib/dhp/schema/sql/eosc_patch.sql @@ -0,0 +1,9 @@ +-- Table to extend the datasource properties according to the eosc model +CREATE TABLE dsm_datasources_eosc( + id varchar(255) references dsm_datasources(id), + jurisdiction text, + thematic boolean, + knowledge_graph boolean, + content_policies text[], + _dnet_resource_identifier_ varchar(2048) default ((('temp_'::text || md5((clock_timestamp())::text)) || '_'::text) || md5((random())::text)) +); diff --git a/src/test/java/eu/dnetlib/dhp/schema/action/AtomicActionTest.java b/src/test/java/eu/dnetlib/dhp/schema/action/AtomicActionTest.java index 9818d03..22cd48c 100644 --- a/src/test/java/eu/dnetlib/dhp/schema/action/AtomicActionTest.java +++ b/src/test/java/eu/dnetlib/dhp/schema/action/AtomicActionTest.java @@ -14,10 +14,11 @@ import eu.dnetlib.dhp.schema.common.ModelConstants; import eu.dnetlib.dhp.schema.oaf.Relation; /** @author claudio.atzori */ -public class AtomicActionTest { +class AtomicActionTest { @Test - public void serializationTest() throws IOException { + @SuppressWarnings("unchecked") + void serializationTest() throws IOException { Relation rel = new Relation(); rel.setSource("1"); diff --git a/src/test/java/eu/dnetlib/dhp/schema/common/ModelSupportTest.java b/src/test/java/eu/dnetlib/dhp/schema/common/ModelSupportTest.java index 73e8c47..3e1533b 100644 --- a/src/test/java/eu/dnetlib/dhp/schema/common/ModelSupportTest.java +++ b/src/test/java/eu/dnetlib/dhp/schema/common/ModelSupportTest.java @@ -1,8 +1,9 @@ package eu.dnetlib.dhp.schema.common; -import static org.junit.jupiter.api.Assertions.assertFalse; -import static org.junit.jupiter.api.Assertions.assertTrue; +import static org.junit.jupiter.api.Assertions.*; + +import java.io.IOException; import org.junit.jupiter.api.Nested; import org.junit.jupiter.api.Test; @@ -17,7 +18,7 @@ public class ModelSupportTest { class IsSubClass { @Test - public void shouldReturnFalseWhenSubClassDoesNotExtendSuperClass() { + void shouldReturnFalseWhenSubClassDoesNotExtendSuperClass() { // when Boolean result = ModelSupport.isSubClass(Relation.class, OafEntity.class); @@ -26,7 +27,7 @@ public class ModelSupportTest { } @Test - public void shouldReturnTrueWhenSubClassExtendsSuperClass() { + void shouldReturnTrueWhenSubClassExtendsSuperClass() { // when Boolean result = ModelSupport.isSubClass(Result.class, OafEntity.class); @@ -34,4 +35,19 @@ public class ModelSupportTest { assertTrue(result); } } + + + @Nested + class InverseRelation { + + @Test + void findRelations() throws IOException { + assertNotNull(ModelSupport.findRelation("isMetadataFor")); + assertNotNull(ModelSupport.findRelation("ismetadatafor")); + assertNotNull(ModelSupport.findRelation("ISMETADATAFOR")); + assertNotNull(ModelSupport.findRelation("isRelatedTo")); + + + } + } } diff --git a/src/test/java/eu/dnetlib/dhp/schema/oaf/MeasureTest.java b/src/test/java/eu/dnetlib/dhp/schema/oaf/MeasureTest.java index 26b4407..c6f8aa8 100644 --- a/src/test/java/eu/dnetlib/dhp/schema/oaf/MeasureTest.java +++ b/src/test/java/eu/dnetlib/dhp/schema/oaf/MeasureTest.java @@ -12,13 +12,13 @@ import com.fasterxml.jackson.core.type.TypeReference; import com.fasterxml.jackson.databind.ObjectMapper; import com.google.common.collect.Lists; -public class MeasureTest { +class MeasureTest { public static final ObjectMapper OBJECT_MAPPER = new ObjectMapper() .setSerializationInclusion(JsonInclude.Include.NON_NULL); @Test - public void testMeasureSerialization() throws IOException { + void testMeasureSerialization() throws IOException { Measure popularity = new Measure(); popularity.setId("popularity"); diff --git a/src/test/java/eu/dnetlib/dhp/schema/oaf/MergeTest.java b/src/test/java/eu/dnetlib/dhp/schema/oaf/MergeTest.java index f9e70c7..69af8e3 100644 --- a/src/test/java/eu/dnetlib/dhp/schema/oaf/MergeTest.java +++ b/src/test/java/eu/dnetlib/dhp/schema/oaf/MergeTest.java @@ -3,24 +3,44 @@ package eu.dnetlib.dhp.schema.oaf; import static org.junit.jupiter.api.Assertions.*; +import java.io.IOException; +import java.io.InputStream; import java.time.format.DateTimeParseException; import java.util.Arrays; import java.util.List; +import java.util.Objects; +import java.util.stream.Collectors; +import org.apache.commons.io.IOUtils; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; -public class MergeTest { +import com.fasterxml.jackson.databind.ObjectMapper; +/** + * The type Merge test. + */ +class MergeTest { + + /** + * The Oaf. + */ OafEntity oaf; + /** + * Sets up. + */ @BeforeEach public void setUp() { oaf = new Publication(); } + /** + * Merge lists test. + */ @Test - public void mergeListsTest() { + @SuppressWarnings("unchecked") + void mergeListsTest() { // string list merge test List a = Arrays.asList("a", "b", "c", "e"); @@ -34,8 +54,11 @@ public class MergeTest { System.out.println("merge result 3 = " + oaf.mergeLists(c, c)); } + /** + * Merge publication collected from test. + */ @Test - public void mergePublicationCollectedFromTest() { + void mergePublicationCollectedFromTest() { Publication a = publication(); Publication b = publication(); @@ -49,8 +72,120 @@ public class MergeTest { assertEquals(3, a.getCollectedfrom().size()); } + /** + * Load resource result list. + * + * @param the type parameter + * @param path the path + * @param clazz the clazz + * @return the list + * @throws Exception the exception + */ + private List loadResourceResult(final String path, final Class clazz ) throws Exception { + final ObjectMapper mapper = new ObjectMapper(); + final InputStream str = Objects.requireNonNull(getClass().getResourceAsStream(path)); + // LOAD test publications + return IOUtils.readLines(str).stream().map(s -> { + try { + return mapper.readValue(s, clazz); + } catch (IOException e) { + return null; + } + }).filter(Objects::nonNull).collect(Collectors.toList()); + } + + + /** + * Apply to any test list result the same pid of the enrichment instance + * + * @param source the source + * @param enrichment the enrichment + * @param overrideAlternateIdentifier the override alternate identifier + */ + private void updatePidIntoPublicationInstance(final List source, final Listenrichment, final boolean overrideAlternateIdentifier) { + for(int i = 0 ; i< source.size(); i++) { + final Result currentPub = source.get(i); + final Result currentEnrichment = enrichment.get(i); + final Instance currentInstance = Objects.requireNonNull(currentPub.getInstance()).get(0); + if (overrideAlternateIdentifier) + currentInstance.setAlternateIdentifier(Objects.requireNonNull(currentEnrichment.getInstance()).get(0).getPid()); + else + currentInstance.setPid(Objects.requireNonNull(currentEnrichment.getInstance()).get(0).getPid()); + } + } + + + private void applyAndVerifyEnrichment(final List l1, final List l2) { + // Apply Merge and verify that enrichments works + for(int i = 0 ; i< l1.size(); i++) { + final Result currentPub = l2.get(i); + final Result currentEnrichment = l1.get(i); + currentPub.mergeFrom(currentEnrichment); + assertEquals(1, currentPub.getInstance().size()); + final Instance currentInstance = Objects.requireNonNull(currentPub.getInstance()).get(0); + assertNotNull(currentInstance.getMeasures()); + assertNotNull(currentPub.getTitle()); + assertFalse(Result.isAnEnrichment(currentPub)); + } + + } + + + + /** + * Test enrichment function. + * + * @throws Exception the exception + */ @Test - public void mergePublicationDateOfAcceptanceTest_bothPresent() { + void testEnrichment() throws Exception { + + + // 1 TEST UPDATING PID INSTANCE AND MERGE CURRENT PUBLICATION WITH ENRICHMENT + // LOAD test publications + List publications = loadResourceResult("/eu/dnetlib/dhp/schema/oaf/utils/publications.json", Publication.class); + // Assert that each publication has only one instance and inside that all the measure field is empty + publications.forEach(p -> { + assertEquals(1, p.getInstance().size()); + final Instance currentInstance = Objects.requireNonNull(p.getInstance()).get(0); + assertNull(currentInstance.getMeasures()); + }); + + // LOAD test enrichments + List enrichment = loadResourceResult("/eu/dnetlib/dhp/schema/oaf/utils/enrichment.json", Result.class); + + updatePidIntoPublicationInstance(publications, enrichment, false); + applyAndVerifyEnrichment(publications, enrichment); + + + // 2 TEST UPDATING ALTERNATE ID INSTANCE AND MERGE CURRENT PUBLICATION WITH ENRICHMENT + publications = loadResourceResult("/eu/dnetlib/dhp/schema/oaf/utils/publications.json", Publication.class); + enrichment = loadResourceResult("/eu/dnetlib/dhp/schema/oaf/utils/enrichment.json", Result.class); + updatePidIntoPublicationInstance(publications, enrichment, true); + applyAndVerifyEnrichment(publications, enrichment); + + + // 3 TEST UPDATING PID INSTANCE AND MERGE ENRICHMENT WITH CURRENT PUBLICATION + publications = loadResourceResult("/eu/dnetlib/dhp/schema/oaf/utils/publications.json", Publication.class); + enrichment = loadResourceResult("/eu/dnetlib/dhp/schema/oaf/utils/enrichment.json", Result.class); + updatePidIntoPublicationInstance(publications, enrichment, false); + applyAndVerifyEnrichment( enrichment, publications); + + // 4 TEST UPDATING ALTERNATE ID INSTANCE AND MERGE ENRICHMENT WITH CURRENT PUBLICATION + publications = loadResourceResult("/eu/dnetlib/dhp/schema/oaf/utils/publications.json", Publication.class); + enrichment = loadResourceResult("/eu/dnetlib/dhp/schema/oaf/utils/enrichment.json", Result.class); + updatePidIntoPublicationInstance(publications, enrichment, true); + applyAndVerifyEnrichment( enrichment, publications); + + + } + + + /** + * Merge publication date of acceptance test both present. + */ + @Test + void mergePublicationDateOfAcceptanceTest_bothPresent() { Publication a = publication(); Publication b = publication(); @@ -64,8 +199,11 @@ public class MergeTest { assertEquals("2021-06-18", a.getDateofacceptance().getValue()); } + /** + * Merge publication date of acceptance test both present 1. + */ @Test - public void mergePublicationDateOfAcceptanceTest_bothPresent_1() { + void mergePublicationDateOfAcceptanceTest_bothPresent_1() { Publication a = publication("0.8"); Publication b = publication("0.9"); @@ -79,8 +217,11 @@ public class MergeTest { assertEquals("2021-06-19", a.getDateofacceptance().getValue()); } + /** + * Merge publication date of acceptance test both present 2. + */ @Test - public void mergePublicationDateOfAcceptanceTest_bothPresent_2() { + void mergePublicationDateOfAcceptanceTest_bothPresent_2() { Publication a = publication("0.9"); Publication b = publication("0.8"); @@ -94,8 +235,11 @@ public class MergeTest { assertEquals("2021-06-18", a.getDateofacceptance().getValue()); } + /** + * Merge publication date of acceptance test left missing. + */ @Test - public void mergePublicationDateOfAcceptanceTest_leftMissing() { + void mergePublicationDateOfAcceptanceTest_leftMissing() { Publication a = publication(); Publication b = publication(); @@ -108,8 +252,11 @@ public class MergeTest { assertEquals("2021-06-19", a.getDateofacceptance().getValue()); } + /** + * Merge publication date of acceptance test left missing 1. + */ @Test - public void mergePublicationDateOfAcceptanceTest_leftMissing_1() { + void mergePublicationDateOfAcceptanceTest_leftMissing_1() { Publication a = publication("0.9"); Publication b = publication("0.8"); @@ -122,8 +269,11 @@ public class MergeTest { assertEquals("2021-06-19", a.getDateofacceptance().getValue()); } + /** + * Merge publication date of acceptance test left missing 2. + */ @Test - public void mergePublicationDateOfAcceptanceTest_leftMissing_2() { + void mergePublicationDateOfAcceptanceTest_leftMissing_2() { Publication a = publication("0.8"); Publication b = publication("0.9"); @@ -136,8 +286,11 @@ public class MergeTest { assertEquals("2021-06-19", a.getDateofacceptance().getValue()); } + /** + * Merge publication date of acceptance test right missing. + */ @Test - public void mergePublicationDateOfAcceptanceTest_rightMissing() { + void mergePublicationDateOfAcceptanceTest_rightMissing() { Publication a = publication(); Publication b = publication(); @@ -150,8 +303,11 @@ public class MergeTest { assertEquals("2021-06-19", a.getDateofacceptance().getValue()); } + /** + * Merge publication date of acceptance test right missing 1. + */ @Test - public void mergePublicationDateOfAcceptanceTest_rightMissing_1() { + void mergePublicationDateOfAcceptanceTest_rightMissing_1() { Publication a = publication("0.8"); Publication b = publication("0.9"); @@ -164,8 +320,11 @@ public class MergeTest { assertEquals("2021-06-19", a.getDateofacceptance().getValue()); } + /** + * Merge publication date of acceptance test right missing 2. + */ @Test - public void mergePublicationDateOfAcceptanceTest_rightMissing_2() { + void mergePublicationDateOfAcceptanceTest_rightMissing_2() { Publication a = publication("0.9"); Publication b = publication("0.8"); @@ -178,8 +337,11 @@ public class MergeTest { assertEquals("2021-06-19", a.getDateofacceptance().getValue()); } + /** + * Merge publication subject test. + */ @Test - public void mergePublicationSubjectTest() { + void mergePublicationSubjectTest() { Publication a = publication(); Publication b = publication(); @@ -193,8 +355,11 @@ public class MergeTest { assertEquals(3, a.getSubject().size()); } + /** + * Merge relation test. + */ @Test - public void mergeRelationTest() { + void mergeRelationTest() { Relation a = createRel(null, null); Relation b = createRel(null, null); @@ -234,8 +399,11 @@ public class MergeTest { } + /** + * Merge relation test parse exception. + */ @Test - public void mergeRelationTestParseException() { + void mergeRelationTestParseException() { assertThrows(DateTimeParseException.class, () -> { Relation a = createRel(true, "Once upon a time ..."); Relation b = createRel(true, "... in a far away land"); @@ -243,6 +411,13 @@ public class MergeTest { }); } + /** + * Create rel relation. + * + * @param validated the validated + * @param validationDate the validation date + * @return the relation + */ private Relation createRel(Boolean validated, String validationDate) { Relation rel = new Relation(); rel.setSource("1"); @@ -255,6 +430,13 @@ public class MergeTest { return rel; } + /** + * Sets kv. + * + * @param key the key + * @param value the value + * @return the kv + */ private KeyValue setKV(final String key, final String value) { KeyValue k = new KeyValue(); @@ -265,6 +447,14 @@ public class MergeTest { return k; } + /** + * Sets sp. + * + * @param value the value + * @param schema the schema + * @param classname the classname + * @return the sp + */ private StructuredProperty setSP( final String value, final String schema, final String classname) { StructuredProperty s = new StructuredProperty(); @@ -278,24 +468,48 @@ public class MergeTest { return s; } + /** + * Field field. + * + * @param the type parameter + * @param value the value + * @return the field + */ private Field field(T value) { - Field f = new Field(); + Field f = new Field(); f.setValue(value); return f; } + /** + * Publication publication. + * + * @return the publication + */ private Publication publication() { Publication p = new Publication(); p.setDataInfo(df("0.9")); return p; } + /** + * Publication publication. + * + * @param trust the trust + * @return the publication + */ private Publication publication(String trust) { Publication p = new Publication(); p.setDataInfo(df(trust)); return p; } + /** + * Df data info. + * + * @param trust the trust + * @return the data info + */ private DataInfo df(String trust) { DataInfo d = new DataInfo(); d.setTrust(trust); diff --git a/src/test/java/eu/dnetlib/dhp/schema/oaf/dump/GenerateJsonSchema.java b/src/test/java/eu/dnetlib/dhp/schema/oaf/dump/GenerateJsonSchema.java new file mode 100644 index 0000000..cca6d94 --- /dev/null +++ b/src/test/java/eu/dnetlib/dhp/schema/oaf/dump/GenerateJsonSchema.java @@ -0,0 +1,55 @@ +package eu.dnetlib.dhp.schema.oaf.dump; + +import java.io.IOException; + +import org.junit.jupiter.api.Disabled; +import org.junit.jupiter.api.Test; + +import com.fasterxml.jackson.databind.JsonNode; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.github.imifou.jsonschema.module.addon.AddonModule; +import com.github.victools.jsonschema.generator.*; + +import eu.dnetlib.dhp.schema.dump.ExecCreateSchemas; +import eu.dnetlib.dhp.schema.dump.oaf.graph.*; + +//@Disabled +class GenerateJsonSchema { + + @Test + void generateSchema() { + SchemaGeneratorConfigBuilder configBuilder = new SchemaGeneratorConfigBuilder(SchemaVersion.DRAFT_7, + OptionPreset.PLAIN_JSON) + .with(Option.SCHEMA_VERSION_INDICATOR) + .without(Option.NONPUBLIC_NONSTATIC_FIELDS_WITHOUT_GETTERS); + configBuilder.forFields().withDescriptionResolver(field -> "Description of " + field.getDeclaredName()); + SchemaGeneratorConfig config = configBuilder.build(); + SchemaGenerator generator = new SchemaGenerator(config); + JsonNode jsonSchema = generator.generateSchema(GraphResult.class); + + System.out.println(jsonSchema.toString()); + } + + @Test + void generateSchema2(){ + + ObjectMapper objectMapper = new ObjectMapper(); + AddonModule module = new AddonModule(); + SchemaGeneratorConfigBuilder configBuilder = new SchemaGeneratorConfigBuilder(objectMapper,SchemaVersion.DRAFT_7,OptionPreset.PLAIN_JSON) + .with(module) + .with(Option.SCHEMA_VERSION_INDICATOR) + .without(Option.NONPUBLIC_NONSTATIC_FIELDS_WITHOUT_GETTERS); + SchemaGeneratorConfig config = configBuilder.build(); + SchemaGenerator generator = new SchemaGenerator(config); + JsonNode jsonSchema = generator.generateSchema(GraphResult.class); + + System.out.println(jsonSchema.toString()); + } + + + @Test + void generateJsonSchema3() throws IOException { + + ExecCreateSchemas.main(new String[]{}); + } +} diff --git a/src/test/java/eu/dnetlib/dhp/schema/oaf/utils/BlackListProviderTest.java b/src/test/java/eu/dnetlib/dhp/schema/oaf/utils/BlackListProviderTest.java index 203cda0..61d06a6 100644 --- a/src/test/java/eu/dnetlib/dhp/schema/oaf/utils/BlackListProviderTest.java +++ b/src/test/java/eu/dnetlib/dhp/schema/oaf/utils/BlackListProviderTest.java @@ -6,10 +6,10 @@ import java.util.Set; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; -public class BlackListProviderTest { +class BlackListProviderTest { @Test - public void blackListTest() { + void blackListTest() { Assertions.assertNotNull(PidBlacklistProvider.getBlacklist()); Assertions.assertNotNull(PidBlacklistProvider.getBlacklist().get("doi")); diff --git a/src/test/java/eu/dnetlib/dhp/schema/oaf/utils/IdentifierFactoryTest.java b/src/test/java/eu/dnetlib/dhp/schema/oaf/utils/IdentifierFactoryTest.java index aec0878..0a434a1 100644 --- a/src/test/java/eu/dnetlib/dhp/schema/oaf/utils/IdentifierFactoryTest.java +++ b/src/test/java/eu/dnetlib/dhp/schema/oaf/utils/IdentifierFactoryTest.java @@ -14,13 +14,13 @@ import com.fasterxml.jackson.databind.ObjectMapper; import eu.dnetlib.dhp.schema.oaf.Publication; -public class IdentifierFactoryTest { +class IdentifierFactoryTest { private static final ObjectMapper OBJECT_MAPPER = new ObjectMapper() .configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); @Test - public void testCreateIdentifierForPublication() throws IOException { + void testCreateIdentifierForPublication() throws IOException { verifyIdentifier( "publication_doi1.json", "50|doi_________::79dbc7a2a56dc1532659f9038843256e", true); @@ -51,7 +51,7 @@ public class IdentifierFactoryTest { } @Test - public void testCreateIdentifierForPublicationNoHash() throws IOException { + void testCreateIdentifierForPublicationNoHash() throws IOException { verifyIdentifier("publication_doi1.json", "50|doi_________::10.1016/j.cmet.2010.03.013", false); verifyIdentifier("publication_doi2.json", "50|doi_________::10.1016/j.cmet.2010.03.013", false); diff --git a/src/test/resources/eu/dnetlib/dhp/schema/oaf/utils/enrichment.json b/src/test/resources/eu/dnetlib/dhp/schema/oaf/utils/enrichment.json new file mode 100644 index 0000000..a26b106 --- /dev/null +++ b/src/test/resources/eu/dnetlib/dhp/schema/oaf/utils/enrichment.json @@ -0,0 +1,12 @@ +{"dataInfo":{"deletedbyinference":false,"inferred":true,"invisible":false,"provenanceaction":{"classid":"sysimport:enrich","schemeid":"dnet:provenanceActions","schemename":"dnet:provenanceActions"}},"id":"unresolved::10.0000/ra.v2i3.114::doi","instance":[{"measures":[{"id":"influence","unit":[{"dataInfo":{"deletedbyinference":false,"inferenceprovenance":"update","inferred":true,"invisible":false,"provenanceaction":{"classid":"measure:bip","classname":"Inferred by OpenAIRE","schemeid":"dnet:provenanceActions","schemename":"dnet:provenanceActions"},"trust":""},"key":"score","value":"5.91019644836e-09"}]},{"id":"popularity_alt","unit":[{"dataInfo":{"deletedbyinference":false,"inferenceprovenance":"update","inferred":true,"invisible":false,"provenanceaction":{"classid":"measure:bip","classname":"Inferred by OpenAIRE","schemeid":"dnet:provenanceActions","schemename":"dnet:provenanceActions"},"trust":""},"key":"score","value":"0.0"}]},{"id":"popularity","unit":[{"dataInfo":{"deletedbyinference":false,"inferenceprovenance":"update","inferred":true,"invisible":false,"provenanceaction":{"classid":"measure:bip","classname":"Inferred by OpenAIRE","schemeid":"dnet:provenanceActions","schemename":"dnet:provenanceActions"},"trust":""},"key":"score","value":"4.65008652949e-09"}]}],"pid":[{"qualifier":{"classid":"doi","classname":"Digital Object Identifier","schemeid":"dnet:pid_types","schemename":"dnet:pid_types"},"value":"10.0000/ra.v2i3.114"}]}]} +{"dataInfo":{"deletedbyinference":false,"inferred":true,"invisible":false,"provenanceaction":{"classid":"sysimport:enrich","schemeid":"dnet:provenanceActions","schemename":"dnet:provenanceActions"}},"id":"unresolved::10.0001/(aj).v3i6.458::doi","instance":[{"measures":[{"id":"influence","unit":[{"dataInfo":{"deletedbyinference":false,"inferenceprovenance":"update","inferred":true,"invisible":false,"provenanceaction":{"classid":"measure:bip","classname":"Inferred by OpenAIRE","schemeid":"dnet:provenanceActions","schemename":"dnet:provenanceActions"},"trust":""},"key":"score","value":"5.91019644836e-09"}]},{"id":"popularity_alt","unit":[{"dataInfo":{"deletedbyinference":false,"inferenceprovenance":"update","inferred":true,"invisible":false,"provenanceaction":{"classid":"measure:bip","classname":"Inferred by OpenAIRE","schemeid":"dnet:provenanceActions","schemename":"dnet:provenanceActions"},"trust":""},"key":"score","value":"0.0"}]},{"id":"popularity","unit":[{"dataInfo":{"deletedbyinference":false,"inferenceprovenance":"update","inferred":true,"invisible":false,"provenanceaction":{"classid":"measure:bip","classname":"Inferred by OpenAIRE","schemeid":"dnet:provenanceActions","schemename":"dnet:provenanceActions"},"trust":""},"key":"score","value":"4.01810569717e-09"}]}],"pid":[{"qualifier":{"classid":"doi","classname":"Digital Object Identifier","schemeid":"dnet:pid_types","schemename":"dnet:pid_types"},"value":"10.0001/(aj).v3i6.458"}]}]} +{"dataInfo":{"deletedbyinference":false,"inferred":true,"invisible":false,"provenanceaction":{"classid":"sysimport:enrich","schemeid":"dnet:provenanceActions","schemename":"dnet:provenanceActions"}},"id":"unresolved::10.0001/1587::doi","instance":[{"measures":[{"id":"influence","unit":[{"dataInfo":{"deletedbyinference":false,"inferenceprovenance":"update","inferred":true,"invisible":false,"provenanceaction":{"classid":"measure:bip","classname":"Inferred by OpenAIRE","schemeid":"dnet:provenanceActions","schemename":"dnet:provenanceActions"},"trust":""},"key":"score","value":"5.91019644836e-09"}]},{"id":"popularity_alt","unit":[{"dataInfo":{"deletedbyinference":false,"inferenceprovenance":"update","inferred":true,"invisible":false,"provenanceaction":{"classid":"measure:bip","classname":"Inferred by OpenAIRE","schemeid":"dnet:provenanceActions","schemename":"dnet:provenanceActions"},"trust":""},"key":"score","value":"0.0"}]},{"id":"popularity","unit":[{"dataInfo":{"deletedbyinference":false,"inferenceprovenance":"update","inferred":true,"invisible":false,"provenanceaction":{"classid":"measure:bip","classname":"Inferred by OpenAIRE","schemeid":"dnet:provenanceActions","schemename":"dnet:provenanceActions"},"trust":""},"key":"score","value":"5.39172290649e-09"}]}],"pid":[{"qualifier":{"classid":"doi","classname":"Digital Object Identifier","schemeid":"dnet:pid_types","schemename":"dnet:pid_types"},"value":"10.0001/1587"}]}]} +{"dataInfo":{"deletedbyinference":false,"inferred":true,"invisible":false,"provenanceaction":{"classid":"sysimport:enrich","schemeid":"dnet:provenanceActions","schemename":"dnet:provenanceActions"}},"id":"unresolved::10.0001/462::doi","instance":[{"measures":[{"id":"influence","unit":[{"dataInfo":{"deletedbyinference":false,"inferenceprovenance":"update","inferred":true,"invisible":false,"provenanceaction":{"classid":"measure:bip","classname":"Inferred by OpenAIRE","schemeid":"dnet:provenanceActions","schemename":"dnet:provenanceActions"},"trust":""},"key":"score","value":"6.33235333753e-09"}]},{"id":"popularity_alt","unit":[{"dataInfo":{"deletedbyinference":false,"inferenceprovenance":"update","inferred":true,"invisible":false,"provenanceaction":{"classid":"measure:bip","classname":"Inferred by OpenAIRE","schemeid":"dnet:provenanceActions","schemename":"dnet:provenanceActions"},"trust":""},"key":"score","value":"0.36"}]},{"id":"popularity","unit":[{"dataInfo":{"deletedbyinference":false,"inferenceprovenance":"update","inferred":true,"invisible":false,"provenanceaction":{"classid":"measure:bip","classname":"Inferred by OpenAIRE","schemeid":"dnet:provenanceActions","schemename":"dnet:provenanceActions"},"trust":""},"key":"score","value":"5.00285265116e-09"}]}],"pid":[{"qualifier":{"classid":"doi","classname":"Digital Object Identifier","schemeid":"dnet:pid_types","schemename":"dnet:pid_types"},"value":"10.0001/462"}]}]} +{"dataInfo":{"deletedbyinference":false,"inferred":true,"invisible":false,"provenanceaction":{"classid":"sysimport:enrich","schemeid":"dnet:provenanceActions","schemename":"dnet:provenanceActions"}},"id":"unresolved::10.0001/731::doi","instance":[{"measures":[{"id":"influence","unit":[{"dataInfo":{"deletedbyinference":false,"inferenceprovenance":"update","inferred":true,"invisible":false,"provenanceaction":{"classid":"measure:bip","classname":"Inferred by OpenAIRE","schemeid":"dnet:provenanceActions","schemename":"dnet:provenanceActions"},"trust":""},"key":"score","value":"5.91019644836e-09"}]},{"id":"popularity_alt","unit":[{"dataInfo":{"deletedbyinference":false,"inferenceprovenance":"update","inferred":true,"invisible":false,"provenanceaction":{"classid":"measure:bip","classname":"Inferred by OpenAIRE","schemeid":"dnet:provenanceActions","schemename":"dnet:provenanceActions"},"trust":""},"key":"score","value":"0.0"}]},{"id":"popularity","unit":[{"dataInfo":{"deletedbyinference":false,"inferenceprovenance":"update","inferred":true,"invisible":false,"provenanceaction":{"classid":"measure:bip","classname":"Inferred by OpenAIRE","schemeid":"dnet:provenanceActions","schemename":"dnet:provenanceActions"},"trust":""},"key":"score","value":"4.01810569717e-09"}]}],"pid":[{"qualifier":{"classid":"doi","classname":"Digital Object Identifier","schemeid":"dnet:pid_types","schemename":"dnet:pid_types"},"value":"10.0001/731"}]}]} +{"dataInfo":{"deletedbyinference":false,"inferred":true,"invisible":false,"provenanceaction":{"classid":"sysimport:enrich","schemeid":"dnet:provenanceActions","schemename":"dnet:provenanceActions"}},"id":"unresolved::10.0001/ijllis.v9i4.2066.g2482::doi","instance":[{"measures":[{"id":"influence","unit":[{"dataInfo":{"deletedbyinference":false,"inferenceprovenance":"update","inferred":true,"invisible":false,"provenanceaction":{"classid":"measure:bip","classname":"Inferred by OpenAIRE","schemeid":"dnet:provenanceActions","schemename":"dnet:provenanceActions"},"trust":""},"key":"score","value":"5.91019644836e-09"}]},{"id":"popularity_alt","unit":[{"dataInfo":{"deletedbyinference":false,"inferenceprovenance":"update","inferred":true,"invisible":false,"provenanceaction":{"classid":"measure:bip","classname":"Inferred by OpenAIRE","schemeid":"dnet:provenanceActions","schemename":"dnet:provenanceActions"},"trust":""},"key":"score","value":"0.0"}]},{"id":"popularity","unit":[{"dataInfo":{"deletedbyinference":false,"inferenceprovenance":"update","inferred":true,"invisible":false,"provenanceaction":{"classid":"measure:bip","classname":"Inferred by OpenAIRE","schemeid":"dnet:provenanceActions","schemename":"dnet:provenanceActions"},"trust":""},"key":"score","value":"8.48190886761e-09"}]}],"pid":[{"qualifier":{"classid":"doi","classname":"Digital Object Identifier","schemeid":"dnet:pid_types","schemename":"dnet:pid_types"},"value":"10.0001/ijllis.v9i4.2066.g2482"}]}]} +{"dataInfo":{"deletedbyinference":false,"inferred":true,"invisible":false,"provenanceaction":{"classid":"sysimport:enrich","schemeid":"dnet:provenanceActions","schemename":"dnet:provenanceActions"}},"id":"unresolved::10.0118/alfahim.v3i1.140::doi","instance":[{"measures":[{"id":"influence","unit":[{"dataInfo":{"deletedbyinference":false,"inferenceprovenance":"update","inferred":true,"invisible":false,"provenanceaction":{"classid":"measure:bip","classname":"Inferred by OpenAIRE","schemeid":"dnet:provenanceActions","schemename":"dnet:provenanceActions"},"trust":""},"key":"score","value":"5.91019644836e-09"}]},{"id":"popularity_alt","unit":[{"dataInfo":{"deletedbyinference":false,"inferenceprovenance":"update","inferred":true,"invisible":false,"provenanceaction":{"classid":"measure:bip","classname":"Inferred by OpenAIRE","schemeid":"dnet:provenanceActions","schemename":"dnet:provenanceActions"},"trust":""},"key":"score","value":"0.0"}]},{"id":"popularity","unit":[{"dataInfo":{"deletedbyinference":false,"inferenceprovenance":"update","inferred":true,"invisible":false,"provenanceaction":{"classid":"measure:bip","classname":"Inferred by OpenAIRE","schemeid":"dnet:provenanceActions","schemename":"dnet:provenanceActions"},"trust":""},"key":"score","value":"9.88840807598e-09"}]}],"pid":[{"qualifier":{"classid":"doi","classname":"Digital Object Identifier","schemeid":"dnet:pid_types","schemename":"dnet:pid_types"},"value":"10.0118/alfahim.v3i1.140"}]}]} +{"dataInfo":{"deletedbyinference":false,"inferred":true,"invisible":false,"provenanceaction":{"classid":"sysimport:enrich","schemeid":"dnet:provenanceActions","schemename":"dnet:provenanceActions"}},"id":"unresolved::10.0166/fk2.stagefigshare.6442896.v3::doi","instance":[{"measures":[{"id":"influence","unit":[{"dataInfo":{"deletedbyinference":false,"inferenceprovenance":"update","inferred":true,"invisible":false,"provenanceaction":{"classid":"measure:bip","classname":"Inferred by OpenAIRE","schemeid":"dnet:provenanceActions","schemename":"dnet:provenanceActions"},"trust":""},"key":"score","value":"5.91019644836e-09"}]},{"id":"popularity_alt","unit":[{"dataInfo":{"deletedbyinference":false,"inferenceprovenance":"update","inferred":true,"invisible":false,"provenanceaction":{"classid":"measure:bip","classname":"Inferred by OpenAIRE","schemeid":"dnet:provenanceActions","schemename":"dnet:provenanceActions"},"trust":""},"key":"score","value":"0.0"}]},{"id":"popularity","unit":[{"dataInfo":{"deletedbyinference":false,"inferenceprovenance":"update","inferred":true,"invisible":false,"provenanceaction":{"classid":"measure:bip","classname":"Inferred by OpenAIRE","schemeid":"dnet:provenanceActions","schemename":"dnet:provenanceActions"},"trust":""},"key":"score","value":"7.28336930301e-09"}]}],"pid":[{"qualifier":{"classid":"doi","classname":"Digital Object Identifier","schemeid":"dnet:pid_types","schemename":"dnet:pid_types"},"value":"10.0166/fk2.stagefigshare.6442896.v3"}]}]} +{"dataInfo":{"deletedbyinference":false,"inferred":true,"invisible":false,"provenanceaction":{"classid":"sysimport:enrich","schemeid":"dnet:provenanceActions","schemename":"dnet:provenanceActions"}},"id":"unresolved::10.0301/jttb.v2i1.64::doi","instance":[{"measures":[{"id":"influence","unit":[{"dataInfo":{"deletedbyinference":false,"inferenceprovenance":"update","inferred":true,"invisible":false,"provenanceaction":{"classid":"measure:bip","classname":"Inferred by OpenAIRE","schemeid":"dnet:provenanceActions","schemename":"dnet:provenanceActions"},"trust":""},"key":"score","value":"5.91019644836e-09"}]},{"id":"popularity_alt","unit":[{"dataInfo":{"deletedbyinference":false,"inferenceprovenance":"update","inferred":true,"invisible":false,"provenanceaction":{"classid":"measure:bip","classname":"Inferred by OpenAIRE","schemeid":"dnet:provenanceActions","schemename":"dnet:provenanceActions"},"trust":""},"key":"score","value":"0.0"}]},{"id":"popularity","unit":[{"dataInfo":{"deletedbyinference":false,"inferenceprovenance":"update","inferred":true,"invisible":false,"provenanceaction":{"classid":"measure:bip","classname":"Inferred by OpenAIRE","schemeid":"dnet:provenanceActions","schemename":"dnet:provenanceActions"},"trust":""},"key":"score","value":"7.28336930301e-09"}]}],"pid":[{"qualifier":{"classid":"doi","classname":"Digital Object Identifier","schemeid":"dnet:pid_types","schemename":"dnet:pid_types"},"value":"10.0301/jttb.v2i1.64"}]}]} +{"dataInfo":{"deletedbyinference":false,"inferred":true,"invisible":false,"provenanceaction":{"classid":"sysimport:enrich","schemeid":"dnet:provenanceActions","schemename":"dnet:provenanceActions"}},"id":"unresolved::10.0809/seruni.v1i1.567::doi","instance":[{"measures":[{"id":"influence","unit":[{"dataInfo":{"deletedbyinference":false,"inferenceprovenance":"update","inferred":true,"invisible":false,"provenanceaction":{"classid":"measure:bip","classname":"Inferred by OpenAIRE","schemeid":"dnet:provenanceActions","schemename":"dnet:provenanceActions"},"trust":""},"key":"score","value":"5.91019644836e-09"}]},{"id":"popularity_alt","unit":[{"dataInfo":{"deletedbyinference":false,"inferenceprovenance":"update","inferred":true,"invisible":false,"provenanceaction":{"classid":"measure:bip","classname":"Inferred by OpenAIRE","schemeid":"dnet:provenanceActions","schemename":"dnet:provenanceActions"},"trust":""},"key":"score","value":"0.0"}]},{"id":"popularity","unit":[{"dataInfo":{"deletedbyinference":false,"inferenceprovenance":"update","inferred":true,"invisible":false,"provenanceaction":{"classid":"measure:bip","classname":"Inferred by OpenAIRE","schemeid":"dnet:provenanceActions","schemename":"dnet:provenanceActions"},"trust":""},"key":"score","value":"2.62959564033e-09"}]}],"pid":[{"qualifier":{"classid":"doi","classname":"Digital Object Identifier","schemeid":"dnet:pid_types","schemename":"dnet:pid_types"},"value":"10.0809/seruni.v1i1.567"}]}]} +{"dataInfo":{"deletedbyinference":false,"inferred":true,"invisible":false,"provenanceaction":{"classid":"sysimport:enrich","schemeid":"dnet:provenanceActions","schemename":"dnet:provenanceActions"}},"id":"unresolved::10.0809/seruni.v2i1.765::doi","instance":[{"measures":[{"id":"influence","unit":[{"dataInfo":{"deletedbyinference":false,"inferenceprovenance":"update","inferred":true,"invisible":false,"provenanceaction":{"classid":"measure:bip","classname":"Inferred by OpenAIRE","schemeid":"dnet:provenanceActions","schemename":"dnet:provenanceActions"},"trust":""},"key":"score","value":"9.40178571921e-09"}]},{"id":"popularity_alt","unit":[{"dataInfo":{"deletedbyinference":false,"inferenceprovenance":"update","inferred":true,"invisible":false,"provenanceaction":{"classid":"measure:bip","classname":"Inferred by OpenAIRE","schemeid":"dnet:provenanceActions","schemename":"dnet:provenanceActions"},"trust":""},"key":"score","value":"0.0559872"}]},{"id":"popularity","unit":[{"dataInfo":{"deletedbyinference":false,"inferenceprovenance":"update","inferred":true,"invisible":false,"provenanceaction":{"classid":"measure:bip","classname":"Inferred by OpenAIRE","schemeid":"dnet:provenanceActions","schemename":"dnet:provenanceActions"},"trust":""},"key":"score","value":"3.67659957614e-09"}]}],"pid":[{"qualifier":{"classid":"doi","classname":"Digital Object Identifier","schemeid":"dnet:pid_types","schemename":"dnet:pid_types"},"value":"10.0809/seruni.v2i1.765"}]}]} +{"dataInfo":{"deletedbyinference":false,"inferred":true,"invisible":false,"provenanceaction":{"classid":"sysimport:enrich","schemeid":"dnet:provenanceActions","schemename":"dnet:provenanceActions"}},"id":"unresolved::10.0901/jkip.v7i3.485::doi","instance":[{"measures":[{"id":"influence","unit":[{"dataInfo":{"deletedbyinference":false,"inferenceprovenance":"update","inferred":true,"invisible":false,"provenanceaction":{"classid":"measure:bip","classname":"Inferred by OpenAIRE","schemeid":"dnet:provenanceActions","schemename":"dnet:provenanceActions"},"trust":""},"key":"score","value":"5.91019644836e-09"}]},{"id":"popularity_alt","unit":[{"dataInfo":{"deletedbyinference":false,"inferenceprovenance":"update","inferred":true,"invisible":false,"provenanceaction":{"classid":"measure:bip","classname":"Inferred by OpenAIRE","schemeid":"dnet:provenanceActions","schemename":"dnet:provenanceActions"},"trust":""},"key":"score","value":"0.0"}]},{"id":"popularity","unit":[{"dataInfo":{"deletedbyinference":false,"inferenceprovenance":"update","inferred":true,"invisible":false,"provenanceaction":{"classid":"measure:bip","classname":"Inferred by OpenAIRE","schemeid":"dnet:provenanceActions","schemename":"dnet:provenanceActions"},"trust":""},"key":"score","value":"6.26204125721e-09"}]}],"pid":[{"qualifier":{"classid":"doi","classname":"Digital Object Identifier","schemeid":"dnet:pid_types","schemename":"dnet:pid_types"},"value":"10.0901/jkip.v7i3.485"}]}]} \ No newline at end of file diff --git a/src/test/resources/eu/dnetlib/dhp/schema/oaf/utils/publications.json b/src/test/resources/eu/dnetlib/dhp/schema/oaf/utils/publications.json new file mode 100644 index 0000000..ef0cc58 --- /dev/null +++ b/src/test/resources/eu/dnetlib/dhp/schema/oaf/utils/publications.json @@ -0,0 +1,12 @@ +{"author":[{"fullname":"Levande, Paul","name":"Paul","pid":[],"rank":1,"surname":"Levande"}],"bestaccessright":{"classid":"OPEN","classname":"Open Access","schemeid":"dnet:access_modes","schemename":"dnet:access_modes"},"collectedfrom":[{"key":"10|openaire____::6824b298c96ba906a3e6a70593affbf5","value":"Episciences"}],"context":[],"contributor":[{"dataInfo":{"deletedbyinference":false,"inferenceprovenance":"","inferred":false,"invisible":false,"provenanceaction":{"classid":"sysimport:crosswalk:repository","classname":"Harvested","schemeid":"dnet:provenanceActions","schemename":"dnet:provenanceActions"},"trust":"0.9"},"value":"Coordination Episciences iam"}],"country":[],"coverage":[],"dataInfo":{"deletedbyinference":true,"inferenceprovenance":"","inferred":false,"invisible":false,"provenanceaction":{"classid":"sysimport:crosswalk:repository","classname":"Harvested","schemeid":"dnet:provenanceActions","schemename":"dnet:provenanceActions"},"trust":"0.9"},"dateofacceptance":{"dataInfo":{"deletedbyinference":false,"inferenceprovenance":"","inferred":false,"invisible":false,"provenanceaction":{"classid":"sysimport:crosswalk:repository","classname":"Harvested","schemeid":"dnet:provenanceActions","schemename":"dnet:provenanceActions"},"trust":"0.9"},"value":"2011-01-01"},"dateofcollection":"2021-11-09T19:00:42.081Z","dateoftransformation":"2021-11-09T19:36:08.397Z","description":[{"dataInfo":{"deletedbyinference":false,"inferenceprovenance":"","inferred":false,"invisible":false,"provenanceaction":{"classid":"sysimport:crosswalk:repository","classname":"Harvested","schemeid":"dnet:provenanceActions","schemename":"dnet:provenanceActions"},"trust":"0.9"},"value":"We examine the $q=1$ and $t=0$ special cases of the parking functions conjecture. The parking functions conjecture states that the Hilbert series for the space of diagonal harmonics is equal to the bivariate generating function of $area$ and $dinv$ over the set of parking functions. Haglund recently proved that the Hilbert series for the space of diagonal harmonics is equal to a bivariate generating function over the set of Tesler matrices–upper-triangular matrices with every hook sum equal to one. We give a combinatorial interpretation of the Haglund generating function at $q=1$ and prove the corresponding case of the parking functions conjecture (first proven by Garsia and Haiman). We also discuss a possible proof of the $t = 0$ case consistent with this combinatorial interpretation. We conclude by briefly discussing possible refinements of the parking functions conjecture arising from this research and point of view. $\\textbf{Note added in proof}$: We have since found such a proof of the $t = 0$ case and conjectured more detailed refinements. This research will most likely be presented in full in a forthcoming article."},{"dataInfo":{"deletedbyinference":false,"inferenceprovenance":"","inferred":false,"invisible":false,"provenanceaction":{"classid":"sysimport:crosswalk:repository","classname":"Harvested","schemeid":"dnet:provenanceActions","schemename":"dnet:provenanceActions"},"trust":"0.9"},"value":"On examine les cas spéciaux $q=1$ et $t=0$ de la conjecture des fonctions de stationnement. Cette conjecture déclare que la série de Hilbert pour l'espace des harmoniques diagonaux est égale à la fonction génératrice bivariée (paramètres $area$ et $dinv$) sur l'ensemble des fonctions de stationnement. Haglund a prouvé récemment que la série de Hilbert pour l'espace des harmoniques diagonaux est égale à une fonction génératrice bivariée sur l'ensemble des matrices de Tesler triangulaires supérieures dont la somme de chaque équerre vaut un. On donne une interprétation combinatoire de la fonction génératrice de Haglund pour $q=1$ et on prouve le cas correspondant de la conjecture dans le cas des fonctions de stationnement (prouvé d'abord par Garsia et Haiman). On discute aussi d'une preuve possible du cas $t=0$, cohérente avec cette interprétation combinatoire. On conclut en discutant brièvement les raffinements possibles de la conjecture des fonctions de stationnement de ce point de vue. $\\textbf{Note ajoutée sur épreuve}$: j'ai trouvé depuis cet article une preuve du cas $t=0$ et conjecturé des raffinements possibles. Ces résultats seront probablement présentés dans un article ultérieur."}],"externalReference":[],"extraInfo":[],"format":[],"fulltext":[],"id":"50|06cdd3ff4700::93859bd27121c3ee7c6ee4bfb1790cba","instance":[{"accessright":{"classid":"OPEN","classname":"Open Access","schemeid":"dnet:access_modes","schemename":"dnet:access_modes"},"alternateIdentifier":[{"dataInfo":{"deletedbyinference":false,"inferenceprovenance":"","inferred":false,"invisible":false,"provenanceaction":{"classid":"sysimport:crosswalk:repository","classname":"Harvested","schemeid":"dnet:provenanceActions","schemename":"dnet:provenanceActions"},"trust":"0.9"},"qualifier":{"classid":"doi","classname":"Digital Object Identifier","schemeid":"dnet:pid_types","schemename":"dnet:pid_types"},"value":"10.46298/dmtcs.2940"}],"collectedfrom":{"key":"10|openaire____::6824b298c96ba906a3e6a70593affbf5","value":"Episciences"},"dateofacceptance":{"dataInfo":{"deletedbyinference":false,"inferenceprovenance":"","inferred":false,"invisible":false,"provenanceaction":{"classid":"sysimport:crosswalk:repository","classname":"Harvested","schemeid":"dnet:provenanceActions","schemename":"dnet:provenanceActions"},"trust":"0.9"},"value":"2011-01-01"},"distributionlocation":"","hostedby":{"key":"10|openaire____::6824b298c96ba906a3e6a70593affbf5","value":"Episciences"},"instancetype":{"classid":"0001","classname":"Article","schemeid":"dnet:publication_resource","schemename":"dnet:publication_resource"},"pid":[],"refereed":{"classid":"0000","classname":"Unknown","schemeid":"dnet:review_levels","schemename":"dnet:review_levels"},"url":["https://dmtcs.episciences.org/2940"]}],"language":{"classid":"eng","classname":"English","schemeid":"dnet:languages","schemename":"dnet:languages"},"lastupdatetimestamp":1638458725892,"oaiprovenance":{"originDescription":{"altered":true,"baseURL":"https%3A%2F%2Foai.episciences.org%2F","datestamp":"2011-01-01","harvestDate":"2021-11-09T19:00:42.081Z","identifier":"oai:episciences.org:dmtcs:2940","metadataNamespace":"http://www.openarchives.org/OAI/2.0/oai_dc/"}},"originalId":["50|06cdd3ff4700::93859bd27121c3ee7c6ee4bfb1790cba","oai:episciences.org:dmtcs:2940"],"pid":[],"relevantdate":[],"resourcetype":{"classid":"UNKNOWN","classname":"Unknown","schemeid":"dnet:dataCite_resource","schemename":"dnet:dataCite_resource"},"resulttype":{"classid":"publication","classname":"publication","schemeid":"dnet:result_typologies","schemename":"dnet:result_typologies"},"source":[{"dataInfo":{"deletedbyinference":false,"inferenceprovenance":"","inferred":false,"invisible":false,"provenanceaction":{"classid":"sysimport:crosswalk:repository","classname":"Harvested","schemeid":"dnet:provenanceActions","schemename":"dnet:provenanceActions"},"trust":"0.9"},"value":"ISSN: 1365-8050"},{"dataInfo":{"deletedbyinference":false,"inferenceprovenance":"","inferred":false,"invisible":false,"provenanceaction":{"classid":"sysimport:crosswalk:repository","classname":"Harvested","schemeid":"dnet:provenanceActions","schemename":"dnet:provenanceActions"},"trust":"0.9"},"value":"Discrete Mathematics & Theoretical Computer Science"},{"dataInfo":{"deletedbyinference":false,"inferenceprovenance":"","inferred":false,"invisible":false,"provenanceaction":{"classid":"sysimport:crosswalk:repository","classname":"Harvested","schemeid":"dnet:provenanceActions","schemename":"dnet:provenanceActions"},"trust":"0.9"},"value":"Episciences.org"},{"dataInfo":{"deletedbyinference":false,"inferenceprovenance":"","inferred":false,"invisible":false,"provenanceaction":{"classid":"sysimport:crosswalk:repository","classname":"Harvested","schemeid":"dnet:provenanceActions","schemename":"dnet:provenanceActions"},"trust":"0.9"},"value":"dmtcs:2940 - Discrete Mathematics & Theoretical Computer Science, 2011-01-01, DMTCS Proceedings vol. AO, 23rd International Conference on Formal Power Series and Algebraic Combinatorics (FPSAC 2011)"}],"subject":[{"dataInfo":{"deletedbyinference":false,"inferenceprovenance":"","inferred":false,"invisible":false,"provenanceaction":{"classid":"sysimport:crosswalk:repository","classname":"Harvested","schemeid":"dnet:provenanceActions","schemename":"dnet:provenanceActions"},"trust":"0.9"},"qualifier":{"classid":"keyword","classname":"keyword","schemeid":"dnet:subject_classification_typologies","schemename":"dnet:subject_classification_typologies"},"value":"parking function"},{"dataInfo":{"deletedbyinference":false,"inferenceprovenance":"","inferred":false,"invisible":false,"provenanceaction":{"classid":"sysimport:crosswalk:repository","classname":"Harvested","schemeid":"dnet:provenanceActions","schemename":"dnet:provenanceActions"},"trust":"0.9"},"qualifier":{"classid":"keyword","classname":"keyword","schemeid":"dnet:subject_classification_typologies","schemename":"dnet:subject_classification_typologies"},"value":"Hilbert series"},{"dataInfo":{"deletedbyinference":false,"inferenceprovenance":"","inferred":false,"invisible":false,"provenanceaction":{"classid":"sysimport:crosswalk:repository","classname":"Harvested","schemeid":"dnet:provenanceActions","schemename":"dnet:provenanceActions"},"trust":"0.9"},"qualifier":{"classid":"keyword","classname":"keyword","schemeid":"dnet:subject_classification_typologies","schemename":"dnet:subject_classification_typologies"},"value":"diagonal harmonics"},{"dataInfo":{"deletedbyinference":false,"inferenceprovenance":"","inferred":false,"invisible":false,"provenanceaction":{"classid":"sysimport:crosswalk:repository","classname":"Harvested","schemeid":"dnet:provenanceActions","schemename":"dnet:provenanceActions"},"trust":"0.9"},"qualifier":{"classid":"keyword","classname":"keyword","schemeid":"dnet:subject_classification_typologies","schemename":"dnet:subject_classification_typologies"},"value":"[MATH.MATH-CO] Mathematics [math]/Combinatorics [math.CO]"},{"dataInfo":{"deletedbyinference":false,"inferenceprovenance":"","inferred":false,"invisible":false,"provenanceaction":{"classid":"sysimport:crosswalk:repository","classname":"Harvested","schemeid":"dnet:provenanceActions","schemename":"dnet:provenanceActions"},"trust":"0.9"},"qualifier":{"classid":"keyword","classname":"keyword","schemeid":"dnet:subject_classification_typologies","schemename":"dnet:subject_classification_typologies"},"value":"[INFO.INFO-DM] Computer Science [cs]/Discrete Mathematics [cs.DM]"}],"title":[{"dataInfo":{"deletedbyinference":false,"inferenceprovenance":"","inferred":false,"invisible":false,"provenanceaction":{"classid":"sysimport:crosswalk:repository","classname":"Harvested","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":"Special Cases of the Parking Functions Conjecture and Upper-Triangular Matrices"}]} +{"author":[{"fullname":"Ward, Mark Daniel","name":"Mark Daniel","pid":[],"rank":1,"surname":"Ward"},{"fullname":"Szpankowski, Wojciech","name":"Wojciech","pid":[],"rank":2,"surname":"Szpankowski"}],"bestaccessright":{"classid":"OPEN","classname":"Open Access","schemeid":"dnet:access_modes","schemename":"dnet:access_modes"},"collectedfrom":[{"key":"10|openaire____::6824b298c96ba906a3e6a70593affbf5","value":"Episciences"}],"context":[],"contributor":[{"dataInfo":{"deletedbyinference":false,"inferenceprovenance":"","inferred":false,"invisible":false,"provenanceaction":{"classid":"sysimport:crosswalk:repository","classname":"Harvested","schemeid":"dnet:provenanceActions","schemename":"dnet:provenanceActions"},"trust":"0.9"},"value":"Coordination Episciences iam"}],"country":[],"coverage":[],"dataInfo":{"deletedbyinference":true,"inferenceprovenance":"","inferred":false,"invisible":false,"provenanceaction":{"classid":"sysimport:crosswalk:repository","classname":"Harvested","schemeid":"dnet:provenanceActions","schemename":"dnet:provenanceActions"},"trust":"0.9"},"dateofacceptance":{"dataInfo":{"deletedbyinference":false,"inferenceprovenance":"","inferred":false,"invisible":false,"provenanceaction":{"classid":"sysimport:crosswalk:repository","classname":"Harvested","schemeid":"dnet:provenanceActions","schemename":"dnet:provenanceActions"},"trust":"0.9"},"value":"2005-01-01"},"dateofcollection":"2021-11-09T19:00:34.758Z","dateoftransformation":"2021-11-09T19:50:55.725Z","description":[{"dataInfo":{"deletedbyinference":false,"inferenceprovenance":"","inferred":false,"invisible":false,"provenanceaction":{"classid":"sysimport:crosswalk:repository","classname":"Harvested","schemeid":"dnet:provenanceActions","schemename":"dnet:provenanceActions"},"trust":"0.9"},"value":"In a suffix tree, the multiplicity matching parameter (MMP) $M_n$ is the number of leaves in the subtree rooted at the branching point of the $(n+1)$st insertion. Equivalently, the MMP is the number of pointers into the database in the Lempel-Ziv '77 data compression algorithm. We prove that the MMP asymptotically follows the logarithmic series distribution plus some fluctuations. In the proof we compare the distribution of the MMP in suffix trees to its distribution in tries built over independent strings. Our results are derived by both probabilistic and analytic techniques of the analysis of algorithms. In particular, we utilize combinatorics on words, bivariate generating functions, pattern matching, recurrence relations, analytical poissonization and depoissonization, the Mellin transform, and complex analysis."}],"externalReference":[],"extraInfo":[],"format":[],"fulltext":[],"id":"50|06cdd3ff4700::ff21e3c55d527fa7db171137c5fd1f1f","instance":[{"accessright":{"classid":"OPEN","classname":"Open Access","schemeid":"dnet:access_modes","schemename":"dnet:access_modes"},"alternateIdentifier":[{"dataInfo":{"deletedbyinference":false,"inferenceprovenance":"","inferred":false,"invisible":false,"provenanceaction":{"classid":"sysimport:crosswalk:repository","classname":"Harvested","schemeid":"dnet:provenanceActions","schemename":"dnet:provenanceActions"},"trust":"0.9"},"qualifier":{"classid":"doi","classname":"Digital Object Identifier","schemeid":"dnet:pid_types","schemename":"dnet:pid_types"},"value":"10.46298/dmtcs.3387"}],"collectedfrom":{"key":"10|openaire____::6824b298c96ba906a3e6a70593affbf5","value":"Episciences"},"dateofacceptance":{"dataInfo":{"deletedbyinference":false,"inferenceprovenance":"","inferred":false,"invisible":false,"provenanceaction":{"classid":"sysimport:crosswalk:repository","classname":"Harvested","schemeid":"dnet:provenanceActions","schemename":"dnet:provenanceActions"},"trust":"0.9"},"value":"2005-01-01"},"distributionlocation":"","hostedby":{"key":"10|openaire____::6824b298c96ba906a3e6a70593affbf5","value":"Episciences"},"instancetype":{"classid":"0001","classname":"Article","schemeid":"dnet:publication_resource","schemename":"dnet:publication_resource"},"pid":[],"refereed":{"classid":"0000","classname":"Unknown","schemeid":"dnet:review_levels","schemename":"dnet:review_levels"},"url":["https://dmtcs.episciences.org/3387"]}],"language":{"classid":"eng","classname":"English","schemeid":"dnet:languages","schemename":"dnet:languages"},"lastupdatetimestamp":1638458734473,"oaiprovenance":{"originDescription":{"altered":true,"baseURL":"https%3A%2F%2Foai.episciences.org%2F","datestamp":"2005-01-01","harvestDate":"2021-11-09T19:00:34.758Z","identifier":"oai:episciences.org:dmtcs:3387","metadataNamespace":"http://www.openarchives.org/OAI/2.0/oai_dc/"}},"originalId":["50|06cdd3ff4700::ff21e3c55d527fa7db171137c5fd1f1f","oai:episciences.org:dmtcs:3387"],"pid":[],"relevantdate":[],"resourcetype":{"classid":"UNKNOWN","classname":"Unknown","schemeid":"dnet:dataCite_resource","schemename":"dnet:dataCite_resource"},"resulttype":{"classid":"publication","classname":"publication","schemeid":"dnet:result_typologies","schemename":"dnet:result_typologies"},"source":[{"dataInfo":{"deletedbyinference":false,"inferenceprovenance":"","inferred":false,"invisible":false,"provenanceaction":{"classid":"sysimport:crosswalk:repository","classname":"Harvested","schemeid":"dnet:provenanceActions","schemename":"dnet:provenanceActions"},"trust":"0.9"},"value":"ISSN: 1365-8050"},{"dataInfo":{"deletedbyinference":false,"inferenceprovenance":"","inferred":false,"invisible":false,"provenanceaction":{"classid":"sysimport:crosswalk:repository","classname":"Harvested","schemeid":"dnet:provenanceActions","schemename":"dnet:provenanceActions"},"trust":"0.9"},"value":"Discrete Mathematics & Theoretical Computer Science"},{"dataInfo":{"deletedbyinference":false,"inferenceprovenance":"","inferred":false,"invisible":false,"provenanceaction":{"classid":"sysimport:crosswalk:repository","classname":"Harvested","schemeid":"dnet:provenanceActions","schemename":"dnet:provenanceActions"},"trust":"0.9"},"value":"Episciences.org"},{"dataInfo":{"deletedbyinference":false,"inferenceprovenance":"","inferred":false,"invisible":false,"provenanceaction":{"classid":"sysimport:crosswalk:repository","classname":"Harvested","schemeid":"dnet:provenanceActions","schemename":"dnet:provenanceActions"},"trust":"0.9"},"value":"dmtcs:3387 - Discrete Mathematics & Theoretical Computer Science, 2005-01-01, DMTCS Proceedings vol. AD, International Conference on Analysis of Algorithms"}],"subject":[{"dataInfo":{"deletedbyinference":false,"inferenceprovenance":"","inferred":false,"invisible":false,"provenanceaction":{"classid":"sysimport:crosswalk:repository","classname":"Harvested","schemeid":"dnet:provenanceActions","schemename":"dnet:provenanceActions"},"trust":"0.9"},"qualifier":{"classid":"keyword","classname":"keyword","schemeid":"dnet:subject_classification_typologies","schemename":"dnet:subject_classification_typologies"},"value":"data compression"},{"dataInfo":{"deletedbyinference":false,"inferenceprovenance":"","inferred":false,"invisible":false,"provenanceaction":{"classid":"sysimport:crosswalk:repository","classname":"Harvested","schemeid":"dnet:provenanceActions","schemename":"dnet:provenanceActions"},"trust":"0.9"},"qualifier":{"classid":"keyword","classname":"keyword","schemeid":"dnet:subject_classification_typologies","schemename":"dnet:subject_classification_typologies"},"value":"complex asymptotics"},{"dataInfo":{"deletedbyinference":false,"inferenceprovenance":"","inferred":false,"invisible":false,"provenanceaction":{"classid":"sysimport:crosswalk:repository","classname":"Harvested","schemeid":"dnet:provenanceActions","schemename":"dnet:provenanceActions"},"trust":"0.9"},"qualifier":{"classid":"keyword","classname":"keyword","schemeid":"dnet:subject_classification_typologies","schemename":"dnet:subject_classification_typologies"},"value":"suffix trees"},{"dataInfo":{"deletedbyinference":false,"inferenceprovenance":"","inferred":false,"invisible":false,"provenanceaction":{"classid":"sysimport:crosswalk:repository","classname":"Harvested","schemeid":"dnet:provenanceActions","schemename":"dnet:provenanceActions"},"trust":"0.9"},"qualifier":{"classid":"keyword","classname":"keyword","schemeid":"dnet:subject_classification_typologies","schemename":"dnet:subject_classification_typologies"},"value":"combinatorics on words"},{"dataInfo":{"deletedbyinference":false,"inferenceprovenance":"","inferred":false,"invisible":false,"provenanceaction":{"classid":"sysimport:crosswalk:repository","classname":"Harvested","schemeid":"dnet:provenanceActions","schemename":"dnet:provenanceActions"},"trust":"0.9"},"qualifier":{"classid":"keyword","classname":"keyword","schemeid":"dnet:subject_classification_typologies","schemename":"dnet:subject_classification_typologies"},"value":"pattern matching"},{"dataInfo":{"deletedbyinference":false,"inferenceprovenance":"","inferred":false,"invisible":false,"provenanceaction":{"classid":"sysimport:crosswalk:repository","classname":"Harvested","schemeid":"dnet:provenanceActions","schemename":"dnet:provenanceActions"},"trust":"0.9"},"qualifier":{"classid":"keyword","classname":"keyword","schemeid":"dnet:subject_classification_typologies","schemename":"dnet:subject_classification_typologies"},"value":"autocorrelation polynomial"},{"dataInfo":{"deletedbyinference":false,"inferenceprovenance":"","inferred":false,"invisible":false,"provenanceaction":{"classid":"sysimport:crosswalk:repository","classname":"Harvested","schemeid":"dnet:provenanceActions","schemename":"dnet:provenanceActions"},"trust":"0.9"},"qualifier":{"classid":"keyword","classname":"keyword","schemeid":"dnet:subject_classification_typologies","schemename":"dnet:subject_classification_typologies"},"value":"[INFO.INFO-DS] Computer Science [cs]/Data Structures and Algorithms [cs.DS]"},{"dataInfo":{"deletedbyinference":false,"inferenceprovenance":"","inferred":false,"invisible":false,"provenanceaction":{"classid":"sysimport:crosswalk:repository","classname":"Harvested","schemeid":"dnet:provenanceActions","schemename":"dnet:provenanceActions"},"trust":"0.9"},"qualifier":{"classid":"keyword","classname":"keyword","schemeid":"dnet:subject_classification_typologies","schemename":"dnet:subject_classification_typologies"},"value":"[INFO.INFO-DM] Computer Science [cs]/Discrete Mathematics [cs.DM]"},{"dataInfo":{"deletedbyinference":false,"inferenceprovenance":"","inferred":false,"invisible":false,"provenanceaction":{"classid":"sysimport:crosswalk:repository","classname":"Harvested","schemeid":"dnet:provenanceActions","schemename":"dnet:provenanceActions"},"trust":"0.9"},"qualifier":{"classid":"keyword","classname":"keyword","schemeid":"dnet:subject_classification_typologies","schemename":"dnet:subject_classification_typologies"},"value":"[MATH.MATH-CO] Mathematics [math]/Combinatorics [math.CO]"},{"dataInfo":{"deletedbyinference":false,"inferenceprovenance":"","inferred":false,"invisible":false,"provenanceaction":{"classid":"sysimport:crosswalk:repository","classname":"Harvested","schemeid":"dnet:provenanceActions","schemename":"dnet:provenanceActions"},"trust":"0.9"},"qualifier":{"classid":"keyword","classname":"keyword","schemeid":"dnet:subject_classification_typologies","schemename":"dnet:subject_classification_typologies"},"value":"[INFO.INFO-CG] Computer Science [cs]/Computational Geometry [cs.CG]"}],"title":[{"dataInfo":{"deletedbyinference":false,"inferenceprovenance":"","inferred":false,"invisible":false,"provenanceaction":{"classid":"sysimport:crosswalk:repository","classname":"Harvested","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":"Analysis of the multiplicity matching parameter in suffix trees"}]} +{"author":[{"fullname":"Södergård, Caj","name":"Caj","pid":[],"rank":1,"surname":"Södergård"}],"bestaccessright":{"classid":"RESTRICTED","classname":"Restricted","schemeid":"dnet:access_modes","schemename":"dnet:access_modes"},"collectedfrom":[{"key":"10|openaire____::4692342f0992d91f9e705c26959f09e0","value":"VTT Research Information System"}],"context":[],"contributor":[],"country":[],"coverage":[],"dataInfo":{"deletedbyinference":true,"inferenceprovenance":"","inferred":false,"invisible":false,"provenanceaction":{"classid":"sysimport:crosswalk:repository","classname":"Harvested","schemeid":"dnet:provenanceActions","schemename":"dnet:provenanceActions"},"trust":"0.9"},"dateofacceptance":{"dataInfo":{"deletedbyinference":false,"inferenceprovenance":"","inferred":false,"invisible":false,"provenanceaction":{"classid":"sysimport:crosswalk:repository","classname":"Harvested","schemeid":"dnet:provenanceActions","schemename":"dnet:provenanceActions"},"trust":"0.9"},"value":"1989-01-01"},"dateofcollection":"2021-11-06T12:40:33.938Z","dateoftransformation":"2021-11-06T13:13:36.91Z","description":[],"externalReference":[],"extraInfo":[],"format":[],"fulltext":[],"id":"50|355e65625b88::046477dc24819c5f1453166aa7bfb75e","instance":[{"accessright":{"classid":"RESTRICTED","classname":"Restricted","schemeid":"dnet:access_modes","schemename":"dnet:access_modes"},"alternateIdentifier":[],"collectedfrom":{"key":"10|openaire____::4692342f0992d91f9e705c26959f09e0","value":"VTT Research Information System"},"dateofacceptance":{"dataInfo":{"deletedbyinference":false,"inferenceprovenance":"","inferred":false,"invisible":false,"provenanceaction":{"classid":"sysimport:crosswalk:repository","classname":"Harvested","schemeid":"dnet:provenanceActions","schemename":"dnet:provenanceActions"},"trust":"0.9"},"value":"1989-01-01"},"distributionlocation":"","hostedby":{"key":"10|openaire____::4692342f0992d91f9e705c26959f09e0","value":"VTT Research Information System"},"instancetype":{"classid":"0004","classname":"Conference object","schemeid":"dnet:publication_resource","schemename":"dnet:publication_resource"},"pid":[],"refereed":{"classid":"0000","classname":"Unknown","schemeid":"dnet:review_levels","schemename":"dnet:review_levels"},"url":["https://cris.vtt.fi/en/publications/42136eb0-696d-4861-b587-3b451a46a914"]}],"language":{"classid":"fin","classname":"Finnish","schemeid":"dnet:languages","schemename":"dnet:languages"},"lastupdatetimestamp":1638458015650,"oaiprovenance":{"originDescription":{"altered":true,"baseURL":"https%3A%2F%2Fcris.vtt.fi%2Fws%2Foai","datestamp":"2019-06-19T05:36:38Z","harvestDate":"2021-11-06T12:40:33.938Z","identifier":"oai:cris.vtt.fi:publications/42136eb0-696d-4861-b587-3b451a46a914","metadataNamespace":"http://www.openarchives.org/OAI/2.0/oai_dc/"}},"originalId":["50|355e65625b88::046477dc24819c5f1453166aa7bfb75e","oai:cris.vtt.fi:publications/42136eb0-696d-4861-b587-3b451a46a914"],"pid":[],"relevantdate":[],"resourcetype":{"classid":"UNKNOWN","classname":"Unknown","schemeid":"dnet:dataCite_resource","schemename":"dnet:dataCite_resource"},"resulttype":{"classid":"publication","classname":"publication","schemeid":"dnet:result_typologies","schemename":"dnet:result_typologies"},"source":[{"dataInfo":{"deletedbyinference":false,"inferenceprovenance":"","inferred":false,"invisible":false,"provenanceaction":{"classid":"sysimport:crosswalk:repository","classname":"Harvested","schemeid":"dnet:provenanceActions","schemename":"dnet:provenanceActions"},"trust":"0.9"},"value":"Södergård , C 1989 , ' Telefax ja telefoto ' , Kehittyvä tiedonsiirto graafisessa yrityksessä , Helsinki , Finland , 29/05/89 - 30/05/89 ."}],"subject":[],"title":[{"dataInfo":{"deletedbyinference":false,"inferenceprovenance":"","inferred":false,"invisible":false,"provenanceaction":{"classid":"sysimport:crosswalk:repository","classname":"Harvested","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":"Telefax ja telefoto"}]} +{"author":[{"fullname":"Antikainen, Maria","name":"Maria","pid":[],"rank":1,"surname":"Antikainen"},{"fullname":"Niemelä, Marketta","name":"Marketta","pid":[],"rank":2,"surname":"Niemelä"}],"bestaccessright":{"classid":"CLOSED","classname":"Closed Access","schemeid":"dnet:access_modes","schemename":"dnet:access_modes"},"collectedfrom":[{"key":"10|openaire____::4692342f0992d91f9e705c26959f09e0","value":"VTT Research Information System"}],"context":[],"contributor":[],"country":[],"coverage":[],"dataInfo":{"deletedbyinference":true,"inferenceprovenance":"","inferred":false,"invisible":false,"provenanceaction":{"classid":"sysimport:crosswalk:repository","classname":"Harvested","schemeid":"dnet:provenanceActions","schemename":"dnet:provenanceActions"},"trust":"0.9"},"dateofacceptance":{"dataInfo":{"deletedbyinference":false,"inferenceprovenance":"","inferred":false,"invisible":false,"provenanceaction":{"classid":"sysimport:crosswalk:repository","classname":"Harvested","schemeid":"dnet:provenanceActions","schemename":"dnet:provenanceActions"},"trust":"0.9"},"value":"2017-01-01"},"dateofcollection":"2021-11-06T12:40:11.372Z","dateoftransformation":"2021-11-06T15:30:47.295Z","description":[{"dataInfo":{"deletedbyinference":false,"inferenceprovenance":"","inferred":false,"invisible":false,"provenanceaction":{"classid":"sysimport:crosswalk:repository","classname":"Harvested","schemeid":"dnet:provenanceActions","schemename":"dnet:provenanceActions"},"trust":"0.9"},"value":"Local food supports local finance, employment and cultural traditions. Local food producers often have limited resources to invest in R&D, and their risk-taking ability is low. Earlier studies in the online community context indicate that utilising the user's creativity and innovation capability has a great deal of potential for new product development and service design. For local food producers, social media offers cost-efficient opportunities for involving customers in product and service development. The aim of the study is to explore the potential of a co-creation approach for local food producers and how to engage consumers in that co-creation. The study is dyadic, taking both the consumers' and producers' perspectives. The results indicate that consumers seem to be interested in having long-term relationships with producers. Their motivations to participate in co-creation processes were found to be mostly related to the possibility of producing better products and of learning and gaining new insights. The producers who participated in our study have already taken the first steps in using social media, and the next logical step would be utilising social media in the co-creation process."}],"externalReference":[],"extraInfo":[],"format":[],"fulltext":[],"id":"50|355e65625b88::38d0ab3b2212878dee7072170f1561ee","instance":[{"accessright":{"classid":"CLOSED","classname":"Closed Access","schemeid":"dnet:access_modes","schemename":"dnet:access_modes"},"alternateIdentifier":[{"dataInfo":{"deletedbyinference":false,"inferenceprovenance":"","inferred":false,"invisible":false,"provenanceaction":{"classid":"sysimport:crosswalk:repository","classname":"Harvested","schemeid":"dnet:provenanceActions","schemename":"dnet:provenanceActions"},"trust":"0.9"},"qualifier":{"classid":"doi","classname":"Digital Object Identifier","schemeid":"dnet:pid_types","schemename":"dnet:pid_types"},"value":"10.1504/ijtmkt.2017.081507"}],"collectedfrom":{"key":"10|openaire____::4692342f0992d91f9e705c26959f09e0","value":"VTT Research Information System"},"dateofacceptance":{"dataInfo":{"deletedbyinference":false,"inferenceprovenance":"","inferred":false,"invisible":false,"provenanceaction":{"classid":"sysimport:crosswalk:repository","classname":"Harvested","schemeid":"dnet:provenanceActions","schemename":"dnet:provenanceActions"},"trust":"0.9"},"value":"2017-01-01"},"distributionlocation":"","hostedby":{"key":"10|openaire____::4692342f0992d91f9e705c26959f09e0","value":"VTT Research Information System"},"instancetype":{"classid":"0001","classname":"Article","schemeid":"dnet:publication_resource","schemename":"dnet:publication_resource"},"pid":[],"refereed":{"classid":"0000","classname":"Unknown","schemeid":"dnet:review_levels","schemename":"dnet:review_levels"},"url":["https://cris.vtt.fi/en/publications/44aa6ac9-4763-4cef-a683-220dbcb02712"]}],"language":{"classid":"eng","classname":"English","schemeid":"dnet:languages","schemename":"dnet:languages"},"lastupdatetimestamp":1638458079051,"oaiprovenance":{"originDescription":{"altered":true,"baseURL":"https%3A%2F%2Fcris.vtt.fi%2Fws%2Foai","datestamp":"2021-10-22T11:41:35Z","harvestDate":"2021-11-06T12:40:11.372Z","identifier":"oai:cris.vtt.fi:publications/44aa6ac9-4763-4cef-a683-220dbcb02712","metadataNamespace":"http://www.openarchives.org/OAI/2.0/oai_dc/"}},"originalId":["oai:cris.vtt.fi:publications/44aa6ac9-4763-4cef-a683-220dbcb02712","50|355e65625b88::38d0ab3b2212878dee7072170f1561ee"],"pid":[],"relevantdate":[],"resourcetype":{"classid":"UNKNOWN","classname":"Unknown","schemeid":"dnet:dataCite_resource","schemename":"dnet:dataCite_resource"},"resulttype":{"classid":"publication","classname":"publication","schemeid":"dnet:result_typologies","schemename":"dnet:result_typologies"},"source":[{"dataInfo":{"deletedbyinference":false,"inferenceprovenance":"","inferred":false,"invisible":false,"provenanceaction":{"classid":"sysimport:crosswalk:repository","classname":"Harvested","schemeid":"dnet:provenanceActions","schemename":"dnet:provenanceActions"},"trust":"0.9"},"value":"Antikainen , M & Niemelä , M 2017 , ' How to co-create local food products with consumers? ' , International Journal of Technology Marketing , vol. 12 , no. 1 , pp. 71-89 . https://doi.org/10.1504/IJTMKT.2017.081507"}],"subject":[{"dataInfo":{"deletedbyinference":false,"inferenceprovenance":"","inferred":false,"invisible":false,"provenanceaction":{"classid":"sysimport:crosswalk:repository","classname":"Harvested","schemeid":"dnet:provenanceActions","schemename":"dnet:provenanceActions"},"trust":"0.9"},"qualifier":{"classid":"keyword","classname":"keyword","schemeid":"dnet:result_subject","schemename":"dnet:result_subject"},"value":"co-creation"},{"dataInfo":{"deletedbyinference":false,"inferenceprovenance":"","inferred":false,"invisible":false,"provenanceaction":{"classid":"sysimport:crosswalk:repository","classname":"Harvested","schemeid":"dnet:provenanceActions","schemename":"dnet:provenanceActions"},"trust":"0.9"},"qualifier":{"classid":"keyword","classname":"keyword","schemeid":"dnet:result_subject","schemename":"dnet:result_subject"},"value":"local food"},{"dataInfo":{"deletedbyinference":false,"inferenceprovenance":"","inferred":false,"invisible":false,"provenanceaction":{"classid":"sysimport:crosswalk:repository","classname":"Harvested","schemeid":"dnet:provenanceActions","schemename":"dnet:provenanceActions"},"trust":"0.9"},"qualifier":{"classid":"keyword","classname":"keyword","schemeid":"dnet:result_subject","schemename":"dnet:result_subject"},"value":"new product development"},{"dataInfo":{"deletedbyinference":false,"inferenceprovenance":"","inferred":false,"invisible":false,"provenanceaction":{"classid":"sysimport:crosswalk:repository","classname":"Harvested","schemeid":"dnet:provenanceActions","schemename":"dnet:provenanceActions"},"trust":"0.9"},"qualifier":{"classid":"keyword","classname":"keyword","schemeid":"dnet:result_subject","schemename":"dnet:result_subject"},"value":"open innovation"},{"dataInfo":{"deletedbyinference":false,"inferenceprovenance":"","inferred":false,"invisible":false,"provenanceaction":{"classid":"sysimport:crosswalk:repository","classname":"Harvested","schemeid":"dnet:provenanceActions","schemename":"dnet:provenanceActions"},"trust":"0.9"},"qualifier":{"classid":"keyword","classname":"keyword","schemeid":"dnet:result_subject","schemename":"dnet:result_subject"},"value":"social media"},{"dataInfo":{"deletedbyinference":false,"inferenceprovenance":"","inferred":false,"invisible":false,"provenanceaction":{"classid":"sysimport:crosswalk:repository","classname":"Harvested","schemeid":"dnet:provenanceActions","schemename":"dnet:provenanceActions"},"trust":"0.9"},"qualifier":{"classid":"keyword","classname":"keyword","schemeid":"dnet:result_subject","schemename":"dnet:result_subject"},"value":"case study"},{"dataInfo":{"deletedbyinference":false,"inferenceprovenance":"","inferred":false,"invisible":false,"provenanceaction":{"classid":"sysimport:crosswalk:repository","classname":"Harvested","schemeid":"dnet:provenanceActions","schemename":"dnet:provenanceActions"},"trust":"0.9"},"qualifier":{"classid":"keyword","classname":"keyword","schemeid":"dnet:result_subject","schemename":"dnet:result_subject"},"value":"consumer"},{"dataInfo":{"deletedbyinference":false,"inferenceprovenance":"","inferred":false,"invisible":false,"provenanceaction":{"classid":"sysimport:crosswalk:repository","classname":"Harvested","schemeid":"dnet:provenanceActions","schemename":"dnet:provenanceActions"},"trust":"0.9"},"qualifier":{"classid":"keyword","classname":"keyword","schemeid":"dnet:result_subject","schemename":"dnet:result_subject"},"value":"co-development"},{"dataInfo":{"deletedbyinference":false,"inferenceprovenance":"","inferred":false,"invisible":false,"provenanceaction":{"classid":"sysimport:crosswalk:repository","classname":"Harvested","schemeid":"dnet:provenanceActions","schemename":"dnet:provenanceActions"},"trust":"0.9"},"qualifier":{"classid":"keyword","classname":"keyword","schemeid":"dnet:result_subject","schemename":"dnet:result_subject"},"value":"co-design"},{"dataInfo":{"deletedbyinference":false,"inferenceprovenance":"","inferred":false,"invisible":false,"provenanceaction":{"classid":"sysimport:crosswalk:repository","classname":"Harvested","schemeid":"dnet:provenanceActions","schemename":"dnet:provenanceActions"},"trust":"0.9"},"qualifier":{"classid":"keyword","classname":"keyword","schemeid":"dnet:result_subject","schemename":"dnet:result_subject"},"value":"user involvement"},{"dataInfo":{"deletedbyinference":false,"inferenceprovenance":"","inferred":false,"invisible":false,"provenanceaction":{"classid":"sysimport:crosswalk:repository","classname":"Harvested","schemeid":"dnet:provenanceActions","schemename":"dnet:provenanceActions"},"trust":"0.9"},"qualifier":{"classid":"keyword","classname":"keyword","schemeid":"dnet:result_subject","schemename":"dnet:result_subject"},"value":"sustainability"}],"title":[{"dataInfo":{"deletedbyinference":false,"inferenceprovenance":"","inferred":false,"invisible":false,"provenanceaction":{"classid":"sysimport:crosswalk:repository","classname":"Harvested","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":"How to co-create local food products with consumers?"}]} +{"author":[{"fullname":"Lehtinen, Pekka","name":"Pekka","pid":[],"rank":1,"surname":"Lehtinen"},{"fullname":"Sibakov, Juhani","name":"Juhani","pid":[],"rank":2,"surname":"Sibakov"}],"bestaccessright":{"classid":"RESTRICTED","classname":"Restricted","schemeid":"dnet:access_modes","schemename":"dnet:access_modes"},"collectedfrom":[{"key":"10|openaire____::4692342f0992d91f9e705c26959f09e0","value":"VTT Research Information System"}],"context":[],"contributor":[],"country":[],"coverage":[],"dataInfo":{"deletedbyinference":true,"inferenceprovenance":"","inferred":false,"invisible":false,"provenanceaction":{"classid":"sysimport:crosswalk:repository","classname":"Harvested","schemeid":"dnet:provenanceActions","schemename":"dnet:provenanceActions"},"trust":"0.9"},"dateofacceptance":{"dataInfo":{"deletedbyinference":false,"inferenceprovenance":"","inferred":false,"invisible":false,"provenanceaction":{"classid":"sysimport:crosswalk:repository","classname":"Harvested","schemeid":"dnet:provenanceActions","schemename":"dnet:provenanceActions"},"trust":"0.9"},"value":"2010-01-01"},"dateofcollection":"2021-11-06T12:47:29.271Z","dateoftransformation":"2021-11-06T16:36:12.322Z","description":[],"externalReference":[],"extraInfo":[],"format":[],"fulltext":[],"id":"50|355e65625b88::4d3f5bf7749b9a26c01e80f3dd36daef","instance":[{"accessright":{"classid":"RESTRICTED","classname":"Restricted","schemeid":"dnet:access_modes","schemename":"dnet:access_modes"},"alternateIdentifier":[],"collectedfrom":{"key":"10|openaire____::4692342f0992d91f9e705c26959f09e0","value":"VTT Research Information System"},"dateofacceptance":{"dataInfo":{"deletedbyinference":false,"inferenceprovenance":"","inferred":false,"invisible":false,"provenanceaction":{"classid":"sysimport:crosswalk:repository","classname":"Harvested","schemeid":"dnet:provenanceActions","schemename":"dnet:provenanceActions"},"trust":"0.9"},"value":"2010-01-01"},"distributionlocation":"","hostedby":{"key":"10|openaire____::4692342f0992d91f9e705c26959f09e0","value":"VTT Research Information System"},"instancetype":{"classid":"0001","classname":"Article","schemeid":"dnet:publication_resource","schemename":"dnet:publication_resource"},"pid":[],"refereed":{"classid":"0000","classname":"Unknown","schemeid":"dnet:review_levels","schemename":"dnet:review_levels"},"url":["https://cris.vtt.fi/en/publications/39400c55-6b86-4fd5-a380-622e887db9a5"]}],"language":{"classid":"fin","classname":"Finnish","schemeid":"dnet:languages","schemename":"dnet:languages"},"lastupdatetimestamp":1638458104266,"oaiprovenance":{"originDescription":{"altered":true,"baseURL":"https%3A%2F%2Fcris.vtt.fi%2Fws%2Foai","datestamp":"2021-11-03T06:19:09Z","harvestDate":"2021-11-06T12:47:29.271Z","identifier":"oai:cris.vtt.fi:publications/39400c55-6b86-4fd5-a380-622e887db9a5","metadataNamespace":"http://www.openarchives.org/OAI/2.0/oai_dc/"}},"originalId":["50|355e65625b88::4d3f5bf7749b9a26c01e80f3dd36daef","oai:cris.vtt.fi:publications/39400c55-6b86-4fd5-a380-622e887db9a5"],"pid":[],"relevantdate":[],"resourcetype":{"classid":"UNKNOWN","classname":"Unknown","schemeid":"dnet:dataCite_resource","schemename":"dnet:dataCite_resource"},"resulttype":{"classid":"publication","classname":"publication","schemeid":"dnet:result_typologies","schemename":"dnet:result_typologies"},"source":[{"dataInfo":{"deletedbyinference":false,"inferenceprovenance":"","inferred":false,"invisible":false,"provenanceaction":{"classid":"sysimport:crosswalk:repository","classname":"Harvested","schemeid":"dnet:provenanceActions","schemename":"dnet:provenanceActions"},"trust":"0.9"},"value":"Lehtinen , P & Sibakov , J 2010 , ' Enemmän kaurasta ' , Mallas ja Olut , vol. 2010 , no. 3 , pp. 84-87 ."}],"subject":[],"title":[{"dataInfo":{"deletedbyinference":false,"inferenceprovenance":"","inferred":false,"invisible":false,"provenanceaction":{"classid":"sysimport:crosswalk:repository","classname":"Harvested","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":"Enemmän kaurasta"},{"dataInfo":{"deletedbyinference":false,"inferenceprovenance":"","inferred":false,"invisible":false,"provenanceaction":{"classid":"sysimport:crosswalk:repository","classname":"Harvested","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":"More from oats"}]} +{"author":[{"fullname":"Ronkainen, Hannu","name":"Hannu","pid":[],"rank":1,"surname":"Ronkainen"},{"fullname":"Mellin, Joni","name":"Joni","pid":[],"rank":2,"surname":"Mellin"}],"bestaccessright":{"classid":"CLOSED","classname":"Closed Access","schemeid":"dnet:access_modes","schemename":"dnet:access_modes"},"collectedfrom":[{"key":"10|openaire____::4692342f0992d91f9e705c26959f09e0","value":"VTT Research Information System"}],"context":[],"contributor":[],"country":[],"coverage":[],"dataInfo":{"deletedbyinference":true,"inferenceprovenance":"","inferred":false,"invisible":false,"provenanceaction":{"classid":"sysimport:crosswalk:repository","classname":"Harvested","schemeid":"dnet:provenanceActions","schemename":"dnet:provenanceActions"},"trust":"0.9"},"dateofacceptance":{"dataInfo":{"deletedbyinference":false,"inferenceprovenance":"","inferred":false,"invisible":false,"provenanceaction":{"classid":"sysimport:crosswalk:repository","classname":"Harvested","schemeid":"dnet:provenanceActions","schemename":"dnet:provenanceActions"},"trust":"0.9"},"value":"2004-01-01"},"dateofcollection":"2021-11-06T12:44:56.68Z","dateoftransformation":"2021-11-06T17:00:20.868Z","description":[{"dataInfo":{"deletedbyinference":false,"inferenceprovenance":"","inferred":false,"invisible":false,"provenanceaction":{"classid":"sysimport:crosswalk:repository","classname":"Harvested","schemeid":"dnet:provenanceActions","schemename":"dnet:provenanceActions"},"trust":"0.9"},"value":"A floating capacitor with a MOS charge injector structure can be used as a nonvolatile memory. This type of memory device can be embedded into an analog MOS technology with capacitors. In this article the feasibility of the structure for small scale embedded memory is studied with 1.5µm analog ASIC molybdenum gate technology."}],"externalReference":[],"extraInfo":[],"format":[],"fulltext":[],"id":"50|355e65625b88::56bbb35df31e73991dee2df139a1cefa","instance":[{"accessright":{"classid":"CLOSED","classname":"Closed Access","schemeid":"dnet:access_modes","schemename":"dnet:access_modes"},"alternateIdentifier":[{"dataInfo":{"deletedbyinference":false,"inferenceprovenance":"","inferred":false,"invisible":false,"provenanceaction":{"classid":"sysimport:crosswalk:repository","classname":"Harvested","schemeid":"dnet:provenanceActions","schemename":"dnet:provenanceActions"},"trust":"0.9"},"qualifier":{"classid":"doi","classname":"Digital Object Identifier","schemeid":"dnet:pid_types","schemename":"dnet:pid_types"},"value":"10.1088/0031-8949/2004/t114/034"}],"collectedfrom":{"key":"10|openaire____::4692342f0992d91f9e705c26959f09e0","value":"VTT Research Information System"},"dateofacceptance":{"dataInfo":{"deletedbyinference":false,"inferenceprovenance":"","inferred":false,"invisible":false,"provenanceaction":{"classid":"sysimport:crosswalk:repository","classname":"Harvested","schemeid":"dnet:provenanceActions","schemename":"dnet:provenanceActions"},"trust":"0.9"},"value":"2004-01-01"},"distributionlocation":"","hostedby":{"key":"10|openaire____::4692342f0992d91f9e705c26959f09e0","value":"VTT Research Information System"},"instancetype":{"classid":"0001","classname":"Article","schemeid":"dnet:publication_resource","schemename":"dnet:publication_resource"},"pid":[],"refereed":{"classid":"0000","classname":"Unknown","schemeid":"dnet:review_levels","schemename":"dnet:review_levels"},"url":["https://cris.vtt.fi/en/publications/8f14e470-b1fe-46fd-bc71-207b65751a4c"]}],"language":{"classid":"eng","classname":"English","schemeid":"dnet:languages","schemename":"dnet:languages"},"lastupdatetimestamp":1638458115933,"oaiprovenance":{"originDescription":{"altered":true,"baseURL":"https%3A%2F%2Fcris.vtt.fi%2Fws%2Foai","datestamp":"2021-01-01T03:20:34Z","harvestDate":"2021-11-06T12:44:56.68Z","identifier":"oai:cris.vtt.fi:publications/8f14e470-b1fe-46fd-bc71-207b65751a4c","metadataNamespace":"http://www.openarchives.org/OAI/2.0/oai_dc/"}},"originalId":["oai:cris.vtt.fi:publications/8f14e470-b1fe-46fd-bc71-207b65751a4c","50|355e65625b88::56bbb35df31e73991dee2df139a1cefa"],"pid":[],"relevantdate":[],"resourcetype":{"classid":"UNKNOWN","classname":"Unknown","schemeid":"dnet:dataCite_resource","schemename":"dnet:dataCite_resource"},"resulttype":{"classid":"publication","classname":"publication","schemeid":"dnet:result_typologies","schemename":"dnet:result_typologies"},"source":[{"dataInfo":{"deletedbyinference":false,"inferenceprovenance":"","inferred":false,"invisible":false,"provenanceaction":{"classid":"sysimport:crosswalk:repository","classname":"Harvested","schemeid":"dnet:provenanceActions","schemename":"dnet:provenanceActions"},"trust":"0.9"},"value":"Ronkainen , H & Mellin , J 2004 , ' EEPROM cell design for molybdenum gate analog BECMOS process ' , Physica Scripta , vol. T114 , pp. 133 - 137 . https://doi.org/10.1088/0031-8949/2004/T114/034"}],"subject":[],"title":[{"dataInfo":{"deletedbyinference":false,"inferenceprovenance":"","inferred":false,"invisible":false,"provenanceaction":{"classid":"sysimport:crosswalk:repository","classname":"Harvested","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":"EEPROM cell design for molybdenum gate analog BECMOS process"}]} +{"author":[],"bestaccessright":{"classid":"RESTRICTED","classname":"Restricted","schemeid":"dnet:access_modes","schemename":"dnet:access_modes"},"collectedfrom":[{"key":"10|openaire____::4692342f0992d91f9e705c26959f09e0","value":"VTT Research Information System"}],"context":[],"contributor":[{"dataInfo":{"deletedbyinference":false,"inferenceprovenance":"","inferred":false,"invisible":false,"provenanceaction":{"classid":"sysimport:crosswalk:repository","classname":"Harvested","schemeid":"dnet:provenanceActions","schemename":"dnet:provenanceActions"},"trust":"0.9"},"value":"Vallinheimo, Eija"},{"dataInfo":{"deletedbyinference":false,"inferenceprovenance":"","inferred":false,"invisible":false,"provenanceaction":{"classid":"sysimport:crosswalk:repository","classname":"Harvested","schemeid":"dnet:provenanceActions","schemename":"dnet:provenanceActions"},"trust":"0.9"},"value":"Setälä, Tarja"},{"dataInfo":{"deletedbyinference":false,"inferenceprovenance":"","inferred":false,"invisible":false,"provenanceaction":{"classid":"sysimport:crosswalk:repository","classname":"Harvested","schemeid":"dnet:provenanceActions","schemename":"dnet:provenanceActions"},"trust":"0.9"},"value":"Sohlberg, Sakari"}],"country":[{"classid":"FI","classname":"Finland","dataInfo":{"deletedbyinference":false,"inferenceprovenance":"propagation","inferred":true,"invisible":false,"provenanceaction":{"classid":"country:instrepos","classname":"Inferred by OpenAIRE","schemeid":"dnet:provenanceActions","schemename":"dnet:provenanceActions"},"trust":"0.85"},"schemeid":"dnet:countries","schemename":"dnet:countries"}],"coverage":[],"dataInfo":{"deletedbyinference":false,"inferenceprovenance":"","inferred":false,"invisible":false,"provenanceaction":{"classid":"sysimport:crosswalk:repository","classname":"Harvested","schemeid":"dnet:provenanceActions","schemename":"dnet:provenanceActions"},"trust":"0.9"},"dateofacceptance":{"dataInfo":{"deletedbyinference":false,"inferenceprovenance":"","inferred":false,"invisible":false,"provenanceaction":{"classid":"sysimport:crosswalk:repository","classname":"Harvested","schemeid":"dnet:provenanceActions","schemename":"dnet:provenanceActions"},"trust":"0.9"},"value":"2002-01-01"},"dateofcollection":"2021-11-06T12:47:04.287Z","dateoftransformation":"2021-11-06T18:34:59.086Z","description":[],"externalReference":[],"extraInfo":[],"format":[],"fulltext":[],"id":"50|355e65625b88::76e3f831b17a51b6c2c5d072469c7587","instance":[{"accessright":{"classid":"RESTRICTED","classname":"Restricted","schemeid":"dnet:access_modes","schemename":"dnet:access_modes"},"alternateIdentifier":[],"collectedfrom":{"key":"10|openaire____::4692342f0992d91f9e705c26959f09e0","value":"VTT Research Information System"},"dateofacceptance":{"dataInfo":{"deletedbyinference":false,"inferenceprovenance":"","inferred":false,"invisible":false,"provenanceaction":{"classid":"sysimport:crosswalk:repository","classname":"Harvested","schemeid":"dnet:provenanceActions","schemename":"dnet:provenanceActions"},"trust":"0.9"},"value":"2002-01-01"},"distributionlocation":"","hostedby":{"key":"10|openaire____::4692342f0992d91f9e705c26959f09e0","value":"VTT Research Information System"},"instancetype":{"classid":"0002","classname":"Book","schemeid":"dnet:publication_resource","schemename":"dnet:publication_resource"},"pid":[],"refereed":{"classid":"0000","classname":"Unknown","schemeid":"dnet:review_levels","schemename":"dnet:review_levels"},"url":["https://cris.vtt.fi/en/publications/6d8a9079-5a24-43d3-bcd5-1b5f538b3c0b"]}],"language":{"classid":"fin","classname":"Finnish","schemeid":"dnet:languages","schemename":"dnet:languages"},"lastupdatetimestamp":1638458154975,"oaiprovenance":{"originDescription":{"altered":true,"baseURL":"https%3A%2F%2Fcris.vtt.fi%2Fws%2Foai","datestamp":"2020-11-20T08:22:01Z","harvestDate":"2021-11-06T12:47:04.287Z","identifier":"oai:cris.vtt.fi:publications/6d8a9079-5a24-43d3-bcd5-1b5f538b3c0b","metadataNamespace":"http://www.openarchives.org/OAI/2.0/oai_dc/"}},"originalId":["50|355e65625b88::76e3f831b17a51b6c2c5d072469c7587","oai:cris.vtt.fi:publications/6d8a9079-5a24-43d3-bcd5-1b5f538b3c0b"],"pid":[],"publisher":{"dataInfo":{"deletedbyinference":false,"inferenceprovenance":"","inferred":false,"invisible":false,"provenanceaction":{"classid":"sysimport:crosswalk:repository","classname":"Harvested","schemeid":"dnet:provenanceActions","schemename":"dnet:provenanceActions"},"trust":"0.9"},"value":"VTT Technical Research Centre of Finland"},"relevantdate":[],"resourcetype":{"classid":"UNKNOWN","classname":"Unknown","schemeid":"dnet:dataCite_resource","schemename":"dnet:dataCite_resource"},"resulttype":{"classid":"publication","classname":"publication","schemeid":"dnet:result_typologies","schemename":"dnet:result_typologies"},"source":[{"dataInfo":{"deletedbyinference":false,"inferenceprovenance":"","inferred":false,"invisible":false,"provenanceaction":{"classid":"sysimport:crosswalk:repository","classname":"Harvested","schemeid":"dnet:provenanceActions","schemename":"dnet:provenanceActions"},"trust":"0.9"},"value":"Vallinheimo , E , Setälä , T & Sohlberg , S (eds) 2002 , Kuinka metallintutkimus jalostui : Muistelmia metallurgian laboratoriosta 1942-1994 . VTT Technical Research Centre of Finland , Espoo ."}],"subject":[],"title":[{"dataInfo":{"deletedbyinference":false,"inferenceprovenance":"","inferred":false,"invisible":false,"provenanceaction":{"classid":"sysimport:crosswalk:repository","classname":"Harvested","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":"Kuinka metallintutkimus jalostui:Muistelmia metallurgian laboratoriosta 1942-1994"}]} +{"author":[{"fullname":"Cao, Sunliang","name":"Sunliang","pid":[],"rank":1,"surname":"Cao"},{"fullname":"Hasan, Ala","name":"Ala","pid":[],"rank":2,"surname":"Hasan"},{"fullname":"Siren, Kai","name":"Kai","pid":[],"rank":3,"surname":"Siren"}],"bestaccessright":{"classid":"CLOSED","classname":"Closed Access","schemeid":"dnet:access_modes","schemename":"dnet:access_modes"},"collectedfrom":[{"key":"10|openaire____::4692342f0992d91f9e705c26959f09e0","value":"VTT Research Information System"}],"context":[],"contributor":[],"country":[],"coverage":[],"dataInfo":{"deletedbyinference":true,"inferenceprovenance":"","inferred":false,"invisible":false,"provenanceaction":{"classid":"sysimport:crosswalk:repository","classname":"Harvested","schemeid":"dnet:provenanceActions","schemename":"dnet:provenanceActions"},"trust":"0.9"},"dateofacceptance":{"dataInfo":{"deletedbyinference":false,"inferenceprovenance":"","inferred":false,"invisible":false,"provenanceaction":{"classid":"sysimport:crosswalk:repository","classname":"Harvested","schemeid":"dnet:provenanceActions","schemename":"dnet:provenanceActions"},"trust":"0.9"},"value":"2013-01-01"},"dateofcollection":"2021-11-06T12:41:33.649Z","dateoftransformation":"2021-11-06T18:56:51.151Z","description":[{"dataInfo":{"deletedbyinference":false,"inferenceprovenance":"","inferred":false,"invisible":false,"provenanceaction":{"classid":"sysimport:crosswalk:repository","classname":"Harvested","schemeid":"dnet:provenanceActions","schemename":"dnet:provenanceActions"},"trust":"0.9"},"value":"The objective of this paper is to close the scientific gap that there is a lack of comprehensive matching analysis for the increasingly complicated on-site hybrid energy systems with a continuously decreased annual primary energy consumption/equivalent CO2 emission. Thus, a thorough matching analysis is conducted for the on-site hybrid systems of two office buildings under distinct climate conditions. Both of the studied buildings are equipped with PV and solar thermal assisted ground source heat pumps (GSHP), which can be controlled by six excess renewable electrical (REe) and one excess renewable thermal (REth) treatments with respect to certain thermal storage recharging and grid exporting strategies. The assessment criteria are six recently defined indices. With the aid of these indices, the key methodology is to conduct parametric analyses from the aspect of matching for solar thermal collector area and connection type, PV panel area, and electrical battery size regarding certain excess REe or REth treatments. The outcomes of matching analyses show the advantages of solar thermal collectors connected in a parallel fashion in meeting office heating demands, the consistency between electrical generation and demand in the daytime in office buildings, the enhancement of on-site heating and cooling by GSHP and free ground cooling, and the battery effect in technically improving electrical matching. Furthermore, the fluctuations of indices in the instantaneous matching analysis clearly reflect the matching situations of on-site renewable energy resources and demand conditions at each time-step, which will be helpful for the detailed investigation of specific system operations and user behaviours. It has been shown that the methodology used in the study can be helpful for aiding the design of increasingly complicated on-site hybrid energy systems."}],"externalReference":[],"extraInfo":[],"format":[],"fulltext":[],"id":"50|355e65625b88::7c73a836ec6edb701b2ed0a45de2be34","instance":[{"accessright":{"classid":"CLOSED","classname":"Closed Access","schemeid":"dnet:access_modes","schemename":"dnet:access_modes"},"alternateIdentifier":[{"dataInfo":{"deletedbyinference":false,"inferenceprovenance":"","inferred":false,"invisible":false,"provenanceaction":{"classid":"sysimport:crosswalk:repository","classname":"Harvested","schemeid":"dnet:provenanceActions","schemename":"dnet:provenanceActions"},"trust":"0.9"},"qualifier":{"classid":"doi","classname":"Digital Object Identifier","schemeid":"dnet:pid_types","schemename":"dnet:pid_types"},"value":"10.1016/j.apenergy.2013.07.031"}],"collectedfrom":{"key":"10|openaire____::4692342f0992d91f9e705c26959f09e0","value":"VTT Research Information System"},"dateofacceptance":{"dataInfo":{"deletedbyinference":false,"inferenceprovenance":"","inferred":false,"invisible":false,"provenanceaction":{"classid":"sysimport:crosswalk:repository","classname":"Harvested","schemeid":"dnet:provenanceActions","schemename":"dnet:provenanceActions"},"trust":"0.9"},"value":"2013-01-01"},"distributionlocation":"","hostedby":{"key":"10|openaire____::4692342f0992d91f9e705c26959f09e0","value":"VTT Research Information System"},"instancetype":{"classid":"0001","classname":"Article","schemeid":"dnet:publication_resource","schemename":"dnet:publication_resource"},"pid":[],"refereed":{"classid":"0000","classname":"Unknown","schemeid":"dnet:review_levels","schemename":"dnet:review_levels"},"url":["https://cris.vtt.fi/en/publications/b1dfe7fc-4e60-4982-8f1c-ccc12579ab00"]}],"language":{"classid":"eng","classname":"English","schemeid":"dnet:languages","schemename":"dnet:languages"},"lastupdatetimestamp":1638458162087,"oaiprovenance":{"originDescription":{"altered":true,"baseURL":"https%3A%2F%2Fcris.vtt.fi%2Fws%2Foai","datestamp":"2021-06-19T01:36:54Z","harvestDate":"2021-11-06T12:41:33.649Z","identifier":"oai:cris.vtt.fi:publications/b1dfe7fc-4e60-4982-8f1c-ccc12579ab00","metadataNamespace":"http://www.openarchives.org/OAI/2.0/oai_dc/"}},"originalId":["oai:cris.vtt.fi:publications/b1dfe7fc-4e60-4982-8f1c-ccc12579ab00","50|355e65625b88::7c73a836ec6edb701b2ed0a45de2be34"],"pid":[],"relevantdate":[],"resourcetype":{"classid":"UNKNOWN","classname":"Unknown","schemeid":"dnet:dataCite_resource","schemename":"dnet:dataCite_resource"},"resulttype":{"classid":"publication","classname":"publication","schemeid":"dnet:result_typologies","schemename":"dnet:result_typologies"},"source":[{"dataInfo":{"deletedbyinference":false,"inferenceprovenance":"","inferred":false,"invisible":false,"provenanceaction":{"classid":"sysimport:crosswalk:repository","classname":"Harvested","schemeid":"dnet:provenanceActions","schemename":"dnet:provenanceActions"},"trust":"0.9"},"value":"Cao , S , Hasan , A & Siren , K 2013 , ' Matching analysis for on-site hybrid renewable energy systems of office buildings with extended indices ' , Applied Energy , vol. 113 , pp. 230-247 . https://doi.org/10.1016/j.apenergy.2013.07.031"}],"subject":[{"dataInfo":{"deletedbyinference":false,"inferenceprovenance":"","inferred":false,"invisible":false,"provenanceaction":{"classid":"sysimport:crosswalk:repository","classname":"Harvested","schemeid":"dnet:provenanceActions","schemename":"dnet:provenanceActions"},"trust":"0.9"},"qualifier":{"classid":"keyword","classname":"keyword","schemeid":"dnet:result_subject","schemename":"dnet:result_subject"},"value":"ground source heat pump"},{"dataInfo":{"deletedbyinference":false,"inferenceprovenance":"","inferred":false,"invisible":false,"provenanceaction":{"classid":"sysimport:crosswalk:repository","classname":"Harvested","schemeid":"dnet:provenanceActions","schemename":"dnet:provenanceActions"},"trust":"0.9"},"qualifier":{"classid":"keyword","classname":"keyword","schemeid":"dnet:result_subject","schemename":"dnet:result_subject"},"value":"matching indices"},{"dataInfo":{"deletedbyinference":false,"inferenceprovenance":"","inferred":false,"invisible":false,"provenanceaction":{"classid":"sysimport:crosswalk:repository","classname":"Harvested","schemeid":"dnet:provenanceActions","schemename":"dnet:provenanceActions"},"trust":"0.9"},"qualifier":{"classid":"keyword","classname":"keyword","schemeid":"dnet:result_subject","schemename":"dnet:result_subject"},"value":"mismatch analysis"},{"dataInfo":{"deletedbyinference":false,"inferenceprovenance":"","inferred":false,"invisible":false,"provenanceaction":{"classid":"sysimport:crosswalk:repository","classname":"Harvested","schemeid":"dnet:provenanceActions","schemename":"dnet:provenanceActions"},"trust":"0.9"},"qualifier":{"classid":"keyword","classname":"keyword","schemeid":"dnet:result_subject","schemename":"dnet:result_subject"},"value":"office building"},{"dataInfo":{"deletedbyinference":false,"inferenceprovenance":"","inferred":false,"invisible":false,"provenanceaction":{"classid":"sysimport:crosswalk:repository","classname":"Harvested","schemeid":"dnet:provenanceActions","schemename":"dnet:provenanceActions"},"trust":"0.9"},"qualifier":{"classid":"keyword","classname":"keyword","schemeid":"dnet:result_subject","schemename":"dnet:result_subject"},"value":"renewable feed-in"},{"dataInfo":{"deletedbyinference":false,"inferenceprovenance":"","inferred":false,"invisible":false,"provenanceaction":{"classid":"sysimport:crosswalk:repository","classname":"Harvested","schemeid":"dnet:provenanceActions","schemename":"dnet:provenanceActions"},"trust":"0.9"},"qualifier":{"classid":"keyword","classname":"keyword","schemeid":"dnet:result_subject","schemename":"dnet:result_subject"},"value":"solar"},{"dataInfo":{"deletedbyinference":false,"inferenceprovenance":"","inferred":false,"invisible":false,"provenanceaction":{"classid":"sysimport:crosswalk:repository","classname":"Harvested","schemeid":"dnet:provenanceActions","schemename":"dnet:provenanceActions"},"trust":"0.9"},"qualifier":{"classid":"keyword","classname":"keyword","schemeid":"dnet:result_subject","schemename":"dnet:result_subject"},"value":"/dk/atira/pure/sustainabledevelopmentgoals/affordable_and_clean_energy"},{"dataInfo":{"deletedbyinference":false,"inferenceprovenance":"","inferred":false,"invisible":false,"provenanceaction":{"classid":"sysimport:crosswalk:repository","classname":"Harvested","schemeid":"dnet:provenanceActions","schemename":"dnet:provenanceActions"},"trust":"0.9"},"qualifier":{"classid":"keyword","classname":"keyword","schemeid":"dnet:result_subject","schemename":"dnet:result_subject"},"value":"SDG 7 - Affordable and Clean Energy"},{"dataInfo":{"deletedbyinference":false,"inferenceprovenance":"","inferred":false,"invisible":false,"provenanceaction":{"classid":"sysimport:crosswalk:repository","classname":"Harvested","schemeid":"dnet:provenanceActions","schemename":"dnet:provenanceActions"},"trust":"0.9"},"qualifier":{"classid":"keyword","classname":"keyword","schemeid":"dnet:result_subject","schemename":"dnet:result_subject"},"value":"/dk/atira/pure/sustainabledevelopmentgoals/climate_action"},{"dataInfo":{"deletedbyinference":false,"inferenceprovenance":"","inferred":false,"invisible":false,"provenanceaction":{"classid":"sysimport:crosswalk:repository","classname":"Harvested","schemeid":"dnet:provenanceActions","schemename":"dnet:provenanceActions"},"trust":"0.9"},"qualifier":{"classid":"keyword","classname":"keyword","schemeid":"dnet:result_subject","schemename":"dnet:result_subject"},"value":"SDG 13 - Climate Action"}],"title":[{"dataInfo":{"deletedbyinference":false,"inferenceprovenance":"","inferred":false,"invisible":false,"provenanceaction":{"classid":"sysimport:crosswalk:repository","classname":"Harvested","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":"Matching analysis for on-site hybrid renewable energy systems of office buildings with extended indices"}]} +{"author":[{"fullname":"Suni, Ilkka","name":"Ilkka","pid":[],"rank":1,"surname":"Suni"},{"fullname":"Grönberg, Leif","name":"Leif","pid":[],"rank":2,"surname":"Grönberg"},{"fullname":"Saarilahti, Jaakko","name":"Jaakko","pid":[],"rank":3,"surname":"Saarilahti"}],"bestaccessright":{"classid":"RESTRICTED","classname":"Restricted","schemeid":"dnet:access_modes","schemename":"dnet:access_modes"},"collectedfrom":[{"key":"10|openaire____::4692342f0992d91f9e705c26959f09e0","value":"VTT Research Information System"}],"context":[],"contributor":[],"country":[{"classid":"FI","classname":"Finland","dataInfo":{"deletedbyinference":false,"inferenceprovenance":"propagation","inferred":true,"invisible":false,"provenanceaction":{"classid":"country:instrepos","classname":"Inferred by OpenAIRE","schemeid":"dnet:provenanceActions","schemename":"dnet:provenanceActions"},"trust":"0.85"},"schemeid":"dnet:countries","schemename":"dnet:countries"}],"coverage":[],"dataInfo":{"deletedbyinference":false,"inferenceprovenance":"","inferred":false,"invisible":false,"provenanceaction":{"classid":"sysimport:crosswalk:repository","classname":"Harvested","schemeid":"dnet:provenanceActions","schemename":"dnet:provenanceActions"},"trust":"0.9"},"dateofacceptance":{"dataInfo":{"deletedbyinference":false,"inferenceprovenance":"","inferred":false,"invisible":false,"provenanceaction":{"classid":"sysimport:crosswalk:repository","classname":"Harvested","schemeid":"dnet:provenanceActions","schemename":"dnet:provenanceActions"},"trust":"0.9"},"value":"1987-01-01"},"dateofcollection":"2021-11-06T12:46:23.315Z","dateoftransformation":"2021-11-06T19:15:49.866Z","description":[{"dataInfo":{"deletedbyinference":false,"inferenceprovenance":"","inferred":false,"invisible":false,"provenanceaction":{"classid":"sysimport:crosswalk:repository","classname":"Harvested","schemeid":"dnet:provenanceActions","schemename":"dnet:provenanceActions"},"trust":"0.9"},"value":"The authors report on the effects of ion implantation and rapid thermal annealing on the electrical transport properties of TiSi2 and MoSi2. The silicide layers were formed by solid phase reactions of sputtered metal films with silicon. Some of the wafers were implanted at room temperature with arsenic. To investigate the damage recovery, one of the samples were subjected to rapid thermal annealing. The resistivities of the silicides were measured in the van der Pauw configuration. The results are presented and discussed."}],"externalReference":[],"extraInfo":[],"format":[],"fulltext":[],"id":"50|355e65625b88::80ee0506f19328fb194bd236f29b8c49","instance":[{"accessright":{"classid":"RESTRICTED","classname":"Restricted","schemeid":"dnet:access_modes","schemename":"dnet:access_modes"},"alternateIdentifier":[],"collectedfrom":{"key":"10|openaire____::4692342f0992d91f9e705c26959f09e0","value":"VTT Research Information System"},"dateofacceptance":{"dataInfo":{"deletedbyinference":false,"inferenceprovenance":"","inferred":false,"invisible":false,"provenanceaction":{"classid":"sysimport:crosswalk:repository","classname":"Harvested","schemeid":"dnet:provenanceActions","schemename":"dnet:provenanceActions"},"trust":"0.9"},"value":"1987-01-01"},"distributionlocation":"","hostedby":{"key":"10|openaire____::4692342f0992d91f9e705c26959f09e0","value":"VTT Research Information System"},"instancetype":{"classid":"0001","classname":"Article","schemeid":"dnet:publication_resource","schemename":"dnet:publication_resource"},"pid":[],"refereed":{"classid":"0000","classname":"Unknown","schemeid":"dnet:review_levels","schemename":"dnet:review_levels"},"url":["https://cris.vtt.fi/en/publications/6ad59175-e7a1-4c3f-9e14-0e2978e54a66"]}],"language":{"classid":"eng","classname":"English","schemeid":"dnet:languages","schemename":"dnet:languages"},"lastupdatetimestamp":1638458167217,"oaiprovenance":{"originDescription":{"altered":true,"baseURL":"https%3A%2F%2Fcris.vtt.fi%2Fws%2Foai","datestamp":"2021-05-25T05:25:16Z","harvestDate":"2021-11-06T12:46:23.315Z","identifier":"oai:cris.vtt.fi:publications/6ad59175-e7a1-4c3f-9e14-0e2978e54a66","metadataNamespace":"http://www.openarchives.org/OAI/2.0/oai_dc/"}},"originalId":["50|355e65625b88::80ee0506f19328fb194bd236f29b8c49","oai:cris.vtt.fi:publications/6ad59175-e7a1-4c3f-9e14-0e2978e54a66"],"pid":[],"relevantdate":[],"resourcetype":{"classid":"UNKNOWN","classname":"Unknown","schemeid":"dnet:dataCite_resource","schemename":"dnet:dataCite_resource"},"resulttype":{"classid":"publication","classname":"publication","schemeid":"dnet:result_typologies","schemename":"dnet:result_typologies"},"source":[{"dataInfo":{"deletedbyinference":false,"inferenceprovenance":"","inferred":false,"invisible":false,"provenanceaction":{"classid":"sysimport:crosswalk:repository","classname":"Harvested","schemeid":"dnet:provenanceActions","schemename":"dnet:provenanceActions"},"trust":"0.9"},"value":"Suni , I , Grönberg , L & Saarilahti , J 1987 , ' Transport properties of silicides : effects of ion-irradiation and annealing ' , Vide, les Couches Minces , vol. 42 , no. 236 , pp. 233-236 ."}],"subject":[{"dataInfo":{"deletedbyinference":false,"inferenceprovenance":"","inferred":false,"invisible":false,"provenanceaction":{"classid":"sysimport:crosswalk:repository","classname":"Harvested","schemeid":"dnet:provenanceActions","schemename":"dnet:provenanceActions"},"trust":"0.9"},"qualifier":{"classid":"keyword","classname":"keyword","schemeid":"dnet:result_subject","schemename":"dnet:result_subject"},"value":"titanium silicide"},{"dataInfo":{"deletedbyinference":false,"inferenceprovenance":"","inferred":false,"invisible":false,"provenanceaction":{"classid":"sysimport:crosswalk:repository","classname":"Harvested","schemeid":"dnet:provenanceActions","schemename":"dnet:provenanceActions"},"trust":"0.9"},"qualifier":{"classid":"keyword","classname":"keyword","schemeid":"dnet:result_subject","schemename":"dnet:result_subject"},"value":"ion beams"},{"dataInfo":{"deletedbyinference":false,"inferenceprovenance":"","inferred":false,"invisible":false,"provenanceaction":{"classid":"sysimport:crosswalk:repository","classname":"Harvested","schemeid":"dnet:provenanceActions","schemename":"dnet:provenanceActions"},"trust":"0.9"},"qualifier":{"classid":"keyword","classname":"keyword","schemeid":"dnet:result_subject","schemename":"dnet:result_subject"},"value":"heat treatment"},{"dataInfo":{"deletedbyinference":false,"inferenceprovenance":"","inferred":false,"invisible":false,"provenanceaction":{"classid":"sysimport:crosswalk:repository","classname":"Harvested","schemeid":"dnet:provenanceActions","schemename":"dnet:provenanceActions"},"trust":"0.9"},"qualifier":{"classid":"keyword","classname":"keyword","schemeid":"dnet:result_subject","schemename":"dnet:result_subject"},"value":"molybdenum silicide"},{"dataInfo":{"deletedbyinference":false,"inferenceprovenance":"","inferred":false,"invisible":false,"provenanceaction":{"classid":"sysimport:crosswalk:repository","classname":"Harvested","schemeid":"dnet:provenanceActions","schemename":"dnet:provenanceActions"},"trust":"0.9"},"qualifier":{"classid":"keyword","classname":"keyword","schemeid":"dnet:result_subject","schemename":"dnet:result_subject"},"value":"rapid thermal annealing"}],"title":[{"dataInfo":{"deletedbyinference":false,"inferenceprovenance":"","inferred":false,"invisible":false,"provenanceaction":{"classid":"sysimport:crosswalk:repository","classname":"Harvested","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":"Transport properties of silicides:effects of ion-irradiation and annealing"}]} +{"author":[{"fullname":"Kortelainen, Helena","name":"Helena","pid":[],"rank":1,"surname":"Kortelainen"},{"fullname":"Pursio, Saku","name":"Saku","pid":[],"rank":2,"surname":"Pursio"}],"bestaccessright":{"classid":"RESTRICTED","classname":"Restricted","schemeid":"dnet:access_modes","schemename":"dnet:access_modes"},"collectedfrom":[{"key":"10|openaire____::4692342f0992d91f9e705c26959f09e0","value":"VTT Research Information System"}],"context":[],"contributor":[],"country":[],"coverage":[],"dataInfo":{"deletedbyinference":true,"inferenceprovenance":"","inferred":false,"invisible":false,"provenanceaction":{"classid":"sysimport:crosswalk:repository","classname":"Harvested","schemeid":"dnet:provenanceActions","schemename":"dnet:provenanceActions"},"trust":"0.9"},"dateofacceptance":{"dataInfo":{"deletedbyinference":false,"inferenceprovenance":"","inferred":false,"invisible":false,"provenanceaction":{"classid":"sysimport:crosswalk:repository","classname":"Harvested","schemeid":"dnet:provenanceActions","schemename":"dnet:provenanceActions"},"trust":"0.9"},"value":"2001-01-01"},"dateofcollection":"2021-11-06T12:47:14.02Z","dateoftransformation":"2021-11-06T20:52:03.055Z","description":[{"dataInfo":{"deletedbyinference":false,"inferenceprovenance":"","inferred":false,"invisible":false,"provenanceaction":{"classid":"sysimport:crosswalk:repository","classname":"Harvested","schemeid":"dnet:provenanceActions","schemename":"dnet:provenanceActions"},"trust":"0.9"},"value":"Availability performance is an efficiency measure. As input data, mean times between failures, mean times to repair and failure criticality are required. Detailed availability performance analysis of a production system requires a model, which takes into account the logical structure of the system and the storage capacity between process stages. The model can also take into account the effect of production disturbances and planned stoppages if corresponding data is available. A comprehensive availability performance model is a practical tool when improvements are to be directed effectively, strategies tested, or alternative investment proposals compared."}],"externalReference":[],"extraInfo":[],"format":[],"fulltext":[],"id":"50|355e65625b88::9a9eb0e8d57ecfda331a206f6b122e2b","instance":[{"accessright":{"classid":"RESTRICTED","classname":"Restricted","schemeid":"dnet:access_modes","schemename":"dnet:access_modes"},"alternateIdentifier":[],"collectedfrom":{"key":"10|openaire____::4692342f0992d91f9e705c26959f09e0","value":"VTT Research Information System"},"dateofacceptance":{"dataInfo":{"deletedbyinference":false,"inferenceprovenance":"","inferred":false,"invisible":false,"provenanceaction":{"classid":"sysimport:crosswalk:repository","classname":"Harvested","schemeid":"dnet:provenanceActions","schemename":"dnet:provenanceActions"},"trust":"0.9"},"value":"2001-01-01"},"distributionlocation":"","hostedby":{"key":"10|openaire____::4692342f0992d91f9e705c26959f09e0","value":"VTT Research Information System"},"instancetype":{"classid":"0001","classname":"Article","schemeid":"dnet:publication_resource","schemename":"dnet:publication_resource"},"pid":[],"refereed":{"classid":"0000","classname":"Unknown","schemeid":"dnet:review_levels","schemename":"dnet:review_levels"},"url":["https://cris.vtt.fi/en/publications/a92459e2-68b4-45f9-b8a5-ed7b00e764d8"]}],"language":{"classid":"eng","classname":"English","schemeid":"dnet:languages","schemename":"dnet:languages"},"lastupdatetimestamp":1638458197611,"oaiprovenance":{"originDescription":{"altered":true,"baseURL":"https%3A%2F%2Fcris.vtt.fi%2Fws%2Foai","datestamp":"2021-01-01T03:54:58Z","harvestDate":"2021-11-06T12:47:14.02Z","identifier":"oai:cris.vtt.fi:publications/a92459e2-68b4-45f9-b8a5-ed7b00e764d8","metadataNamespace":"http://www.openarchives.org/OAI/2.0/oai_dc/"}},"originalId":["oai:cris.vtt.fi:publications/a92459e2-68b4-45f9-b8a5-ed7b00e764d8","50|355e65625b88::9a9eb0e8d57ecfda331a206f6b122e2b"],"pid":[],"relevantdate":[],"resourcetype":{"classid":"UNKNOWN","classname":"Unknown","schemeid":"dnet:dataCite_resource","schemename":"dnet:dataCite_resource"},"resulttype":{"classid":"publication","classname":"publication","schemeid":"dnet:result_typologies","schemename":"dnet:result_typologies"},"source":[{"dataInfo":{"deletedbyinference":false,"inferenceprovenance":"","inferred":false,"invisible":false,"provenanceaction":{"classid":"sysimport:crosswalk:repository","classname":"Harvested","schemeid":"dnet:provenanceActions","schemename":"dnet:provenanceActions"},"trust":"0.9"},"value":"Kortelainen , H & Pursio , S 2001 , ' Availability performance stands for plant efficiency ' , Paperi ja puu , vol. 83 , no. 4 , pp. 292-296 ."}],"subject":[],"title":[{"dataInfo":{"deletedbyinference":false,"inferenceprovenance":"","inferred":false,"invisible":false,"provenanceaction":{"classid":"sysimport:crosswalk:repository","classname":"Harvested","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":"Availability performance stands for plant efficiency"}]} +{"author":[{"fullname":"Antikainen, Hannele","name":"Hannele","pid":[],"rank":1,"surname":"Antikainen"}],"bestaccessright":{"classid":"RESTRICTED","classname":"Restricted","schemeid":"dnet:access_modes","schemename":"dnet:access_modes"},"collectedfrom":[{"key":"10|openaire____::4692342f0992d91f9e705c26959f09e0","value":"VTT Research Information System"}],"context":[],"contributor":[],"country":[],"coverage":[],"dataInfo":{"deletedbyinference":true,"inferenceprovenance":"","inferred":false,"invisible":false,"provenanceaction":{"classid":"sysimport:crosswalk:repository","classname":"Harvested","schemeid":"dnet:provenanceActions","schemename":"dnet:provenanceActions"},"trust":"0.9"},"dateofacceptance":{"dataInfo":{"deletedbyinference":false,"inferenceprovenance":"","inferred":false,"invisible":false,"provenanceaction":{"classid":"sysimport:crosswalk:repository","classname":"Harvested","schemeid":"dnet:provenanceActions","schemename":"dnet:provenanceActions"},"trust":"0.9"},"value":"1996-01-01"},"dateofcollection":"2021-11-06T12:48:05.57Z","dateoftransformation":"2021-11-06T22:12:02.979Z","description":[],"externalReference":[],"extraInfo":[],"format":[],"fulltext":[],"id":"50|355e65625b88::ab957719ef10690373ff1c3cae3769ac","instance":[{"accessright":{"classid":"RESTRICTED","classname":"Restricted","schemeid":"dnet:access_modes","schemename":"dnet:access_modes"},"alternateIdentifier":[],"collectedfrom":{"key":"10|openaire____::4692342f0992d91f9e705c26959f09e0","value":"VTT Research Information System"},"dateofacceptance":{"dataInfo":{"deletedbyinference":false,"inferenceprovenance":"","inferred":false,"invisible":false,"provenanceaction":{"classid":"sysimport:crosswalk:repository","classname":"Harvested","schemeid":"dnet:provenanceActions","schemename":"dnet:provenanceActions"},"trust":"0.9"},"value":"1996-01-01"},"distributionlocation":"","hostedby":{"key":"10|openaire____::4692342f0992d91f9e705c26959f09e0","value":"VTT Research Information System"},"instancetype":{"classid":"0001","classname":"Article","schemeid":"dnet:publication_resource","schemename":"dnet:publication_resource"},"pid":[],"refereed":{"classid":"0000","classname":"Unknown","schemeid":"dnet:review_levels","schemename":"dnet:review_levels"},"url":["https://cris.vtt.fi/en/publications/d26b0846-6bc4-42e2-b343-8849be5e1cf0"]}],"language":{"classid":"fin","classname":"Finnish","schemeid":"dnet:languages","schemename":"dnet:languages"},"lastupdatetimestamp":1638458218199,"oaiprovenance":{"originDescription":{"altered":true,"baseURL":"https%3A%2F%2Fcris.vtt.fi%2Fws%2Foai","datestamp":"2019-08-02T08:01:44Z","harvestDate":"2021-11-06T12:48:05.57Z","identifier":"oai:cris.vtt.fi:publications/d26b0846-6bc4-42e2-b343-8849be5e1cf0","metadataNamespace":"http://www.openarchives.org/OAI/2.0/oai_dc/"}},"originalId":["50|355e65625b88::ab957719ef10690373ff1c3cae3769ac","oai:cris.vtt.fi:publications/d26b0846-6bc4-42e2-b343-8849be5e1cf0"],"pid":[],"relevantdate":[],"resourcetype":{"classid":"UNKNOWN","classname":"Unknown","schemeid":"dnet:dataCite_resource","schemename":"dnet:dataCite_resource"},"resulttype":{"classid":"publication","classname":"publication","schemeid":"dnet:result_typologies","schemename":"dnet:result_typologies"},"source":[{"dataInfo":{"deletedbyinference":false,"inferenceprovenance":"","inferred":false,"invisible":false,"provenanceaction":{"classid":"sysimport:crosswalk:repository","classname":"Harvested","schemeid":"dnet:provenanceActions","schemename":"dnet:provenanceActions"},"trust":"0.9"},"value":"Antikainen , H 1996 , ' Preflight -ohjelma paljastaa tulostusongelmat ' , Suomen Lehdistö , vol. 66 , no. 5 , pp. 22-25 ."}],"subject":[],"title":[{"dataInfo":{"deletedbyinference":false,"inferenceprovenance":"","inferred":false,"invisible":false,"provenanceaction":{"classid":"sysimport:crosswalk:repository","classname":"Harvested","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":"Preflight -ohjelma paljastaa tulostusongelmat"}]} +{"author":[{"fullname":"Leppälahti, Jukka","name":"Jukka","pid":[],"rank":1,"surname":"Leppälahti"}],"bestaccessright":{"classid":"RESTRICTED","classname":"Restricted","schemeid":"dnet:access_modes","schemename":"dnet:access_modes"},"collectedfrom":[{"key":"10|openaire____::4692342f0992d91f9e705c26959f09e0","value":"VTT Research Information System"}],"context":[],"contributor":[],"country":[{"classid":"FI","classname":"Finland","dataInfo":{"deletedbyinference":false,"inferenceprovenance":"propagation","inferred":true,"invisible":false,"provenanceaction":{"classid":"country:instrepos","classname":"Inferred by OpenAIRE","schemeid":"dnet:provenanceActions","schemename":"dnet:provenanceActions"},"trust":"0.85"},"schemeid":"dnet:countries","schemename":"dnet:countries"}],"coverage":[],"dataInfo":{"deletedbyinference":false,"inferenceprovenance":"","inferred":false,"invisible":false,"provenanceaction":{"classid":"sysimport:crosswalk:repository","classname":"Harvested","schemeid":"dnet:provenanceActions","schemename":"dnet:provenanceActions"},"trust":"0.9"},"dateofacceptance":{"dataInfo":{"deletedbyinference":false,"inferenceprovenance":"","inferred":false,"invisible":false,"provenanceaction":{"classid":"sysimport:crosswalk:repository","classname":"Harvested","schemeid":"dnet:provenanceActions","schemename":"dnet:provenanceActions"},"trust":"0.9"},"value":"1998-01-01"},"dateofcollection":"2021-11-06T12:50:53.064Z","dateoftransformation":"2021-11-06T22:22:36.446Z","description":[{"dataInfo":{"deletedbyinference":false,"inferenceprovenance":"","inferred":false,"invisible":false,"provenanceaction":{"classid":"sysimport:crosswalk:repository","classname":"Harvested","schemeid":"dnet:provenanceActions","schemename":"dnet:provenanceActions"},"trust":"0.9"},"value":"Factors affecting the release and reactions of fuel-bound nitrogen in air gasification conditions were studied in order to be able to minimise their production during gasification. Another objective was to find new means to remove nitrogenous compounds from hot gasification gas. In fluidised-bed and fixed-bed types of gasifier NH3 is the predominant nitrogenous compound in addition to N2. In thermodynamic equilibrium the NH3 content of gasification gas is low. The equilibrium content ranges from 1 to 350 ppms depending on the temperature, pressure and stoichiometric ratio. The highest equilibrium content is usually encountered at high pressure. The real NH3 content of gasifier product gas is usually at least an order of magnitude higher. The fraction of fuel nitrogen that is converted to NH3 in gasification is affected by several factors. During pyrolysis young biomass fuels tend to release part of the fuel nitrogen directly as NH3, whereas coals seem to release fuel nitrogen primarily from structures that favour HCN formation. A low heating rate and factors that increase the extent of secondary reactions of gases and char during pyrolysis also increase the conversion of HCN to NH3. In fluidised-bed (and fixed-bed) gasifiers the conditions seem to favour NH3 formation but in entrained-bed gasifiers a high heating rate may promote HCN formation. Factors affecting the release of char nitrogen in gasifiers are poorly known. In this work, a statistical model was developed, which can predict the conversion of fuel nitrogen to NH3 in a laboratory-scale fluidised-bed gasifier and a larger entrained-bed gasifier. It was found that the formation of NH3 was mostly dependent on the freeboard temperature of the gasifier, and on the iron, calcium, ash and volatile matter content of fuel. Increasing the iron content of the fuel resulted in a strong decreasing effect in the NH3 formation in the fluidised-bed gasifier, but it had a smaller effect in the entrained-bed gasifier. The decomposition rate of NH3 may be increased by adding or creating suitable reactive gas species into the hot gas. In selective catalytic oxidation oxidisers like O2, NO or a mixture of these are added to the gasification gas before flowing the gas through the catalyst bed. Aluminium oxide and aluminium silicate catalysts proved to be the most effective of the materials tested in promoting NH3 decomposition in the presence of oxidisers. The temperature of optimum NH3 reduction was tightly dependent on the composition of the oxidiser used. If NO was allowed to convert to NO2 in the oxidiser mixture before feeding the oxidiser to the reactor, the best conversion was achieved at temperatures below 500 °C. If pure NO and O2 were used, the best conversion was achieved at 500 - 600 °C. An important finding in this work was the ability of aluminium oxide to catalyse the reaction between added O2 and NH3. No nitrogen oxides were formed during this type of NH3 oxidation on the aluminium oxide catalyst. The reaction product was probably N2. When O2/NH3 ratio was 4 in the experiments with synthetic gasification gas, 75% of the NH3 was decomposed in the aluminium oxide bed at the temperature range of 550 - 700 °C. The development of a gas cleaning process based on these results of selective catalytic oxidation still leaves several questions unanswered. The most important questions are connected with optimising the process, with the effect of gas impurities on the reactions and with the alternatives of oxidising HCN to N2 simultaneously with NH3."}],"externalReference":[],"extraInfo":[],"format":[],"fulltext":[],"id":"50|355e65625b88::ad8d151a2ef39d827b1b591ec856d886","instance":[{"accessright":{"classid":"RESTRICTED","classname":"Restricted","schemeid":"dnet:access_modes","schemename":"dnet:access_modes"},"alternateIdentifier":[],"collectedfrom":{"key":"10|openaire____::4692342f0992d91f9e705c26959f09e0","value":"VTT Research Information System"},"dateofacceptance":{"dataInfo":{"deletedbyinference":false,"inferenceprovenance":"","inferred":false,"invisible":false,"provenanceaction":{"classid":"sysimport:crosswalk:repository","classname":"Harvested","schemeid":"dnet:provenanceActions","schemename":"dnet:provenanceActions"},"trust":"0.9"},"value":"1998-01-01"},"distributionlocation":"","hostedby":{"key":"10|openaire____::4692342f0992d91f9e705c26959f09e0","value":"VTT Research Information System"},"instancetype":{"classid":"0006","classname":"Doctoral thesis","schemeid":"dnet:publication_resource","schemename":"dnet:publication_resource"},"pid":[],"refereed":{"classid":"0000","classname":"Unknown","schemeid":"dnet:review_levels","schemename":"dnet:review_levels"},"url":["https://cris.vtt.fi/en/publications/34ca749e-a4cf-47c1-a28f-01720421cdc7"]}],"language":{"classid":"eng","classname":"English","schemeid":"dnet:languages","schemename":"dnet:languages"},"lastupdatetimestamp":1638458220428,"oaiprovenance":{"originDescription":{"altered":true,"baseURL":"https%3A%2F%2Fcris.vtt.fi%2Fws%2Foai","datestamp":"2021-01-02T03:47:22Z","harvestDate":"2021-11-06T12:50:53.064Z","identifier":"oai:cris.vtt.fi:publications/34ca749e-a4cf-47c1-a28f-01720421cdc7","metadataNamespace":"http://www.openarchives.org/OAI/2.0/oai_dc/"}},"originalId":["50|355e65625b88::ad8d151a2ef39d827b1b591ec856d886","oai:cris.vtt.fi:publications/34ca749e-a4cf-47c1-a28f-01720421cdc7"],"pid":[],"publisher":{"dataInfo":{"deletedbyinference":false,"inferenceprovenance":"","inferred":false,"invisible":false,"provenanceaction":{"classid":"sysimport:crosswalk:repository","classname":"Harvested","schemeid":"dnet:provenanceActions","schemename":"dnet:provenanceActions"},"trust":"0.9"},"value":"VTT Technical Research Centre of Finland"},"relevantdate":[],"resourcetype":{"classid":"UNKNOWN","classname":"Unknown","schemeid":"dnet:dataCite_resource","schemename":"dnet:dataCite_resource"},"resulttype":{"classid":"publication","classname":"publication","schemeid":"dnet:result_typologies","schemename":"dnet:result_typologies"},"source":[{"dataInfo":{"deletedbyinference":false,"inferenceprovenance":"","inferred":false,"invisible":false,"provenanceaction":{"classid":"sysimport:crosswalk:repository","classname":"Harvested","schemeid":"dnet:provenanceActions","schemename":"dnet:provenanceActions"},"trust":"0.9"},"value":"Leppälahti , J 1998 , ' Behaviour of fuel-bound nitrogen in gasification and in high-temperature NH3 removal processes : Dissertation ' , Doctor Degree , Åbo Akademi University , Espoo ."}],"subject":[{"dataInfo":{"deletedbyinference":false,"inferenceprovenance":"","inferred":false,"invisible":false,"provenanceaction":{"classid":"sysimport:crosswalk:repository","classname":"Harvested","schemeid":"dnet:provenanceActions","schemename":"dnet:provenanceActions"},"trust":"0.9"},"qualifier":{"classid":"keyword","classname":"keyword","schemeid":"dnet:result_subject","schemename":"dnet:result_subject"},"value":"gas cleaning"},{"dataInfo":{"deletedbyinference":false,"inferenceprovenance":"","inferred":false,"invisible":false,"provenanceaction":{"classid":"sysimport:crosswalk:repository","classname":"Harvested","schemeid":"dnet:provenanceActions","schemename":"dnet:provenanceActions"},"trust":"0.9"},"qualifier":{"classid":"keyword","classname":"keyword","schemeid":"dnet:result_subject","schemename":"dnet:result_subject"},"value":"gasifiers"},{"dataInfo":{"deletedbyinference":false,"inferenceprovenance":"","inferred":false,"invisible":false,"provenanceaction":{"classid":"sysimport:crosswalk:repository","classname":"Harvested","schemeid":"dnet:provenanceActions","schemename":"dnet:provenanceActions"},"trust":"0.9"},"qualifier":{"classid":"keyword","classname":"keyword","schemeid":"dnet:result_subject","schemename":"dnet:result_subject"},"value":"hot gases"},{"dataInfo":{"deletedbyinference":false,"inferenceprovenance":"","inferred":false,"invisible":false,"provenanceaction":{"classid":"sysimport:crosswalk:repository","classname":"Harvested","schemeid":"dnet:provenanceActions","schemename":"dnet:provenanceActions"},"trust":"0.9"},"qualifier":{"classid":"keyword","classname":"keyword","schemeid":"dnet:result_subject","schemename":"dnet:result_subject"},"value":"nitrogen"},{"dataInfo":{"deletedbyinference":false,"inferenceprovenance":"","inferred":false,"invisible":false,"provenanceaction":{"classid":"sysimport:crosswalk:repository","classname":"Harvested","schemeid":"dnet:provenanceActions","schemename":"dnet:provenanceActions"},"trust":"0.9"},"qualifier":{"classid":"keyword","classname":"keyword","schemeid":"dnet:result_subject","schemename":"dnet:result_subject"},"value":"catalytic cleaning"},{"dataInfo":{"deletedbyinference":false,"inferenceprovenance":"","inferred":false,"invisible":false,"provenanceaction":{"classid":"sysimport:crosswalk:repository","classname":"Harvested","schemeid":"dnet:provenanceActions","schemename":"dnet:provenanceActions"},"trust":"0.9"},"qualifier":{"classid":"keyword","classname":"keyword","schemeid":"dnet:result_subject","schemename":"dnet:result_subject"},"value":"gasification"}],"title":[{"dataInfo":{"deletedbyinference":false,"inferenceprovenance":"","inferred":false,"invisible":false,"provenanceaction":{"classid":"sysimport:crosswalk:repository","classname":"Harvested","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":"Behaviour of fuel-bound nitrogen in gasification and in high-temperature NH3 removal processes:Dissertation"}]} \ No newline at end of file