Logo ProcessCore

Reading And Writing YAML

ProcessCore.Yaml turns YAML documents into the same in-memory graph objects provided by ProcessCore.

Load a profile-shaped assay example. Passing false means lenient mode: type decorations and extra profile fields are accepted and preserved where possible.

let assayYaml =
    System.IO.Path.Combine(__SOURCE_DIRECTORY__, "../../examples/isa/assay_proteomics.yml")
    |> System.IO.File.ReadAllText
Show assay YAML
type: Dataset
additionalType: Assay
identifier: measurement1
agents:
  -
    type: Agent
    givenName: Oliver
    affiliation:
      type: Organization
      name: RPTU University of Kaiserslautern
    email: mailto:maus@nfdi4plants.org
    familyName: Maus
    jobTitles:
      "@id": http://purl.org/spar/scoro/research-assistant
      "@type": DefinedTerm
      name: research assistant
      termCode: http://purl.org/spar/scoro/research-assistant
recipes:
    -
      "@id": "#Recipe_Growth"
      type: Recipe
      components:
        "@id": "#Component_growth_environment_bioreactor"
    -
      "@id": "#Recipe_Cell_Lysis"
      type: Recipe
      components:
        "@id": "#Component_centrifuge_Eppendorf™_Centrifuge_5420"
    -
      "@id": "#Recipe_MS_Run"
      type: Recipe
      components:
        "@id": "#Component_mass_spectrometer_Q_Exactive_9000"
    -
      "@id": "#Recipe_Computational_Proteome_Analysis"
      type: Recipe
annotations:
  -
    "@id": "#ParameterValue_sonicator_Fisherbrand_Model_705_Sonic_Dismembrator"
    type: Annotation
    additionalType: ParameterValue # inherits from Annotation
    name: sonicator
    nameTAN: https://bioregistry.io/OBI:0400114
    value: Fisherbrand™ Model 705 Sonic Dismembrator
    valueTAN: https://bioregistry.io/OBI:5453453
  -
    "@id": "#ParameterValue_time_10_minute"
    type: Annotation
    additionalType: ParameterValue
    name: time
    nameTAN: https://bioregistry.io/PATO:0000165
    value: 10
    unit: minute
    unitTAN: https://bioregistry.io/UO:0000031
  -
    "@id": "#ParameterValue_technical_replicate_group_1"
    type: Annotation
    additionalType: ParameterValue
    name: technical replicate group
    nameTAN: https://bioregistry.io/DPBO:1000184
    value: 1
  -
    "@id": "#ParameterValue_technical_replicate_group_2"
    type: Annotation
    additionalType: ParameterValue
    name: technical replicate group
    nameTAN: https://bioregistry.io/DPBO:1000184
    value: 2
  -
    "@id": "#ParameterValue_technical_replicate_group_3"
    type: Annotation
    additionalType: ParameterValue
    name: technical replicate group
    nameTAN: https://bioregistry.io/DPBO:1000184
    value: 3
  -
    "@id": "#ParameterValue_software_ProteomIqon"
    type: Annotation
    additionalType: ParameterValue
    name: software
    nameTAN: https://bioregistry.io/IAO_0000010
    value: ProteomIQon
  -
    "@id": "#CharacteristicValue_organism_Arabidopsis_thaliana"
    type: Annotation
    additionalType: CharacteristicValue
    name: organism
    nameTAN: https://bioregistry.io/SIO:010000
    value: Arabidopsis thaliana
    valueTAN: https://bioregistry.io/NCBITaxon:3702
  -
    "@id": "#FactorValue_temperature_25_degree_Celsius"
    type: Annotation
    additionalType: FactorValue
    name: temperature
    nameTAN: https://bioregistry.io/NCRO:0000029
    value: 25
    unit: degree Celsius
    unitTAN: https://bioregistry.io/UO:0000027
  -
    "@id": "#FactorValue_temperature_30_degree_Celsius"
    type: Annotation
    additionalType: FactorValue
    name: temperature
    nameTAN: https://bioregistry.io/NCRO:0000029
    value: 30
    unit: degree Celsius
    unitTAN: https://bioregistry.io/UO:0000027
  -
    "@id": "#Component_growth_environment_bioreactor"
    type: Annotation
    additionalType: Component
    name: growth environment
    nameTAN: https://bioregistry.io/OBI:0000997
    value: bioreactor
    valueTAN: https://bioregistry.io/OBI:0001046
  -
    "@id": "#Component_mass_spectrometer_Q_Exactive_9000"
    type: Annotation
    additionalType: Component
    name: mass spectrometer
    nameTAN: https://bioregistry.io/OBI:0000049
    value: Q Exactive 9000
