You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

77 lines
2.8 KiB
ReStructuredText

==============
Datatypes
==============
--------------
Value types
--------------
A runtime value in Cozo can be of the following *value-types*:
* ``Null``
* ``Bool``
* ``Number``
* ``String``
* ``Bytes``
* ``Uuid``
* ``List``
``Number`` can be ``Float`` (double precision) or ``Int`` (signed, 64 bits). Cozo will auto-promote ``Int`` to ``Float`` when necessary.
``List`` can contain any number of mixed-type values, including other lists.
Cozo sorts values according to the above order, e.g. ``null`` is smaller than ``true``, which is in turn smaller than the list ``[]``.
Within each type values are *compared* according to logic custom to each type:
* ``false < true``;
* ``-1 == -1.0 < 0 == 0.0 < 0.5 == 0.5 < 1 == 1.0`` (however, see the caveat below);
* Lists are ordered lexicographically by their elements;
* Bytes are compared lexicographically;
* Strings are ordered lexicographically by their UTF-8 byte representations.
* If two UUIDs are both of version one, they are compared based on their timestamp. Otherwise, or when the timestamp comparison results in a tie, they are compared by their bytes.
.. WARNING::
Because there are two internal number types ``Int`` and ``Float`` under the umbrella type ``Number``, sorting numbers can be more complex than anticipated.
When sorting, the integer always comes before the equivalent float. For example, ``1.0 == 1``, ``1.0 >= 1`` and ``1.0 <= 1`` all evaluate to true, but when sorting ``1`` and ``1.0`` are two _different_ values and ``1`` is placed before ``1.0``.
This may create problems when applying aggregations since if a grouping key contains both ``1.0`` and ``1``, they are treated as separate group headings. In such cases, it may help to use explicit coercion ``to_float`` or ``round`` to coerce all sorted values to the same type.
----------------
Value literals
----------------
``null`` for the type ``Null``, ``false`` and ``true`` for the type ``Bool`` are standard.
Numbers ...
Strings ...
There is no literal representation for ``Bytes`` due to restrictions placed by JSON. But ...
Lists ...
----------------
Schema types
----------------
In schema definition, the required type for a value can be specified by any of the following *schema-types*
* ``Ref``
* ``Component``
* ``Int``
* ``Float``
* ``Bool``
* ``String``
* ``Bytes``
* ``List``
When retrieving triples' values, the schema-types ``Ref``, ``Component``, and ``Int`` are all represented by the value-type ``Number`` (actually ``Int``). The entity (the subject of the triple) is always a ``Ref``, always represented by a ``Number`` (``Int``).
Note the absence of the ``Null`` type in schema-types.
When asserting (inserting or updating) triples, if a value given is not of the correct schema-type, Cozo will first try to coerce the value and will only error out if no known coercion methods exist.