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.