processes:
  -
    # Possible worksheet grouping
    type: Process
    name: Growth
    inputs:
      - type: Sample # = additionalType: [Source]
        additionalType: Source
        name: Base Culture
        additionalProperty:
          -
           "@id": "#CharacteristicValue_organism_Arabidopsis_thaliana"
    outputs:
      - type: Sample
        additionalType: Sample
        name: Cultivation Flask RT
        additionalProperty:
          -
           "@id": "#FactorValue_temperature_25_degree_Celsius"
    executesRecipe:
      "@id": "#Recipe_Growth"
  -
    type: Process
    name: Growth
    inputs:
      - type: Sample
        additionalType: Source
        name: Base Culture
        additionalProperty:
          -
           "@id": "#CharacteristicValue_organism_Arabidopsis_thaliana"
    outputs:
      - type: Sample
        additionalType: Sample
        name: Cultivation Flask HT
        additionalProperty:
          -
           "@id": "#FactorValue_temperature_30_degree_Celsius"
    executesRecipe:
      "@id": "#Recipe_Growth"
  -
    type: Process
    name: Cell Lysis
    inputs:
      - type: Sample
        additionalType: Source # = additionalType: [Source]
        name: Cultivation Flask RT
    outputs:
      - type: Sample
        additionalType: Sample
        name: Eppi RT 1
    executesRecipe:
      "@id": "#Recipe_Cell_Lysis"
    parameterValue:
      - "@id": "#ParameterValue_time_10_minute"
      - "@id": "#ParameterValue_sonicator_Fisherbrand_Model_705_Sonic_Dismembrator"
      - "@id": "#ParameterValue_technical_replicate_group_1"
  -
    type: Process
    name: Cell Lysis
    inputs:
      - type: Sample # = additionalType: [Source]
        additionalType: Source
        name: Cultivation Flask RT
    outputs:
      - type: Sample
        additionalType: Sample
        name: Eppi RT 2
    executesRecipe:
      "@id": "#Recipe_Cell_Lysis"
    parameterValue:
      - "@id": "#ParameterValue_time_10_minute"
      - "@id": "#ParameterValue_sonicator_Fisherbrand_Model_705_Sonic_Dismembrator"
      - "@id": "#ParameterValue_technical_replicate_group_2"
  -
    type: Process
    name: Cell Lysis
    inputs:
      - type: Sample # = additionalType: [Source]
        additionalType: Source
        name: Cultivation Flask RT
    outputs:
      - type: Sample
        additionalType: Sample
        name: Eppi RT 3
    executesRecipe:
      "@id": "#Recipe_Cell_Lysis"
    parameterValue:
      - "@id": "#ParameterValue_time_10_minute"
      - "@id": "#ParameterValue_sonicator_Fisherbrand_Model_705_Sonic_Dismembrator"
      - "@id": "#ParameterValue_technical_replicate_group_3"
  -
    type: Process
    name: Cell Lysis
    inputs:
      - type: Sample # = additionalType: [Source]
        additionalType: Source
        name: Cultivation Flask HT
    outputs:
      - type: Sample
        additionalType: Sample
        name: Eppi HT 1
    executesRecipe:
      "@id": "#Recipe_Cell_Lysis"
    parameterValue:
      - "@id": "#ParameterValue_time_10_minute"
      - "@id": "#ParameterValue_sonicator_Fisherbrand_Model_705_Sonic_Dismembrator"
      - "@id": "#ParameterValue_technical_replicate_group_1"
  -
    type: Process
    name: Cell Lysis
    inputs:
      - type: Sample # = additionalType: [Source]
        additionalType: Source
        name: Cultivation Flask HT
    outputs:
      - type: Sample
        additionalType: Sample
        name: Eppi HT 2
    executesRecipe:
      "@id": "#Recipe_Cell_Lysis"
    parameterValue:
      - "@id": "#ParameterValue_time_10_minute"
      - "@id": "#ParameterValue_sonicator_Fisherbrand_Model_705_Sonic_Dismembrator"
      - "@id": "#ParameterValue_technical_replicate_group_2"
  -
    type: Process
    name: Cell Lysis
    inputs:
      - type: Sample # = additionalType: [Source]
        additionalType: Source
        name: Cultivation Flask HT
    outputs:
      - type: Sample
        additionalType: Sample
        name: Eppi HT 3
    executesRecipe:
      "@id": "#Recipe_Cell_Lysis"
    parameterValue:
      - "@id": "#ParameterValue_time_10_minute"
      - "@id": "#ParameterValue_sonicator_Fisherbrand_Model_705_Sonic_Dismembrator"
      - "@id": "#ParameterValue_technical_replicate_group_3"
  -
    type: Process
    name: MS Run
    inputs:
      - type: Sample
        additionalType: Sample
        name: Eppi RT 1
    outputs:
      - type: Data
        path: sample1.raw
    executesRecipe:
      "@id": "#Recipe_MS_Run"
  -
    type: Process
    name: MS Run
    inputs:
      - type: Sample
        additionalType: Sample
        name: Eppi RT 2
    outputs:
      - type: Data
        path: sample2.raw
    executesRecipe:
      "@id": "#Recipe_MS_Run"
  -
    type: Process
    name: MS Run
    inputs:
      - type: Sample
        additionalType: Sample
        name: Eppi RT 3
    outputs:
      - type: Data
        path: sample3.raw
    executesRecipe:
      "@id": "#Recipe_MS_Run"
  -
    type: Process
    name: MS Run
    inputs:
      - type: Sample
        additionalType: Sample
        name: Eppi HT 1
    outputs:
      - type: Data
        path: sample4.raw
    executesRecipe:
      "@id": "#Recipe_MS_Run"
  -
    type: Process
    name: MS Run
    inputs:
      - type: Sample
        additionalType: Sample
        name: Eppi HT 2
    outputs:
      - type: Data
        path: sample5.raw
    executesRecipe:
      "@id": "#Recipe_MS_Run"
  -
    type: Process
    name: MS Run
    inputs:
      - type: Sample
        additionalType: Sample
        name: Eppi HT 3
    outputs:
      - type: Data
        path: sample6.raw
    executesRecipe:
      "@id": "#Recipe_MS_Run"
  -
    type: Process
    name: Computational Proteome Analysis
    inputs:
      - type: Data
        path: sample1.raw
    outputs:
      - type: Data
        path: "proteomics_result.csv#col=12"
        encodingFormat: text/csv
        usageInfo: https://datatracker.ietf.org/doc/html/rfc7111
    executesRecipe:
      "@id": "#Recipe_Computational_Proteome_Analysis"
    parameterValue:
      "@id": "#ParameterValue_software_ProteomIqon"
  -
    type: Process
    name: Computational Proteome Analysis
    inputs:
      - type: Data
        path: sample2.raw
    outputs:
      - type: Data
        path: "proteomics_result.csv#col=13"
        encodingFormat: text/csv
        usageInfo: https://datatracker.ietf.org/doc/html/rfc7111
    executesRecipe:
      "@id": "#Recipe_Computational_Proteome_Analysis"
    parameterValue:
      "@id": "#ParameterValue_software_ProteomIqon"
  -
    type: Process
    name: Computational Proteome Analysis
    inputs:
      - type: Data
        path: sample3.raw
    outputs:
      - type: Data
        path: "proteomics_result.csv#col=14"
        encodingFormat: text/csv
        usageInfo: https://datatracker.ietf.org/doc/html/rfc7111
    executesRecipe:
      "@id": "#Recipe_Computational_Proteome_Analysis"
    parameterValue:
      "@id": "#ParameterValue_software_ProteomIqon"
  -
    type: Process
    name: Computational Proteome Analysis
    inputs:
      - type: Data
        path: sample4.raw
    outputs:
      - type: Data
        path: "proteomics_result.csv#col=15"
        encodingFormat: text/csv
        usageInfo: https://datatracker.ietf.org/doc/html/rfc7111
    executesRecipe:
      "@id": "#Recipe_Computational_Proteome_Analysis"
    parameterValue:
      "@id": "#ParameterValue_software_ProteomIqon"
  -
    type: Process
    name: Computational Proteome Analysis
    inputs:
      - type: Data
        path: sample5.raw
    outputs:
      - type: Data
        path: "proteomics_result.csv#col=16"
        encodingFormat: text/csv
        usageInfo: https://datatracker.ietf.org/doc/html/rfc7111
    executesRecipe:
      "@id": "#Recipe_Computational_Proteome_Analysis"
    parameterValue:
      "@id": "#ParameterValue_software_ProteomIqon"
  -
    type: Process
    name: Computational Proteome Analysis
    inputs:
      - type: Data
        path: sample6.raw
    outputs:
      - type: Data
        path: "proteomics_result.csv#col=17"
        encodingFormat: text/csv
        usageInfo: https://datatracker.ietf.org/doc/html/rfc7111
    executesRecipe:
      "@id": "#Recipe_Computational_Proteome_Analysis"
    parameterValue:
      "@id": "#ParameterValue_software_ProteomIqon"

