Yog.FSharp
Getting Started Examples API Reference GitHub

Labeled Module

Labeled graph builder for constructing graphs with custom node labels.

Provides a type-safe way to build graphs using arbitrary labels (strings, custom types, etc.) instead of integer node IDs. The builder maintains an internal mapping from labels to IDs.

When to Use

  • Working with domain-specific identifiers (URLs, names, UUIDs)
  • Building graphs from external data with natural keys
  • When node identity is meaningful outside the graph structure
  • Incremental graph construction with unknown nodes

Comparison with Direct Graph Construction

Aspect

LabeledBuilder

Direct Graph API

Node reference

Labels ('L)

Integer IDs

Auto-create nodes

Yes

No

Lookup cost

Map lookup

Direct

Use case

Domain modeling

Algorithm implementation

Example

1: 
2: 
3: 
4: 
5: 
6: 
7: 
8: 
9: 
open Yog.Builder

// Build a social graph with string labels
let socialGraph =
    Labeled.directed<string, int>()
    |> Labeled.addEdge "Alice" "Bob" 5
    |> Labeled.addEdge "Bob" "Charlie" 3
    |> Labeled.addEdge "Alice" "Charlie" 10
    |> Labeled.toGraph
namespace Yog
namespace Yog.Builder
val socialGraph: Yog.Model.Graph<string,int>
module Labeled from Yog.Builder
<summary> Labeled graph builder for constructing graphs with custom node labels. Provides a type-safe way to build graphs using arbitrary labels (strings, custom types, etc.) instead of integer node IDs. The builder maintains an internal mapping from labels to IDs. ## When to Use - Working with domain-specific identifiers (URLs, names, UUIDs) - Building graphs from external data with natural keys - When node identity is meaningful outside the graph structure - Incremental graph construction with unknown nodes ## Comparison with Direct Graph Construction | Aspect | LabeledBuilder | Direct Graph API | |--------|---------------|------------------| | Node reference | Labels ('L) | Integer IDs | | Auto-create nodes | Yes | No | | Lookup cost | Map lookup | Direct | | Use case | Domain modeling | Algorithm implementation | ## Example ```fsharp open Yog.Builder // Build a social graph with string labels let socialGraph = Labeled.directed&lt;string, int&gt;() |&gt; Labeled.addEdge "Alice" "Bob" 5 |&gt; Labeled.addEdge "Bob" "Charlie" 3 |&gt; Labeled.addEdge "Alice" "Charlie" 10 |&gt; Labeled.toGraph ``` </summary>
val directed: unit -> LabeledBuilder<'L,'E> (requires comparison)
<summary> Convenience: Creates a directed labeled builder. ## Example ```fsharp let builder = Labeled.directed&lt;string, int&gt;() ``` </summary>
Multiple items
val string: value: 'T -> string

--------------------
type string = System.String
Multiple items
val int: value: 'T -> int (requires member op_Explicit)

--------------------
type int = int32

--------------------
type int<'Measure> = int
val addEdge: fromLabel: 'Label -> toLabel: 'Label -> weight: 'E -> builder: LabeledBuilder<'Label,'E> -> LabeledBuilder<'Label,'E> (requires comparison)
<summary> Adds an edge between two labels. Automatically creates nodes if missing. ## Parameters - `fromLabel`: Source node label - `toLabel`: Target node label - `weight`: Edge weight/data - `builder`: The builder to modify ## Example ```fsharp let builder = Labeled.directed&lt;string, int&gt;() |&gt; Labeled.addEdge "A" "B" 10 ``` </summary>
val toGraph: builder: LabeledBuilder<'Label,'E> -> Yog.Model.Graph<'Label,'E> (requires comparison)
<summary> Converts the builder to a standard detached Graph. The returned graph uses internal integer IDs but preserves labels as node data. </summary>

Functions and values

Function or value Description

addEdge fromLabel toLabel weight builder

Full Usage: addEdge fromLabel toLabel weight builder

Parameters:
    fromLabel : 'Label
    toLabel : 'Label
    weight : 'E
    builder : LabeledBuilder<'Label, 'E>

Returns: LabeledBuilder<'Label, 'E>

Adds an edge between two labels. Automatically creates nodes if missing.

Parameters

  • fromLabel: Source node label
  • toLabel: Target node label
  • weight: Edge weight/data
  • builder: The builder to modify

Example

1: 
2: 
3: 
let builder =
    Labeled.directed<string, int>()
    |> Labeled.addEdge "A" "B" 10
val builder: obj
Multiple items
val string: value: 'T -> string

--------------------
type string = System.String
Multiple items
val int: value: 'T -> int (requires member op_Explicit)

--------------------
type int = int32

--------------------
type int<'Measure> = int

fromLabel : 'Label
toLabel : 'Label
weight : 'E
builder : LabeledBuilder<'Label, 'E>
Returns: LabeledBuilder<'Label, 'E>

addNode label builder

Full Usage: addNode label builder

Parameters:
Returns: LabeledBuilder<'Label, 'E>

Updated builder with the node added (if new).


Explicitly adds a node by label.

Parameters

  • label: The label for the new node
  • builder: The builder to modify

label : 'Label
builder : LabeledBuilder<'Label, 'E>
Returns: LabeledBuilder<'Label, 'E>

Updated builder with the node added (if new).

addSimpleEdge fromLabel toLabel builder

Full Usage: addSimpleEdge fromLabel toLabel builder

Parameters:
    fromLabel : 'Label
    toLabel : 'Label
    builder : LabeledBuilder<'Label, int>

Returns: LabeledBuilder<'Label, int>

Adds a simple edge with weight 1 (for integer weighted graphs).

Example

1: 
2: 
3: 
let builder =
    Labeled.directed<string, int>()
    |> Labeled.addSimpleEdge "A" "B"
val builder: obj
Multiple items
val string: value: 'T -> string

--------------------
type string = System.String
Multiple items
val int: value: 'T -> int (requires member op_Explicit)

--------------------
type int = int32

--------------------
type int<'Measure> = int

fromLabel : 'Label
toLabel : 'Label
builder : LabeledBuilder<'Label, int>
Returns: LabeledBuilder<'Label, int>

allLabels builder

Full Usage: allLabels builder

Parameters:
Returns: 'L list

Returns all labels currently in the registry.

builder : LabeledBuilder<'L, 'E>
Returns: 'L list

create kind

Full Usage: create kind

Parameters:
Returns: LabeledBuilder<'Label, 'EdgeData>

A fresh LabeledBuilder with no nodes or edges.


Creates a new empty labeled graph builder.

Parameters

  • kind: Directed or Undirected

kind : GraphType
Returns: LabeledBuilder<'Label, 'EdgeData>

A fresh LabeledBuilder with no nodes or edges.

directed ()

Full Usage: directed ()

Parameters:
    () : unit

Returns: LabeledBuilder<'L, 'E>

Convenience: Creates a directed labeled builder.

Example

1: 
let builder = Labeled.directed<string, int>()
val builder: obj
Multiple items
val string: value: 'T -> string

--------------------
type string = System.String
Multiple items
val int: value: 'T -> int (requires member op_Explicit)

--------------------
type int = int32

--------------------
type int<'Measure> = int

() : unit
Returns: LabeledBuilder<'L, 'E>

ensureNode label builder

Full Usage: ensureNode label builder

Parameters:
Returns: LabeledBuilder<'Label, 'E> * NodeId

Tuple of (updated builder, node ID)


Idempotently ensures a node exists for a label.

If the label already exists, returns the existing ID. If the label is new, creates a node and assigns a new ID.

label : 'Label
builder : LabeledBuilder<'Label, 'E>
Returns: LabeledBuilder<'Label, 'E> * NodeId

Tuple of (updated builder, node ID)

fromList kind edges

Full Usage: fromList kind edges

Parameters:
    kind : GraphType
    edges : ('L * 'L * 'E) list

Returns: LabeledBuilder<'L, 'E>

Creates a builder from a list of edge triples (source, target, weight).

Example

1: 
2: 
let edges = [("A", "B", 1); ("B", "C", 2)]
let builder = Labeled.fromList Directed edges
val edges: (string * string * int) list
val builder: obj

kind : GraphType
edges : ('L * 'L * 'E) list
Returns: LabeledBuilder<'L, 'E>

getId label builder

Full Usage: getId label builder

Parameters:
Returns: NodeId option

Some id if the label exists, None otherwise.


Looks up the internal node ID for a given label.

label : 'Label
builder : LabeledBuilder<'Label, 'E>
Returns: NodeId option

Some id if the label exists, None otherwise.

predecessors label builder

Full Usage: predecessors label builder

Parameters:
Returns: ('Label * 'E) list option

Some list of (label, weight) if the node exists, None otherwise.


Gets predecessors using labels.

label : 'Label
builder : LabeledBuilder<'Label, 'E>
Returns: ('Label * 'E) list option

Some list of (label, weight) if the node exists, None otherwise.

successors label builder

Full Usage: successors label builder

Parameters:
Returns: ('Label * 'E) list option

Some list of (label, weight) if the node exists, None otherwise.


Gets successors using labels.

label : 'Label
builder : LabeledBuilder<'Label, 'E>
Returns: ('Label * 'E) list option

Some list of (label, weight) if the node exists, None otherwise.

toGraph builder

Full Usage: toGraph builder

Parameters:
Returns: Graph<'Label, 'E>

Converts the builder to a standard detached Graph.

The returned graph uses internal integer IDs but preserves labels as node data.

builder : LabeledBuilder<'Label, 'E>
Returns: Graph<'Label, 'E>

undirected ()

Full Usage: undirected ()

Parameters:
    () : unit

Returns: LabeledBuilder<'L, 'E>

Convenience: Creates an undirected labeled builder.

Example

1: 
let builder = Labeled.undirected<string, int>()
val builder: obj
Multiple items
val string: value: 'T -> string

--------------------
type string = System.String
Multiple items
val int: value: 'T -> int (requires member op_Explicit)

--------------------
type int = int32

--------------------
type int<'Measure> = int

() : unit
Returns: LabeledBuilder<'L, 'E>