Defining datamodels with a JSON schema specification
TODO, see https://gitlab.com/caosdb/caosdb-advanced-user-tools/-/issues/42
Further information
Pattern Properties
The JSON-schema parser has rudimentary support for patternProperties. Since
their names (only the pattern that their names will suffice) are not known a
priori, we create RecordTypes for all pattern properties. The names of these
RecordTypes are created from their parent element’s name by appending the string
"Entry" and possibly a number if there are more than one pattern properties
for one parent.
All the RecordTypes created for pattern properties have at least an obligatory
__matched_pattern property which will – as the name suggests – store the
matched pattern of an actual data entry.
Note
The __matched_pattern property is added automatically to your datamodel
as soon as there is at least one pattern property in your JSON schema. So be
sure that you don’t happen to have an entity with exactly this name in your
database.
E.g., a json schema with
"dataset": {
"patternProperties": {
"^[0-9]{4,4}": {
"type": "boolean"
},
"^[0-9]{4,4}-[0-9]{2,2}-[0-9]{2,2}": {
"type": "object",
"properties": {
"date_id": {
"$ref": "#/definitions/uuid"
}
}
}
}
}
Would result in a Dataset RecordType that has the two properties
DatasetEntry_1 and DatasetEntry_2 (as always, name can be overwritten
explicitly by specifying the title property), referencing corresponding
DatasetEntry_1 and DatasetEntry_2 Records.
Apart from the aforementioned __matched_pattern property, DatasetEntry_1
also has the DatasetEntry_1_value property with datatype BOOLEAN, that
stores the actual value. In turn, DatasetEntry_2 is of type: object and
is treated like any other RecordType. Consequently, it has, appart from the
__matched_pattern property, a date_id property as specified in its
properties.
Array entries without items specification
JSON schema allows for properties of type: array without the items
specification that consequently can be arrays of any (and of mixed) types. While
this is in general problematic when specifying a data model, sometimes these
properties cannot be specified further, e.g., when you’re using an external
schema that you cannot change.
These properties can still be added to your datamodel by specifying their types
explicitly in a dictionary or, alternatively, they can be ignored. See the
types_for_missing_array_items and ignore_unspecified_array_items
parameters of models.parser.JsonSchemaParser, respectively, for more
information.