additionalProperty:
  - # = generalProperty: (measurement type)
    type: Annotation
    name: variableMeasured
    nameTAN: https://schema.org/variableMeasured
    value: proteomics
    valueTAN: https://bioregistry.io/MS:1003348




let assay = ProcessCore.Yaml.Dataset.fromYamlString false assayYaml

let assayShape =
    [ "identifier", assay.Identifier
      "additionalType", assay.AdditionalType |> Option.defaultValue ""
      "processes", string assay.Processes.Count
      "data nodes", string (assay.AllData().Count) ]

assayShape
[("identifier", "measurement1"); ("additionalType", "Assay");
 ("processes", "20"); ("data nodes", "12")]

Strict mode is useful for core-shaped YAML. The same ISA/profile-shaped example contains extra fields, so strict mode rejects it.

let strictModeResult =
    try
        ProcessCore.Yaml.Dataset.fromYamlString true assayYaml |> ignore
        "Strict mode accepted this YAML."
    with ex ->
        "Strict mode rejected this YAML: " + firstLine ex.Message

strictModeResult
"Strict mode rejected this YAML: Unknown field '@id' found in YAML for object of type 'Annotation'. Strict mode is enabled, so this is not allowed. Field value: 'Object"

Writing can use inline objects or top-level indexes. Inline YAML is easy to inspect. Indexed YAML deduplicates repeated property values and recipes into annotations and recipes sections.

