Constraints are an EdgeDB mechanism that provides fine-grained control
            over which data is considered valid.  A constraint may be defined on a
            scalar type, an
            object type, a
            concrete link, or a
            concrete property.  In case of a
            constraint on a scalar type, the subjects of the constraint are
            the instances of that scalar, thus the values that the scalar can
            take will be restricted.  Whereas for link or property constraints
            the subjects are the targets of those links or properties,
            restricting what objects or values those links and properties may
            reference.  The subject of a constraint can be referred to in
            the constraint expression as __subject__.
The standard library defines the following constraints:
Specifies the list of allowed values directly.
Example:
scalar type Status extending str {
    constraint one_of ('Open', 'Closed', 'Merged');
}Arbitrary constraint expression.
Example of using an expression constraint to create a custom
                        scalar:
scalar type starts_with_a extending str {
    constraint expression on (__subject__[0] = 'A');
}Example of using an expression constraint based on a couple of
                        object properties to restrict maximum magnitude for a vector:
type Vector {
    required property x -> float64;
    required property y -> float64;
    constraint expression on (
        __subject__.x^2 + __subject__.y^2 < 25
    );
}Specifies the maximum value for the subject.
Example:
scalar type max_100 extending int64 {
    constraint max_value(100);
}Specifies the maximum value (as an open interval) for the subject.
Example:
scalar type maxex_100 extending int64 {
    constraint max_ex_value(100);
}Specifies the maximum length of subject string representation.
Example:
scalar type Username extending str {
    constraint max_len_value(30);
}Specifies the minimum value for the subject.
Example:
scalar type non_negative extending int64 {
    constraint min_value(0);
}Specifies the minimum value (as an open interval) for the subject.
Example:
scalar type positive_float extending float64 {
    constraint min_ex_value(0);
}Specifies the minimum length of subject string representation.
Example:
scalar type four_decimal_places extending int64 {
    constraint min_len_value(4);
}Specifies that the string representation of the subject must match a regexp.
Example:
scalar type LettersOnly extending str {
    constraint regexp(r'[A-Za-z]*');
}See here for more details on regexp patterns.
Specifies that the link or property value must be exclusive (unique).
When applied to a multi link or property, the exclusivity constraint
                        guarantees that for every object, the set of values held by a link or
                        property does not intersect with any other such set in any other object
                        of this type.
This constraint is only valid for concrete links and properties. Scalar type definitions cannot include this constraint.
Example:
type User {
    # Make sure user names are unique.
    required property name -> str {
        constraint exclusive;
    }
    # Make sure none of the "owned" items belong
    # to any other user.
    multi link owns -> Item {
        constraint exclusive;
    }
}Sometimes it’s necessary to create a type where each combination
                        of properties is unique. This can be achieved by defining an
                        exclusive constraint for the type, rather than on each
                        property:
type UniqueCoordinates {
    required property x -> int64;
    required property y -> int64;
    # Each combination of x and y must be unique.
    constraint exclusive on ( (.x, .y) );
}In principle, many possible expressions can appear in the on
(<expr>) clause of the exclusive constraint with a few
                        caveats:
The expression can only contain references to the immediate properties or links of the type.
No backward links or long paths are allowed.
Only Immutable functions are allowed in the constraint
                                expression.
This constraint also has an additional effect of creating an
                            implicit index on the link or
                            property. This means that in the above example there’s no need to
                            add explicit indexes for the name property.
Constraint SDL, DDL, and introspection.