Difference between revisions of "Facet Based Resource Model"
Luca.frosini (Talk | contribs) (→Service) |
Luca.frosini (Talk | contribs) (→Complex Types) |
||
Line 1: | Line 1: | ||
<!-- CATEGORIES --> | <!-- CATEGORIES --> | ||
− | + | [[Category: gCube Features]] | |
+ | [[Category: Developer's Guide]] | ||
+ | [[Category: Information System]] | ||
<!-- CATEGORIES --> | <!-- CATEGORIES --> | ||
{| align="right" | {| align="right" | ||
Line 6: | Line 8: | ||
|} | |} | ||
− | + | The Information System Model (henceforth IS Model) is used by [[Information System Resource Registry]] | |
− | == | + | == Disclaimer == |
− | + | This Model is part of research conducted in the context of a PhD. | |
+ | This wiki page represents just a partial view of the full rationale of the research. | ||
+ | To have a complete overview of the rationale of the model, please refer to the PhD thesis which is publicly available at: | ||
+ | |||
+ | https://etd.adm.unipi.it/t/etd-05102019-114151/ | ||
+ | |||
+ | https://openportal.isti.cnr.it/doc?id=people______::470484e51fcb9e307a418c800efc44c8 | ||
+ | |||
+ | |||
+ | If you need to refer to such work you can cite the PhD Thesis. | ||
+ | |||
+ | BibText: | ||
+ | |||
+ | <pre> | ||
+ | @phdthesis{frosini2019transactional, | ||
+ | title={Transactional REST Information System for Federated Research Infrastructures enabling Virtual Research Environments}, | ||
+ | author={Frosini, Luca}, | ||
+ | year={2019}, | ||
+ | school={UNIVERSIT{\`A} DI PISA} | ||
+ | } | ||
+ | </pre> | ||
+ | |||
+ | An previous paper about this work is: | ||
+ | |||
+ | BibText: | ||
+ | |||
+ | <pre> | ||
+ | @article{frosini2018facet, | ||
+ | title={A Facet-based Open and Extensible Resource Model for Research Data Infrastructures.}, | ||
+ | author={Frosini, Luca and Pagano, Pasquale}, | ||
+ | journal={Grey Journal (TGJ)}, | ||
+ | volume={14}, | ||
+ | number={2}, | ||
+ | year={2018} | ||
+ | } | ||
+ | </pre> | ||
+ | |||
+ | == IS Model == | ||
+ | |||
+ | The [[#IS_Model|Information System Model]] (henceforth IS Model) is a graph model with Entities as nodes and Relations as edges. | ||
+ | |||
+ | [[File:Is-model.png|800px]] | ||
+ | <br /> <br /> | ||
+ | [[File:Is-model-er.png|500px]] | ||
+ | |||
+ | * Two typologies of '''entities''' are envisaged: | ||
+ | ** '''[[#Resources | Resources]]''', i.e. entities representing a description of "thing" to be managed; | ||
+ | *** Every Resource is described by a number of [[#Facets | Facets]]. | ||
+ | ** '''[[#Facets | Facets]]''', i.e. entities contributing to "build" a description of a Resource. Every facet, once attached to a Resource profile captures a certain aspect / characterization of the resource; | ||
+ | *** Every facet is characterised by a number of [[#Properties| properties]]; | ||
+ | |||
+ | * Two typologies of '''[[#Relations|relations]]''' are envisaged: | ||
+ | ** '''[[#isRelatedTo | isRelatedTo]]''', i.e. a relation linking any two [[#Resources | Resources]]. | ||
+ | ** '''[[#ConsistsOf | ConsistsOf]]''', i.e. a relation connecting each [[#Resources | Resource]] with one of the [[#Facets | Facets]] characterizing it; | ||
+ | |||
+ | * Each entity and relation | ||
+ | ** has an '''[[#Header|header]]''' automatically generated for the sake of identification and provenance of the specific information; | ||
+ | ** can be '''specialized''' | ||
+ | *** A number of specializations are identified below. Such specializations are managed by the gCube Core services, i.e. Core services builds upon these specializations to realize its management tasks; | ||
+ | *** Other specializations can be defined by clients, the system make it possible to store these additional typologies of relations and facets and to discover them. | ||
+ | * Facet and Relation instances can have additional [[#Properties| properties]] which are not defined in the schema (henceforth schema-mixed mode). | ||
+ | * On relations: | ||
+ | ** Any relation has a direction, i.e. a "source" ('''out''' bound of the relation) and a "target" ('''in''' bound of the relation). Anyway, the relation can be also navigated in the opposite direction; | ||
+ | ** It is not permitted to define a Relation having a Facet as "source". In other words: | ||
+ | *** It is not permitted to define a Relation connecting a Facet with another one; | ||
+ | *** It is not permitted to define a Relation connecting a Facet with a Resource (as target); | ||
+ | ** A Facet instance can be linked (by [[#ConsistsOf | ConsistsOf]] or any specialization of it) from different Resources. | ||
+ | |||
+ | We derived the term Facet directly from the dictionary definition. Merriam Webster Dictionary defines facet as “any of the definable aspects that make up a subject (as of contemplation) or an object (as of consideration)”<ref>https://www.merriam-webster.com/dictionary/facet</ref>. | ||
+ | The Free Dictionary defines a facet as “One of numerous aspects, as of a subject” <ref>https://www.thefreedictionary.com/facet</ref>. | ||
+ | |||
+ | |||
+ | === Type Attributes === | ||
+ | |||
+ | Any attribute defined in the type schema is characterised by: | ||
+ | |||
+ | * '''Name''' : Property Name | ||
+ | * '''Type''' : The Type of the Property (e.g. String, Integer, ...). It can be a [[#Basic_Types|Basic Type]] or a [[#Derived_Types|Derived Type]] or a [[#Complex_Types|Complex Type]] | ||
+ | * '''Description''' : The description of the Property. <code>default=null</code>. | ||
+ | * '''Mandatory''' ('''M'''): Indicate if the Property is mandatory. <code>default=false</code>. | ||
+ | * '''ReadOnly''' ('''RO'''): The Property cannot change its value. <code>default=false</code>. | ||
+ | * '''NotNull''' ('''NN'''): Whether the property must assume a value diverse from 'null' or not. <code>default=false</code> | ||
+ | * '''Max''' ('''Max'''): <code>default=null</code> | ||
+ | * '''Min''' ('''Min'''): <code>default=null</code> | ||
+ | * '''Regex''' ('''Reg''')): A [https://en.wikipedia.org/wiki/Regular_expression Regular Expression] to validate the property value, <code>default=null</code>. A good online tool for regex is avalable at [https://regex101.com/ https://regex101.com/] | ||
+ | |||
+ | ==== Basic Types ==== | ||
{|class="wikitable" | {|class="wikitable" | ||
− | + | ! Type | |
− | + | ! Java type | |
− | + | ! Description | |
|- | |- | ||
− | | | + | | Boolean |
− | | | + | | <code>java.lang.Boolean</code> or <code>boolean</code> |
− | | | + | | Handles only the values <em>True</em> or <em>False</em>. |
|- | |- | ||
− | | | + | | Integer |
− | | | + | | <code>java.lang.Integer</code> or <code>int</code> or <code>java.math.BigInteger</code> |
− | + | | 32-bit signed Integers. | |
− | + | ||
|- | |- | ||
− | | | + | | Short |
− | | | + | | <code>java.lang.Short</code> or <code>short</code> |
− | | ..... | + | | Small 16-bit signed integers. |
+ | |- | ||
+ | | Long | ||
+ | | <code>java.lang.Long</code> or <code>long</code> | ||
+ | | Big 64-bit signed integers. | ||
+ | |- | ||
+ | | Float | ||
+ | | <code>java.lang.Float</code> or <code>float</code> | ||
+ | | Decimal numbers. | ||
+ | |- | ||
+ | | Double | ||
+ | | <code>java.lang.Double</code> or <code>double</code> | ||
+ | | Decimal numbers with high precision. | ||
+ | |- | ||
+ | | Date | ||
+ | | <code>java.util.Date</code> | ||
+ | | Any date with the precision up to milliseconds. | ||
|- | |- | ||
− | |||
| String | | String | ||
− | | | + | | <code>java.lang.String</code> |
+ | | Any string as alphanumeric sequence of chars. | ||
|- | |- | ||
− | | | + | | Byte |
− | + | | <code>java.lang.Byte</code> or <code>byte</code> | |
− | | .... | + | | Single byte. useful to store small 8-bit signed integers. |
|- | |- | ||
− | | | + | | Binary |
− | | | + | | <code>java.lang.Byte[]</code> or <code>byte[]</code> |
− | | | + | | Can contain any value as byte array. |
− | + | ||
− | + | ||
− | + | ||
− | + | ||
|} | |} | ||
− | === | + | ==== Derived Types ==== |
− | The | + | The following are obtained using a String as real type and adding a validation regex. |
{|class="wikitable" | {|class="wikitable" | ||
− | + | ! Type | |
− | + | ! Java type | |
− | + | ! Description | |
|- | |- | ||
− | | | + | | Enum |
− | | | + | | <code>java.lang.Enum</code> or <code>enum</code> |
− | | | + | | by default it is represented using the String representation of the Enum. So that the primitive type used will be String. The enumeration is checked by setting <code>Regexpr</code> property. The Regular Expression is auto-generated and it will be something like '''<code>^(FIRST-ENUM-STRING_REPRESENTATION<nowiki>|</nowiki>SECOND-ENUM-STRING_REPRESENTATION<nowiki>|</nowiki>...<nowiki>|</nowiki>LAST_ENUM_STRING_REPRESENTATION)$</code>'''. |
− | ( | + | Otherwise (if indicated using an annotation), it can be represented using the Integer value of the Enum. So that the primitive type used will be Integer. The enumeration is checked using <code>Max</code> and <code>Min</code> properties. |
+ | |- | ||
+ | | UUID | ||
+ | | <code>java.util.UUID</code> | ||
+ | | String representation of the UUID. The check is obtained using the regular expression '''<code>^([a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[a-fA-F0-9]{4}-[a-fA-F0-9]{4}-[a-fA-F0-9]{12}){1}$</code>''' | ||
|- | |- | ||
− | |||
| URL | | URL | ||
− | | ... | + | | <code>java.net.URL</code> |
+ | | String representation of the URL. No check actually. | ||
|- | |- | ||
− | | | + | | URI |
− | | | + | | <code>java.net.URI</code> |
− | | . | + | | String representation of the URI. No check actually. |
|- | |- | ||
− | | | + | | TypeVersion |
− | | | + | | <code>org.gcube.informationsystem.utils.TypeVersion</code> |
− | | ... | + | | A type representing and validating a version in the following format X.X.X Major(Integer).Minor(Integer).Revision(Integer) (e.g 1.0.0, 2.3.0, 2.0.1). The check is obtained using the regular expression '''<code>^[1-9][0-9]{0,}\.(0<nowiki>|</nowiki>([1-9][0-9]{0,}))\.(0<nowiki>|</nowiki>([1-9][0-9]{0,}))$</code>'''. |
|} | |} | ||
− | === | + | ==== Complex Types ==== |
− | + | Any property defined by composing basic types, complex types and other complex types. Any complex type can be defined by extending [[#Property|Property]] type. | |
{|class="wikitable" | {|class="wikitable" | ||
− | + | ! Type | |
− | + | ! Java type | |
− | + | ! Description | |
|- | |- | ||
− | | | + | | Property |
− | | | + | | <code>? extends org.gcube.informationsystem.model.reference.properties.Property</code> |
− | | . | + | | This is an Object contained inside the owner Entity and has no [[#Header|Header]]. It is reachable only by navigating the owner Entity/Relation. |
|- | |- | ||
− | | | + | | <del>Property list</del> |
− | | | + | | <del><code>List<? extends org.gcube.informationsystem.model.reference.properties.Property></code></del> |
− | | .. | + | | <del>List of Objects contained inside the owner Entity and have no [[#Header|Header]]. They are reachable only by navigating the owner Entity/Relation.</del> |
|- | |- | ||
− | | | + | | <del>Property set</del> |
− | | | + | | <del><code>Set<? org.gcube.informationsystem.model.reference.properties.Property></code></del> |
− | | ..... | + | | <del>Set (no duplicates) of Objects contained inside the owner Entity and have no [[#Header|Header]]. They are reachable only by navigating the owner Entity/Relation.</del> |
+ | |- | ||
+ | | Property map | ||
+ | | <code>Map<String, ? extends org.gcube.informationsystem.model.reference.properties.Propertyd></code> | ||
+ | | Map of Objects contained inside the owner Entity and have no [[#Header|Header]]. They are reachable only by navigating the owner Entity/Relation. | ||
|} | |} | ||
− | === | + | === Property === |
− | + | It does not define any field. It is just used as a base class. | |
− | + | The Java Interface declaration for such a type is available at: | |
− | + | https://code-repo.d4science.org/gCubeSystem/information-system-model/src/branch/master/src/main/java/org/gcube/informationsystem/model/reference/properties/Property.java | |
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | === | + | ===== Header ===== |
− | + | Every Entity and Relation has an Header automatically created/updated by the System. | |
{|class="wikitable" | {|class="wikitable" | ||
− | | | + | |+ Header <code>''extends''</code> Property |
− | + | ! Name | |
− | + | ! Type | |
+ | ! Attributes | ||
+ | ! Description | ||
|- | |- | ||
− | | | + | | uuid |
− | | | + | | UUID |
− | | | + | | <code>Mandatory=true</code> <br/><code>NotNull=true</code> <br/><code>ReadOnly=true</code> |
− | + | | This UUID is be used to identify the Entity or the Relation univocally. | |
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
|- | |- | ||
− | | | + | | createdBy |
| String | | String | ||
− | | . | + | | <code>Mandatory=true</code> <br/><code>NotNull=true</code> <br/><code>ReadOnly=true</code> |
+ | | The user that created the Entity or the Relation. It is initialized at creation time. | ||
|- | |- | ||
− | | | + | | creationTime |
− | | | + | | Date |
− | | | + | | <code>Mandatory=true</code> <br/><code>NotNull=true</code> <br/><code>ReadOnly=true</code> |
− | + | | Creation time. | |
− | + | ||
− | === | + | |
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | | | + | |
|- | |- | ||
− | | | + | | lastUpdateBy |
| String | | String | ||
− | | . | + | | <code>Mandatory=true</code> <br/><code>NotNull=true</code> |
+ | | The user that made the last update to the Entity or the Relation. At creation time, it assumes the same value of creator. | ||
|- | |- | ||
− | | | + | | lastUpdateTime |
− | | | + | | Date |
− | | | + | | <code>Mandatory=true</code> <br/><code>NotNull=true</code> |
− | | | + | | Last Update time. At creation time it assumes the same value of creationTime. |
− | + | ||
− | + | ||
− | + | ||
|} | |} | ||
− | |||
− | The | + | The Java Interface declaration for such a type is available at: |
− | + | https://code-repo.d4science.org/gCubeSystem/information-system-model/src/branch/master/src/main/java/org/gcube/informationsystem/model/reference/properties/Header.java | |
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | === | + | ===== PropagationConstraint ===== |
− | + | At any time entities and relations can be added or removed to/from a context or deleted. | |
− | + | The PropagationConstraint property contained in each relation is a predefined Property type which indicates the behaviour to be held on a target entity when an event related to a context occurs in the source resource or directly to the relation. | |
− | The | + | |
{|class="wikitable" | {|class="wikitable" | ||
− | | | + | |+ PropagationConstraint <code>''extends''</code> Property |
− | + | ! Name | |
− | + | ! Type | |
+ | ! Attributes | ||
+ | ! Description | ||
|- | |- | ||
− | | | + | | remove |
− | | | + | | Enum |
− | | . | + | | <code>Regex=(cascadeWhenOrphan<nowiki>|</nowiki>cascade<nowiki>|</nowiki>keep)</code> |
+ | | It indicates the behaviour to implement for the target Entity when a 'remove' action is performed on the source Resource. Remove actions are: (i) the operation of removing an instance from a context; (ii) the operation of deleting an instance (it has an impact on all contexts). | ||
|- | |- | ||
− | | | + | | add |
− | | | + | | Enum |
− | | . | + | | <code>Regex=(propagate<nowiki>|</nowiki>unpropagate)</code> |
+ | | It indicates the behaviour to implement for the target Entity when an 'add' action is performed on the source Resource. Add action is the operation of adding an instance to a context. | ||
|} | |} | ||
− | |||
− | + | Remove values; | |
+ | * cascadeWhenOrphan: When a remove action is performed on the source Entity of the relation, or directly on the relation, then the same remove action apart on the relation is performed to the target entity if it has no other incoming relations. | ||
+ | * cascade: When a remove action is performed on the source Entity of the relation, or directly on the relation, then the same remove action is performed on the relation and its target entity. | ||
+ | * keep: When a remove action is performed on the source Entity of the relation, or directly on the relation, then the same remove action is performed on relation but never to the target entity. | ||
− | |||
− | + | Add values; | |
− | + | ||
− | + | * propagate: When an 'add' action is performed on the source Entity of the relation, or directly on the relation, then the same add action is performed on the relation and its target Entity. | |
+ | * unpropagate: When an 'add' action is performed on the source Entity of the relation, is performed on source relation only. Trying to perform an 'add' action on the relation has no effects. | ||
− | |||
− | + | Any [[#Relation|Relation]] contains such a property. If the values are not specified at creation time the system initialize it with the following rules: | |
− | + | ||
− | + | ||
− | | . | + | |
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | === | + | * [[#ConsistsOf | ConsistsOf Relation]] : <code>remove=cascade</code>, <code>add=propagate</code> |
+ | * [[#isRelatedTo | IsRelatedTo Relation]] : <code>remove=keep</code>, <code>add=unpropagate</code> | ||
− | |||
− | + | The Java Interface declaration for such a type is available at: | |
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | https://code-repo.d4science.org/gCubeSystem/information-system-model/src/branch/master/src/main/java/org/gcube/informationsystem/model/reference/properties/PropagationConstraint.java | |
− | + | ===== Encrypted ===== | |
{|class="wikitable" | {|class="wikitable" | ||
− | | | + | |+ Encrypted <code>''extends''</code> Property |
− | + | ! Name | |
− | + | ! Type | |
+ | ! Attributes | ||
+ | ! Description | ||
|- | |- | ||
− | | | + | | value |
| String | | String | ||
− | | ... | + | | |
+ | | The encrypted value. The resource registry store safely the value. When received the value is decrypted using the key of current context and store the value safely. When the value is read, the resource-registry retrieve the value and encrypt it with the key of current context. | ||
|} | |} | ||
− | + | The Java Interface declaration for such a type is available at: | |
− | + | https://code-repo.d4science.org/gCubeSystem/information-system-model/src/branch/master/src/main/java/org/gcube/informationsystem/model/reference/properties/Encrypted.java | |
− | + | === Entity === | |
− | |||
− | |||
− | |||
{|class="wikitable" | {|class="wikitable" | ||
− | | | + | |+ <code>Abstract</code> Entity |
− | + | ||
− | + | ||
|- | |- | ||
− | | | + | | colspan=5 | '''Goal:''' This is the base type for any entity. |
− | | | + | |
− | + | ||
|- | |- | ||
− | | | + | ! colspan=5 | Properties |
− | | | + | |- |
− | | | + | ! Name |
+ | ! Type | ||
+ | ! Attributes | ||
+ | ! colspan=2 | Description | ||
|- | |- | ||
− | | | + | | header |
− | | | + | | [[#Header | Header]] |
− | | | + | | <code>Mandatory=true</code> <br/><code>NotNull=true</code> <br/><code>ReadOnly=true</code> |
+ | | colspan=2 | A distinguishing string to be used by clients to identify the access point of interest. | ||
|} | |} | ||
− | + | The Java Interface declaration for such a type is available at: | |
− | + | https://code-repo.d4science.org/gCubeSystem/information-system-model/src/branch/master/src/main/java/org/gcube/informationsystem/model/reference/entities/Entity.java | |
− | + | ==== Resource ==== | |
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | {| class="wikitable" | |
− | + | |+ <code>Abstract</code> Resource '''<code>extends</code>''' [[#Entity|Entity]] | |
− | + | ||
− | + | ||
− | {|class="wikitable" | + | |
− | | | + | |
− | + | ||
− | + | ||
|- | |- | ||
− | | | + | | colspan=5 | '''Scope:''' This entity is conceived to describe every "main thing" to be registered and discovered by the Information System. |
− | | | + | |
− | + | ||
|- | |- | ||
− | + | ! Source | |
− | + | ! Relation | |
− | + | ! Multiplicity | |
+ | ! Target | ||
+ | ! Description | ||
|- | |- | ||
− | | | + | ! colspan=5 | Facets |
− | + | ||
− | + | ||
|- | |- | ||
− | | | + | | [[#Resource|Resource]] |
− | | | + | | [[#ConsistsOf|ConsistsOf]] |
− | | | + | | align=center | 1..n |
+ | | [[#Facet|Facet]] | ||
+ | | Any Resource consists of one or more Facets that describes the different aspects of the resource. | ||
|- | |- | ||
− | | | + | ! colspan=5 | Relations |
− | + | ||
− | + | ||
|- | |- | ||
− | | | + | | [[#Resource|Resource]] |
− | | | + | | [[#isRelatedTo|isRelatedTo]] |
− | | ... | + | | align=center | 0..n |
+ | | [[#Resource|Resource]] | ||
+ | | Any Resource can be related to any other resource. | ||
|} | |} | ||
− | + | The Java Interface declaration for such a type is available at: | |
− | + | https://code-repo.d4science.org/gCubeSystem/information-system-model/src/branch/master/src/main/java/org/gcube/informationsystem/model/reference/entities/Resource.java | |
− | + | ==== Facet ==== | |
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | Early ideas and thinking on facets were documented at [[Resource_Model_(2nd_generation)#Facets | 2nd Generation Resource Model: Facets]] | |
− | + | Facets are collections of attributes conceived to capture a certain feature/aspect of the [[#Resource | Resource]] they are associated with. | |
+ | Every facet can define zero or more [[#Property|properties]]. Besides the per-facet envisaged properties, clients can add new ones. | ||
{|class="wikitable" | {|class="wikitable" | ||
− | | | + | |+ <code>Abstract</code> Facet '''<code>extends</code>''' [[#Entity|Entity]] |
− | | | + | |
− | + | ||
|- | |- | ||
− | | | + | | colspan=5 | '''Goal:''' This is the base type for any Facet. |
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | = | + | |
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
|- | |- | ||
− | | | + | ! colspan=5 | Known Usage |
− | | | + | |- |
− | | | + | ! Source |
+ | ! Relation | ||
+ | ! Multiplicity | ||
+ | ! Target | ||
+ | ! Description | ||
+ | |- | ||
+ | | [[#Resource|Resource]] | ||
+ | | [[#ConsistsOf|ConsistsOf]] | ||
+ | | align=center | 1..n | ||
+ | | [[#Facet|Facet]] | ||
+ | | Any Resource consist of one or more Facets which describes the different aspects of the resource. | ||
|} | |} | ||
− | |||
− | + | The Java Interface declaration for such a type is available at: | |
− | + | https://code-repo.d4science.org/gCubeSystem/information-system-model/src/branch/master/src/main/java/org/gcube/informationsystem/model/reference/entities/Facet.java | |
− | == | + | === Relation === |
− | + | Every relation has: | |
+ | * An [[#Header | Header]] | ||
+ | * A [[#PropagationConstraint|PropagationConstraint]] | ||
+ | * Zero or More [[#Property|properties]] (not necessarily predefined, similarly to [[#Facets|Facets]]). | ||
− | + | The Java Interface declaration for such a type is available at: | |
− | The | + | |
− | + | https://code-repo.d4science.org/gCubeSystem/information-system-model/src/branch/master/src/main/java/org/gcube/informationsystem/model/reference/relations/Relation.java | |
− | + | ==== IsRelatedTo ==== | |
− | + | {|class="wikitable" | |
− | + | |+ IsRelatedTo <code>''extends''</code> Relation | |
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
|- | |- | ||
− | ! | + | ! Source |
− | ! Multiplicity | + | ! Relation |
+ | ! Multiplicity | ||
+ | ! Target | ||
! Description | ! Description | ||
|- | |- | ||
− | | [[# | + | | [[#Resources|Resource]] |
− | + | | [[#IsRelatedTo|IsRelatedTo]] | |
− | + | | align=center | 0..n | |
− | + | | [[#Resources|Resource]] | |
− | + | | A relation linking any two [[#Resources|Resources]]. | |
− | + | ||
− | | [[# | + | |
− | | align=center| | + | |
− | | | + | |
− | | | + | |
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
|} | |} | ||
+ | The Java Interface declaration for such a type is available at: | ||
− | + | https://code-repo.d4science.org/gCubeSystem/information-system-model/src/branch/master/src/main/java/org/gcube/informationsystem/model/reference/relations/IsRelatedTo.java | |
− | + | ==== ConsistsOf ==== | |
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | {|class="wikitable" | |
− | + | |+ ConsistsOf <code>''extends''</code> Relation | |
− | + | ||
− | {| class="wikitable" | + | |
− | |+ | + | |
− | + | ||
|- | |- | ||
− | ! | + | ! Source |
− | ! Multiplicity | + | ! Relation |
+ | ! Multiplicity | ||
+ | ! Target | ||
! Description | ! Description | ||
|- | |- | ||
− | | [[# | + | | [[#Resources|Resource]] |
+ | | [[#ConsistsOf|ConsistsOf]] | ||
| align=center | 1..n | | align=center | 1..n | ||
− | | | + | | [[#Facet|Facet]] |
− | | | + | | A relation connecting each [[#Resource|Resource]] with one of the [[#Facet|Facet]] characterizing it. |
− | + | ||
− | | | + | |
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | | | + | |
|} | |} | ||
− | |||
− | + | The Java Interface declaration for such a type is available at: | |
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | https://code-repo.d4science.org/gCubeSystem/information-system-model/src/branch/master/src/main/java/org/gcube/informationsystem/model/reference/relations/ConsistsOf.java | |
− | + | === Internal Entity and Relation === | |
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | For internal use only are defined the following entity and relation: | |
− | + | * [[#Context|Context]] | |
− | | | + | * [[#IsParentOf|IsParentOf]] |
− | + | ||
− | + | ==== Context ==== | |
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | Model a Context (aka scope) in the same Application Domain. | |
− | {| class="wikitable" | + | {|class="wikitable" |
− | |+ | + | |+ Context |
− | + | ||
|- | |- | ||
− | + | | colspan=5 | '''Goal:''' Models a Context (aka scope). | |
− | + | ||
− | + | ||
|- | |- | ||
− | + | ! colspan=5 | Properties | |
− | + | ||
− | | | + | |
|- | |- | ||
− | + | ! Name | |
− | + | ! Type | |
− | | | + | ! Attributes |
+ | ! colspan=2 | Description | ||
|- | |- | ||
− | + | | name | |
+ | | String | ||
+ | | <code>Mandatory=true</code> <br/> <code>NotNull=true</code> | ||
+ | | colspan=2 | The name of the context. Two [[#Context|Context]] with the same name can exist but they cannot have the same parent. In other words, a [[#Context|Context]] cannot have two children with the same name. | ||
|- | |- | ||
− | + | ! colspan=5 | Known Usage | |
− | + | ||
− | | | + | |
|- | |- | ||
− | ! | + | ! Source |
+ | ! Relation | ||
+ | ! Multiplicity | ||
+ | ! Target | ||
+ | ! Description | ||
|- | |- | ||
− | | | + | | [[#Context|Context]] |
− | | align=center | .. | + | | [[#IsParentOf|IsParentOf]] |
+ | | align=center | 0..n | ||
+ | | [[#Context|Context]] | ||
| ... | | ... | ||
|} | |} | ||
− | ==== | + | ==== IsParentOf ==== |
− | {| class="wikitable" | + | This relation has no propagation constraint. |
− | + | ||
+ | {|class="wikitable" | ||
|- | |- | ||
− | ! | + | ! Source |
− | + | ! Relation | |
− | ! | + | ! Multiplicity |
− | ! Multiplicity | + | ! Target |
! Description | ! Description | ||
|- | |- | ||
+ | | [[#Context|Context]] | ||
+ | | [[#IsParentOf|IsParentOf]] | ||
+ | | align=center | 0..n | ||
+ | | [[#Context|Context]] | ||
| ... | | ... | ||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
|} | |} | ||
− | === | + | === Best practices and guidelines === |
− | + | * On Facet instances "reuse" across Resource Profiles: | |
− | + | ** This can be guaranteed automatically by the system, if and just in the case the system wants to avoid duplication of information. It is based on a configuration policy; | |
− | + | ** This MUST be done only when a change in a facet instance MUST affect a change in all Resources connected to such a Facet. | |
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | |||
− | + | === Maven coordinates === | |
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | To use the Java library containing the classes modelling the IS Model you can declare the following dependency: | |
− | + | <source lang="xml"> | |
− | + | <dependency> | |
− | + | <groupId>org.gcube.information-system</groupId> | |
− | + | <artifactId>information-system-model</artifactId> | |
− | + | <version>[5.0.0,6.0.0-SNAPSHOT)</version> | |
− | + | <dependency> | |
− | + | </source> | |
− | + | ||
− | + | == gCube Model == | |
− | + | ||
− | + | An example of instantiation of the IS model is the [[gCube Model]]. | |
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + |
Latest revision as of 18:15, 26 January 2023
The Information System Model (henceforth IS Model) is used by Information System Resource Registry
Disclaimer
This Model is part of research conducted in the context of a PhD. This wiki page represents just a partial view of the full rationale of the research. To have a complete overview of the rationale of the model, please refer to the PhD thesis which is publicly available at:
https://etd.adm.unipi.it/t/etd-05102019-114151/
https://openportal.isti.cnr.it/doc?id=people______::470484e51fcb9e307a418c800efc44c8
If you need to refer to such work you can cite the PhD Thesis.
BibText:
@phdthesis{frosini2019transactional, title={Transactional REST Information System for Federated Research Infrastructures enabling Virtual Research Environments}, author={Frosini, Luca}, year={2019}, school={UNIVERSIT{\`A} DI PISA} }
An previous paper about this work is:
BibText:
@article{frosini2018facet, title={A Facet-based Open and Extensible Resource Model for Research Data Infrastructures.}, author={Frosini, Luca and Pagano, Pasquale}, journal={Grey Journal (TGJ)}, volume={14}, number={2}, year={2018} }
IS Model
The Information System Model (henceforth IS Model) is a graph model with Entities as nodes and Relations as edges.
- Two typologies of entities are envisaged:
- Resources, i.e. entities representing a description of "thing" to be managed;
- Every Resource is described by a number of Facets.
- Facets, i.e. entities contributing to "build" a description of a Resource. Every facet, once attached to a Resource profile captures a certain aspect / characterization of the resource;
- Every facet is characterised by a number of properties;
- Resources, i.e. entities representing a description of "thing" to be managed;
- Two typologies of relations are envisaged:
- isRelatedTo, i.e. a relation linking any two Resources.
- ConsistsOf, i.e. a relation connecting each Resource with one of the Facets characterizing it;
- Each entity and relation
- has an header automatically generated for the sake of identification and provenance of the specific information;
- can be specialized
- A number of specializations are identified below. Such specializations are managed by the gCube Core services, i.e. Core services builds upon these specializations to realize its management tasks;
- Other specializations can be defined by clients, the system make it possible to store these additional typologies of relations and facets and to discover them.
- Facet and Relation instances can have additional properties which are not defined in the schema (henceforth schema-mixed mode).
- On relations:
- Any relation has a direction, i.e. a "source" (out bound of the relation) and a "target" (in bound of the relation). Anyway, the relation can be also navigated in the opposite direction;
- It is not permitted to define a Relation having a Facet as "source". In other words:
- It is not permitted to define a Relation connecting a Facet with another one;
- It is not permitted to define a Relation connecting a Facet with a Resource (as target);
- A Facet instance can be linked (by ConsistsOf or any specialization of it) from different Resources.
We derived the term Facet directly from the dictionary definition. Merriam Webster Dictionary defines facet as “any of the definable aspects that make up a subject (as of contemplation) or an object (as of consideration)”[1]. The Free Dictionary defines a facet as “One of numerous aspects, as of a subject” [2].
Type Attributes
Any attribute defined in the type schema is characterised by:
- Name : Property Name
- Type : The Type of the Property (e.g. String, Integer, ...). It can be a Basic Type or a Derived Type or a Complex Type
- Description : The description of the Property.
default=null
. - Mandatory (M): Indicate if the Property is mandatory.
default=false
. - ReadOnly (RO): The Property cannot change its value.
default=false
. - NotNull (NN): Whether the property must assume a value diverse from 'null' or not.
default=false
- Max (Max):
default=null
- Min (Min):
default=null
- Regex (Reg)): A Regular Expression to validate the property value,
default=null
. A good online tool for regex is avalable at https://regex101.com/
Basic Types
Type | Java type | Description |
---|---|---|
Boolean | java.lang.Boolean or boolean
|
Handles only the values True or False. |
Integer | java.lang.Integer or int or java.math.BigInteger
|
32-bit signed Integers. |
Short | java.lang.Short or short
|
Small 16-bit signed integers. |
Long | java.lang.Long or long
|
Big 64-bit signed integers. |
Float | java.lang.Float or float
|
Decimal numbers. |
Double | java.lang.Double or double
|
Decimal numbers with high precision. |
Date | java.util.Date
|
Any date with the precision up to milliseconds. |
String | java.lang.String
|
Any string as alphanumeric sequence of chars. |
Byte | java.lang.Byte or byte
|
Single byte. useful to store small 8-bit signed integers. |
Binary | java.lang.Byte[] or byte[]
|
Can contain any value as byte array. |
Derived Types
The following are obtained using a String as real type and adding a validation regex.
Type | Java type | Description |
---|---|---|
Enum | java.lang.Enum or enum
|
by default it is represented using the String representation of the Enum. So that the primitive type used will be String. The enumeration is checked by setting Regexpr property. The Regular Expression is auto-generated and it will be something like ^(FIRST-ENUM-STRING_REPRESENTATION|SECOND-ENUM-STRING_REPRESENTATION|...|LAST_ENUM_STRING_REPRESENTATION)$ .
Otherwise (if indicated using an annotation), it can be represented using the Integer value of the Enum. So that the primitive type used will be Integer. The enumeration is checked using |
UUID | java.util.UUID
|
String representation of the UUID. The check is obtained using the regular expression ^([a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[a-fA-F0-9]{4}-[a-fA-F0-9]{4}-[a-fA-F0-9]{12}){1}$
|
URL | java.net.URL
|
String representation of the URL. No check actually. |
URI | java.net.URI
|
String representation of the URI. No check actually. |
TypeVersion | org.gcube.informationsystem.utils.TypeVersion
|
A type representing and validating a version in the following format X.X.X Major(Integer).Minor(Integer).Revision(Integer) (e.g 1.0.0, 2.3.0, 2.0.1). The check is obtained using the regular expression ^[1-9][0-9]{0,}\.(0|([1-9][0-9]{0,}))\.(0|([1-9][0-9]{0,}))$ .
|
Complex Types
Any property defined by composing basic types, complex types and other complex types. Any complex type can be defined by extending Property type.
Type | Java type | Description |
---|---|---|
Property | ? extends org.gcube.informationsystem.model.reference.properties.Property
|
This is an Object contained inside the owner Entity and has no Header. It is reachable only by navigating the owner Entity/Relation. |
|
List<? extends org.gcube.informationsystem.model.reference.properties.Property> |
|
|
Set<? org.gcube.informationsystem.model.reference.properties.Property> |
|
Property map | Map<String, ? extends org.gcube.informationsystem.model.reference.properties.Propertyd>
|
Map of Objects contained inside the owner Entity and have no Header. They are reachable only by navigating the owner Entity/Relation. |
Property
It does not define any field. It is just used as a base class.
The Java Interface declaration for such a type is available at:
Header
Every Entity and Relation has an Header automatically created/updated by the System.
Name | Type | Attributes | Description |
---|---|---|---|
uuid | UUID | Mandatory=true NotNull=true ReadOnly=true
|
This UUID is be used to identify the Entity or the Relation univocally. |
createdBy | String | Mandatory=true NotNull=true ReadOnly=true
|
The user that created the Entity or the Relation. It is initialized at creation time. |
creationTime | Date | Mandatory=true NotNull=true ReadOnly=true
|
Creation time. |
lastUpdateBy | String | Mandatory=true NotNull=true
|
The user that made the last update to the Entity or the Relation. At creation time, it assumes the same value of creator. |
lastUpdateTime | Date | Mandatory=true NotNull=true
|
Last Update time. At creation time it assumes the same value of creationTime. |
The Java Interface declaration for such a type is available at:
PropagationConstraint
At any time entities and relations can be added or removed to/from a context or deleted. The PropagationConstraint property contained in each relation is a predefined Property type which indicates the behaviour to be held on a target entity when an event related to a context occurs in the source resource or directly to the relation.
Name | Type | Attributes | Description |
---|---|---|---|
remove | Enum | Regex=(cascadeWhenOrphan|cascade|keep)
|
It indicates the behaviour to implement for the target Entity when a 'remove' action is performed on the source Resource. Remove actions are: (i) the operation of removing an instance from a context; (ii) the operation of deleting an instance (it has an impact on all contexts). |
add | Enum | Regex=(propagate|unpropagate)
|
It indicates the behaviour to implement for the target Entity when an 'add' action is performed on the source Resource. Add action is the operation of adding an instance to a context. |
Remove values;
- cascadeWhenOrphan: When a remove action is performed on the source Entity of the relation, or directly on the relation, then the same remove action apart on the relation is performed to the target entity if it has no other incoming relations.
- cascade: When a remove action is performed on the source Entity of the relation, or directly on the relation, then the same remove action is performed on the relation and its target entity.
- keep: When a remove action is performed on the source Entity of the relation, or directly on the relation, then the same remove action is performed on relation but never to the target entity.
Add values;
- propagate: When an 'add' action is performed on the source Entity of the relation, or directly on the relation, then the same add action is performed on the relation and its target Entity.
- unpropagate: When an 'add' action is performed on the source Entity of the relation, is performed on source relation only. Trying to perform an 'add' action on the relation has no effects.
Any Relation contains such a property. If the values are not specified at creation time the system initialize it with the following rules:
- ConsistsOf Relation :
remove=cascade
,add=propagate
- IsRelatedTo Relation :
remove=keep
,add=unpropagate
The Java Interface declaration for such a type is available at:
Encrypted
Name | Type | Attributes | Description |
---|---|---|---|
value | String | The encrypted value. The resource registry store safely the value. When received the value is decrypted using the key of current context and store the value safely. When the value is read, the resource-registry retrieve the value and encrypt it with the key of current context. |
The Java Interface declaration for such a type is available at:
Entity
Goal: This is the base type for any entity. | ||||
Properties | ||||
---|---|---|---|---|
Name | Type | Attributes | Description | |
header | Header | Mandatory=true NotNull=true ReadOnly=true
|
A distinguishing string to be used by clients to identify the access point of interest. |
The Java Interface declaration for such a type is available at:
Resource
Scope: This entity is conceived to describe every "main thing" to be registered and discovered by the Information System. | ||||
Source | Relation | Multiplicity | Target | Description |
---|---|---|---|---|
Facets | ||||
Resource | ConsistsOf | 1..n | Facet | Any Resource consists of one or more Facets that describes the different aspects of the resource. |
Relations | ||||
Resource | isRelatedTo | 0..n | Resource | Any Resource can be related to any other resource. |
The Java Interface declaration for such a type is available at:
Facet
Early ideas and thinking on facets were documented at 2nd Generation Resource Model: Facets
Facets are collections of attributes conceived to capture a certain feature/aspect of the Resource they are associated with. Every facet can define zero or more properties. Besides the per-facet envisaged properties, clients can add new ones.
Goal: This is the base type for any Facet. | ||||
Known Usage | ||||
---|---|---|---|---|
Source | Relation | Multiplicity | Target | Description |
Resource | ConsistsOf | 1..n | Facet | Any Resource consist of one or more Facets which describes the different aspects of the resource. |
The Java Interface declaration for such a type is available at:
Relation
Every relation has:
- An Header
- A PropagationConstraint
- Zero or More properties (not necessarily predefined, similarly to Facets).
The Java Interface declaration for such a type is available at:
IsRelatedTo
Source | Relation | Multiplicity | Target | Description |
---|---|---|---|---|
Resource | IsRelatedTo | 0..n | Resource | A relation linking any two Resources. |
The Java Interface declaration for such a type is available at:
ConsistsOf
Source | Relation | Multiplicity | Target | Description |
---|---|---|---|---|
Resource | ConsistsOf | 1..n | Facet | A relation connecting each Resource with one of the Facet characterizing it. |
The Java Interface declaration for such a type is available at:
Internal Entity and Relation
For internal use only are defined the following entity and relation:
Context
Model a Context (aka scope) in the same Application Domain.
Goal: Models a Context (aka scope). | ||||
Properties | ||||
---|---|---|---|---|
Name | Type | Attributes | Description | |
name | String | Mandatory=true NotNull=true
|
The name of the context. Two Context with the same name can exist but they cannot have the same parent. In other words, a Context cannot have two children with the same name. | |
Known Usage | ||||
Source | Relation | Multiplicity | Target | Description |
Context | IsParentOf | 0..n | Context | ... |
IsParentOf
This relation has no propagation constraint.
Source | Relation | Multiplicity | Target | Description |
---|---|---|---|---|
Context | IsParentOf | 0..n | Context | ... |
Best practices and guidelines
- On Facet instances "reuse" across Resource Profiles:
- This can be guaranteed automatically by the system, if and just in the case the system wants to avoid duplication of information. It is based on a configuration policy;
- This MUST be done only when a change in a facet instance MUST affect a change in all Resources connected to such a Facet.
Maven coordinates
To use the Java library containing the classes modelling the IS Model you can declare the following dependency:
<dependency> <groupId>org.gcube.information-system</groupId> <artifactId>information-system-model</artifactId> <version>[5.0.0,6.0.0-SNAPSHOT)</version> <dependency>