let small = Dataset("yaml-demo")
let protocol = Recipe()
protocol.Name <- Some "Growth"
protocol.AddComponent(Annotation("growth chamber", value = "chamber-1", additionalType = "Component"))

let source = Sample("Seedling")
source.AdditionalType <- Some "Source"
source.AddAdditionalProperty(Annotation("organism", value = "Arabidopsis thaliana", additionalType = "CharacteristicValue"))

let sample = Sample("Leaf sample")
sample.AdditionalType <- Some "Sample"
sample.AddAdditionalProperty(Annotation("temperature", value = "25", unit = "degree Celsius", additionalType = "FactorValue"))

let growth = Process("Growth")
growth.ExecutesRecipe <- Some protocol
growth.SetInputSample(source)
growth.SetOutputSample(sample)
growth.AddParameterValue(Annotation("duration", value = "7", unit = "day", additionalType = "ParameterValue"))
small.AddProcess(growth)

let inlineYaml = ProcessCore.Yaml.Dataset.toYamlString (Some 2) small
let indexedYaml = ProcessCore.Yaml.Dataset.toYamlStringIndexed (Some 2) small
Show inline YAML
type: Dataset
identifier: yaml-demo
processes:
  -
    type: Process
    name: Growth
    inputs:
      -
        type: Sample
        name: Seedling
        additionalType: Source
        additionalProperty:
          -
            type: Annotation
            name: organism
            additionalType: CharacteristicValue
            value: Arabidopsis thaliana
    outputs:
      -
        type: Sample
        name: Leaf sample
        additionalType: Sample
        additionalProperty:
          -
            type: Annotation
            name: temperature
            additionalType: FactorValue
            value: 25
            unit: degree Celsius
    executesRecipe:
      type: Recipe
      name: Growth
      components:
        -
          type: Annotation
          name: growth chamber
          additionalType: Component
          value: chamber-1
    parameterValue:
      -
        type: Annotation
        name: duration
        additionalType: ParameterValue
        value: 7
        unit: day
