Skip to contents

This package is designed to interact with LaminDB instances.

Basic structure

When connecting to a LaminDB instance, laminr will interact with the LaminDB instance API to retrieve the schema of the data structures in that instance. This schema is used to instantiate Modules containing Registries, which in turn contain Fields. A registry can be used to retrieve Records.

Class diagram

classDiagram
%% # nolint start
    laminr --> Instance
    laminr --> UserSettings
    laminr --> InstanceSettings
    Instance --> InstanceAPI
    Instance --> Module
    Module --> Registry
    Registry --> Field
    Registry --> Record

    class laminr{
        +connect(String slug): Instance
    }

    class UserSettings{
        +initialize(...): UserSettings
        +email: String
        +access_token: String
        +uid: String
        +uuid: String
        +handle: String
        +name: String
    }

    class InstanceSettings{
        +initialize(...): InstanceSettings
        +owner: String
        +name: String
        +id: String
        +schema_id: String
        +api_url: String
    }
    class Instance{
        +initialize(InstanceSettings Instance_settings, API api, Map<String, any> schema): Instance
        +get_modules(): Module[]
        +get_module(String module_name): Module
        +get_module_names(): String[]
    }
    class InstanceAPI{
        +initialize(InstanceSettings Instance_settings)
        +get_schema(): Map<String, Any>
        +get_record(...): Map<String, Any>
    }
    class Module{
        +initialize(Instance Instance, API api, String module_name, Map<String, any> module_schema): Module
        +name: String
        +get_registries(): Registry[]
        +get_registry(String registry_name): Registry
        +get_registry_names(): String[]
    }
    class Registry{
        +initialize(Instance Instance, Module module, API api, String registry_name, Map<String, Any> registry_schema): Registry
        +name: String
        +class_name: String
        +is_link_table: Bool
        +get_fields(): Field[]
        +get_field(String field_name): Field
        +get_field_names(): String[]
        +get(String id_or_uid, Bool include_foreign_keys, List~String~ select, Bool verbose): RichRecord
        +get_registry_class(): RichRecordClass
    }
    class Field{
        +initialize(...): Field
        +type: String
        +through: Map
        +field_name: String
        +registry_name: String
        +column_name: String
        +module_name: String
        +is_link_table: Bool
        +relation_type: String
        +related_field_name: String
        +related_registry_name: String
        +related_module_name: String
    }
    class Record{
        +initialize(Instance Instance, Registry registry, API api, Map<String, Any> data): Record
        +get_value(String field_name): Any
    }
%% # nolint end

Sugar syntax

The laminr package adds some sugar syntax to the Instance and Registry classes. This allows to directly access an instance’s registies and a record’s fields.

For instance, instead of writing:

db <- connect("laminlabs/cellxgene")

artifact <- db$get_module("core")$get_registry("artifact")$get("KBW89Mf7IGcekja2hADu")

artifact$get_value("id")

Using the sugar syntax, you can write:

db <- connect("laminlabs/cellxgene")

artifact <- db$core$artifact$get("KBW89Mf7IGcekja2hADu")

artifact$id

This sugar syntax is achieved by creating RichInstance and RichRecord classes that inherit from Instance and Record, respectively.

Class diagram

classDiagram
%% # nolint start
    laminr --> RichInstance
    laminr --> UserSettings
    laminr --> InstanceSettings
    RichInstance --|> Instance
    Instance --> InstanceAPI
    Instance --> Module
    Core --|> Module
    Bionty --|> Module
    Module --> Registry
    Registry --> Field
    Registry --> RichRecord
    Artifact --|> Record
    RichInstance --> Core
    RichInstance --> Bionty
    Core --> Artifact
    RichRecord --|> Record

    class laminr{
        +connect(String slug): RichInstance
    }

    class UserSettings{
        +initialize(...): UserSettings
        +email: String
        +access_token: String
        +uid: String
        +uuid: String
        +handle: String
        +name: String
    }

    class InstanceSettings{
        +initialize(...): InstanceSettings
        +owner: String
        +name: String
        +id: String
        +schema_id: String
        +api_url: String
    }
    class Instance{
        +initialize(InstanceSettings Instance_settings, API api, Map<String, any> schema): Instance
        +get_modules(): Module[]
        +get_module(String module_name): Module
        +get_module_names(): String[]
    }
    class InstanceAPI{
        +initialize(InstanceSettings Instance_settings)
        +get_schema(): Map<String, Any>
        +get_record(...): Map<String, Any>
    }
    class RichInstance{
        +initialize(InstanceSettings Instance_settings, API api, Map<String, any> schema): RichInstance
        +Registry Artifact
        +Registry Collection
        +...registry accessors...
        +Registry User
        +Bionty bionty
    }
    class Core{
        +Registry Artifact
        +Registry Collection
        +...registry accessors...
        +Registry User
    }
    class Bionty{
        +Registry CellLine
        +Registry CellMarker
        +...registry accessors...
        +Registry Tissue
    }
    class Module{
        +initialize(Instance Instance, API api, String module_name, Map<String, any> module_schema): Module
        +name: String
        +get_registries(): Registry[]
        +get_registry(String registry_name): Registry
        +get_registry_names(): String[]
    }
    class Registry{
        +initialize(Instance Instance, Module module, API api, String registry_name, Map<String, Any> registry_schema): Registry
        +name: String
        +class_name: String
        +is_link_table: Bool
        +get_fields(): Field[]
        +get_field(String field_name): Field
        +get_field_names(): String[]
        +get(String id_or_uid, Bool include_foreign_keys, List~String~ select, Bool verbose): RichRecord
        +get_registry_class(): RichRecordClass
    }
    class Artifact{
        +initialize(...): Artifact
        +cache(): String
        +load(): Any
    }
    class Field{
        +initialize(...): Field
        +type: String
        +through: Map
        +field_name: String
        +registry_name: String
        +column_name: String
        +module_name: String
        +is_link_table: Bool
        +relation_type: String
        +related_field_name: String
        +related_registry_name: String
        +related_module_name: String
    }
    class RichRecord{
        +...field value accessors...
    }
    class Record{
        +initialize(Instance Instance, Registry registry, API api, Map<String, Any> data): Record
        +get_value(String field_name): Any
    }
%% # nolint end