Show indexed YAML
type: Dataset
identifier: yaml-demo
recipes:
  -
    "@id": "#Recipe_Growth_version_none_url_none"
    type: Recipe
    name: Growth
    components:
      -
        "@id": "#Component_growth_chamber_chamber-1"
annotations:
  -
    "@id": "#CharacteristicValue_organism_Arabidopsis_thaliana"
    type: Annotation
    name: organism
    additionalType: CharacteristicValue
    value: Arabidopsis thaliana
  -
    "@id": "#FactorValue_temperature_25_degree_Celsius"
    type: Annotation
    name: temperature
    additionalType: FactorValue
    value: 25
    unit: degree Celsius
  -
    "@id": "#ParameterValue_duration_7_day"
    type: Annotation
    name: duration
    additionalType: ParameterValue
    value: 7
    unit: day
  -
    "@id": "#Component_growth_chamber_chamber-1"
    type: Annotation
    name: growth chamber
    additionalType: Component
    value: chamber-1
processes:
  -
    type: Process
    name: Growth
    inputs:
      -
        type: Sample
        name: Seedling
        additionalType: Source
        additionalProperty:
          -
            "@id": "#CharacteristicValue_organism_Arabidopsis_thaliana"
    outputs:
      -
        type: Sample
        name: Leaf sample
        additionalType: Sample
        additionalProperty:
          -
            "@id": "#FactorValue_temperature_25_degree_Celsius"
    executesRecipe:
      "@id": "#Recipe_Growth_version_none_url_none"
    parameterValue:
      -
        "@id": "#ParameterValue_duration_7_day"

Round-tripping returns a new object graph with the same logical shape.

let roundTripped = ProcessCore.Yaml.Dataset.fromYamlString true inlineYaml

let roundTripShape =
    [ "identifier", roundTripped.Identifier
      "processes", string roundTripped.Processes.Count
      "samples", string (roundTripped.AllSamples().Count)
      "property values", string (roundTripped.AllAnnotations().Count) ]

roundTripShape
[("identifier", "yaml-demo"); ("processes", "1"); ("samples", "2");
 ("property values", "4")]

What To Use When

Task

API

Read profile-shaped YAML

ProcessCore.Yaml.Dataset.fromYamlString false

Read strict core-shaped YAML

ProcessCore.Yaml.Dataset.fromYamlString true

Write inline YAML

ProcessCore.Yaml.Dataset.toYamlString

Write indexed YAML

ProcessCore.Yaml.Dataset.toYamlStringIndexed

Decode a specific type

ProcessCore.Yaml.Sample.fromYamlString, Data.fromYamlString, etc.

namespace System
namespace ProcessCore
val yamlCodeBlock: summary: string -> text: string -> string
val summary: string
val text: string
Multiple items
val string: value: 'T -> string

--------------------
type string = String
namespace System.Net
type WebUtility = static member HtmlDecode: value: string -> string + 1 overload static member HtmlEncode: value: string -> string + 1 overload static member UrlDecode: encodedValue: string -> string static member UrlDecodeToBytes: encodedValue: byte array * offset: int * count: int -> byte array static member UrlEncode: value: string -> string static member UrlEncodeToBytes: value: byte array * offset: int * count: int -> byte array
<summary>Provides methods for encoding and decoding URLs when processing Web requests.</summary>
Net.WebUtility.HtmlEncode(value: string) : string
Net.WebUtility.HtmlEncode(value: string, output: IO.TextWriter) : unit
val sprintf: format: Printf.StringFormat<'T> -> 'T
val firstLine: text: string -> string
String.Split(separator: ReadOnlySpan<char>) : string array
   (+0 other overloads)
String.Split( separator: char array) : string array
   (+0 other overloads)
String.Split(separator: string array, options: StringSplitOptions) : string array
   (+0 other overloads)
String.Split(separator: string, ?options: StringSplitOptions) : string array
   (+0 other overloads)
String.Split(separator: char array, options: StringSplitOptions) : string array
   (+0 other overloads)
String.Split(separator: char array, count: int) : string array
   (+0 other overloads)
String.Split(separator: char, ?options: StringSplitOptions) : string array
   (+0 other overloads)
String.Split(separator: string array, count: int, options: StringSplitOptions) : string array
   (+0 other overloads)
String.Split(separator: string, count: int, ?options: StringSplitOptions) : string array
   (+0 other overloads)
String.Split(separator: char array, count: int, options: StringSplitOptions) : string array
   (+0 other overloads)
type StringSplitOptions = | None = 0 | RemoveEmptyEntries = 1 | TrimEntries = 2
<summary>Specifies options for applicable <see cref="Overload:System.String.Split" /> method overloads, such as whether to omit empty substrings from the returned array or trim whitespace from substrings.</summary>
field StringSplitOptions.RemoveEmptyEntries: StringSplitOptions = 1
module Seq from Microsoft.FSharp.Collections
val tryHead: source: 'T seq -> 'T option
module Option from Microsoft.FSharp.Core
val defaultValue: value: 'T -> option: 'T option -> 'T
val assayYaml: string
namespace System.IO
type Path = static member ChangeExtension: path: string * extension: string -> string static member Combine: path1: string * path2: string -> string + 4 overloads static member EndsInDirectorySeparator: path: ReadOnlySpan<char> -> bool + 1 overload static member Exists: path: string -> bool static member GetDirectoryName: path: ReadOnlySpan<char> -> ReadOnlySpan<char> + 1 overload static member GetExtension: path: ReadOnlySpan<char> -> ReadOnlySpan<char> + 1 overload static member GetFileName: path: ReadOnlySpan<char> -> ReadOnlySpan<char> + 1 overload static member GetFileNameWithoutExtension: path: ReadOnlySpan<char> -> ReadOnlySpan<char> + 1 overload static member GetFullPath: path: string -> string + 1 overload static member GetInvalidFileNameChars: unit -> char array ...
<summary>Performs operations on <see cref="T:System.String" /> instances that contain file or directory path information. These operations are performed in a cross-platform manner.</summary>
IO.Path.Combine(paths: ReadOnlySpan<string>) : string
IO.Path.Combine( paths: string array) : string
IO.Path.Combine(path1: string, path2: string) : string
IO.Path.Combine(path1: string, path2: string, path3: string) : string
IO.Path.Combine(path1: string, path2: string, path3: string, path4: string) : string
type File = static member AppendAllBytes: path: string * bytes: byte array -> unit + 1 overload static member AppendAllBytesAsync: path: string * bytes: byte array * ?cancellationToken: CancellationToken -> Task + 1 overload static member AppendAllLines: path: string * contents: string seq -> unit + 1 overload static member AppendAllLinesAsync: path: string * contents: string seq * encoding: Encoding * ?cancellationToken: CancellationToken -> Task + 1 overload static member AppendAllText: path: string * contents: ReadOnlySpan<char> -> unit + 3 overloads static member AppendAllTextAsync: path: string * contents: ReadOnlyMemory<char> * encoding: Encoding * ?cancellationToken: CancellationToken -> Task + 3 overloads static member AppendText: path: string -> StreamWriter static member Copy: sourceFileName: string * destFileName: string -> unit + 1 overload static member Create: path: string -> FileStream + 2 overloads static member CreateSymbolicLink: path: string * pathToTarget: string -> FileSystemInfo ...
<summary>Provides static methods for the creation, copying, deletion, moving, and opening of a single file, and aids in the creation of <see cref="T:System.IO.FileStream" /> objects.</summary>
IO.File.ReadAllText(path: string) : string
IO.File.ReadAllText(path: string, encoding: Text.Encoding) : string
val assay: Dataset
namespace ProcessCore.Yaml
module Dataset from ProcessCore.Yaml
val fromYamlString: processCoreOnly: bool -> s: string -> Dataset
val assayShape: (string * string) list
property Dataset.Identifier: string with get, set
property Dataset.AdditionalType: string option with get, set
<summary> Decoration discriminator (e.g. "Investigation", "Study", "Assay") </summary>
property Dataset.Processes: ResizeArray<Process> with get
property Collections.Generic.List.Count: int with get
member Dataset.AllData: unit -> ResizeArray<Data>
val strictModeResult: string
val ignore: value: 'T -> unit
val ex: exn
property Exception.Message: string with get
val small: Dataset
Multiple items
type Dataset = inherit DynamicObj new: identifier: string * ?title: string * ?description: string * ?additionalType: string * ?license: string * ?datePublished: string * ?dateCreated: string * ?dateModified: string * ?processes: Process seq * ?hasPart: Dataset seq * ?dataFiles: Data seq * ?agents: Agent seq * ?citations: ScholarlyArticle seq * ?dataContexts: DataContext seq * ?additionalProperty: Annotation seq -> Dataset member AddAdditionalProperty: pv: Annotation -> unit member AddAgent: agent: Agent -> unit member AddCitation: article: ScholarlyArticle -> unit member AddDataContext: dataContext: DataContext -> unit member AddDataFile: data: Data -> unit member AddPart: child: Dataset -> unit member AddProcess: proc: Process -> unit member AllAgents: unit -> ResizeArray<Agent> ...
<summary> Container and context for data, processes, administrative metadata, and datamap entries. schema.org/Dataset </summary>

--------------------
new: identifier: string * ?title: string * ?description: string * ?additionalType: string * ?license: string * ?datePublished: string * ?dateCreated: string * ?dateModified: string * ?processes: Process seq * ?hasPart: Dataset seq * ?dataFiles: Data seq * ?agents: Agent seq * ?citations: ScholarlyArticle seq * ?dataContexts: DataContext seq * ?additionalProperty: Annotation seq -> Dataset
val protocol: Recipe
Multiple items
type Recipe = inherit DynamicObj new: ?name: string * ?description: string * ?version: string * ?url: string * ?intendedUse: DefinedTerm * ?additionalType: string * ?parameters: FormalParameter seq * ?components: Annotation seq * ?additionalProperty: Annotation seq -> Recipe member AddAdditionalProperty: pv: Annotation -> unit member AddComponent: pv: Annotation -> unit member AddParameter: fp: FormalParameter -> unit override Equals: obj: obj -> bool override GetHashCode: unit -> int member RemoveAdditionalProperty: pv: Annotation -> unit member RemoveComponent: pv: Annotation -> unit member RemoveParameter: fp: FormalParameter -> unit ...
<summary> Description of a planned procedure. bioschemas.org/LabProtocol </summary>

--------------------
new: ?name: string * ?description: string * ?version: string * ?url: string * ?intendedUse: DefinedTerm * ?additionalType: string * ?parameters: FormalParameter seq * ?components: Annotation seq * ?additionalProperty: Annotation seq -> Recipe
property Recipe.Name: string option with get, set
union case Option.Some: Value: 'T -> Option<'T>
member Recipe.AddComponent: pv: Annotation -> unit
Multiple items
type Annotation = inherit DynamicObj new: name: string * ?value: string * ?unit: string * ?nameTAN: string * ?valueTAN: string * ?unitTAN: string * ?additionalType: string * ?instanceOf: FormalParameter -> Annotation override Equals: obj: obj -> bool override GetHashCode: unit -> int member NameEquals: term: DefinedTerm -> bool member AdditionalType: string option with get, set member InstanceOf: FormalParameter option with get, set member Name: string with get, set member NameTAN: string option with get, set member NameText: string ...
<summary> Extensible key-value-unit triple. Primary extension mechanism of ProcessCore. schema.org/PropertyValue </summary>

--------------------
new: name: string * ?value: string * ?unit: string * ?nameTAN: string * ?valueTAN: string * ?unitTAN: string * ?additionalType: string * ?instanceOf: FormalParameter -> Annotation
val source: Sample
Multiple items
type Sample = inherit DynamicObj new: name: string * ?additionalType: string * ?additionalProperty: Annotation seq -> Sample member AddAdditionalProperty: pv: Annotation -> unit member AllAnnotations: ?scope: ResizeArray<Process> -> ResizeArray<Annotation> member AllConnectedNodes: ?scope: ResizeArray<Process> -> ResizeArray<IONode> member AllConnectedProcesses: ?scope: ResizeArray<Process> -> ResizeArray<Process> member ConnectedData: ?scope: ResizeArray<Process> -> ResizeArray<Data> member ConnectedSamples: ?scope: ResizeArray<Process> -> ResizeArray<Sample> member DownstreamAnnotations: ?recipeName: string * ?scope: ResizeArray<Process> -> ResizeArray<Annotation> member DownstreamData: ?scope: ResizeArray<Process> -> ResizeArray<Data> ...
<summary> Input or output biological, chemical, or digital sample in the process graph. bioschemas.org/Sample </summary>

--------------------
new: name: string * ?additionalType: string * ?additionalProperty: Annotation seq -> Sample
property Sample.AdditionalType: string option with get, set
<summary> Decoration discriminator (e.g. "Sample", "Source") </summary>
member Sample.AddAdditionalProperty: pv: Annotation -> unit
val sample: Sample
type unit = Unit
val growth: Process
Multiple items
type Process = inherit DynamicObj new: name: string * ?executesRecipe: Recipe * ?additionalType: string * ?input: IONode * ?output: IONode * ?parameterValue: Annotation seq -> Process member AddParameterValue: pv: Annotation -> unit member AnnotationsByName: name: string -> ResizeArray<Annotation> member CanonicalizeAllNodes: ds: Dataset -> unit member ClearInput: unit -> unit member ClearOutput: unit -> unit override Equals: obj: obj -> bool override GetHashCode: unit -> int member GetParameterValue: name: string -> Annotation ...
<summary> Core transformation node. Connects inputs to outputs by executing a recipe. bioschemas.org/LabProcess </summary>

--------------------
new: name: string * ?executesRecipe: Recipe * ?additionalType: string * ?input: IONode * ?output: IONode * ?parameterValue: Annotation seq -> Process
property Process.ExecutesRecipe: Recipe option with get, set
member Process.SetInputSample: m: Sample -> unit
member Process.SetOutputSample: m: Sample -> unit
member Process.AddParameterValue: pv: Annotation -> unit
member Dataset.AddProcess: proc: Process -> unit
val inlineYaml: string
val toYamlString: whitespace: int option -> ds: Dataset -> string
val indexedYaml: string
val toYamlStringIndexed: whitespace: int option -> ds: Dataset -> string
val roundTripped: Dataset
val roundTripShape: (string * string) list
member Dataset.AllSamples: unit -> ResizeArray<Sample>
member Dataset.AllAnnotations: ?recipeName: string -> ResizeArray<Annotation>

Type something to start searching.