Varve.Store 0.1.0-preview.20

This is a prerelease version of Varve.Store.
dotnet add package Varve.Store --version 0.1.0-preview.20
                    
NuGet\Install-Package Varve.Store -Version 0.1.0-preview.20
                    
This command is intended to be used within the Package Manager Console in Visual Studio, as it uses the NuGet module's version of Install-Package.
<PackageReference Include="Varve.Store" Version="0.1.0-preview.20" />
                    
For projects that support PackageReference, copy this XML node into the project file to reference the package.
<PackageVersion Include="Varve.Store" Version="0.1.0-preview.20" />
                    
Directory.Packages.props
<PackageReference Include="Varve.Store" />
                    
Project file
For projects that support Central Package Management (CPM), copy this XML node into the solution Directory.Packages.props file to version the package.
paket add Varve.Store --version 0.1.0-preview.20
                    
#r "nuget: Varve.Store, 0.1.0-preview.20"
                    
#r directive can be used in F# Interactive and Polyglot Notebooks. Copy this into the interactive tool or source code of the script to reference the package.
#:package Varve.Store@0.1.0-preview.20
                    
#:package directive can be used in C# file-based apps starting in .NET 10 preview 4. Copy this into a .cs file before any lines of code to reference the package.
#addin nuget:?package=Varve.Store&version=0.1.0-preview.20&prerelease
                    
Install as a Cake Addin
#tool nuget:?package=Varve.Store&version=0.1.0-preview.20&prerelease
                    
Install as a Cake Tool

Varve.Store

An event-sourced RDF store. The log is the source of truth and every index is a projection of it.

  • The log records what changed, not what was asked for. Asserting a present quad, retracting an absent one, and asserting then retracting an absent one contribute nothing; a request that changes nothing is NoChange and leaves no trace.
  • One sequencer, optional expected position. Conflict(head) is a normal answer, not an error.
  • Pinned reads and as-of reads are different things. Pin() is a snapshot for one operation. AsOfAsync(position) is time travel: below the newest checkpoint it is served from the extents' validity intervals with no log read (ADR 0138); above it, from the checkpoint plus an overlay of the log tail.
  • A header chain makes two copies of one dataset that were continued independently detectably divergent.
  • Pre-commit validators bound to the dataset gate every commit; a request may add its own. A validator sees the state the commit would produce and the delta, and nothing else.
  • A staging view over a pinned read names terms the dataset does not hold yet, so that several changes can be composed over an overlay and submitted as one commit — what SPARQL Update's integration does.
  • On disk or in memory. FileStorage keeps a dataset directory of plain files — log/, the source of truth, never rewritten, and derived/, which can be deleted and is rebuilt — and flushes every commit to the device. MemoryStorage keeps the same bytes in memory. The on-disk format is versioned and read for ever from the first release that writes it.
  • Opens in the time of its tail, not its size. The term dictionary lives in the projection's runs on disk, read through lookups by id and by term; opening reads the log after the newest persisted state and loads nothing per term. Checkpoints, written on demand or by a CheckpointPolicy, bound what an as-of read and an open replay. A checkpoint is a chain of extent sets named by a catalog (ADR 0139, derived format 4): each set holds one window's intervals, written once, so space grows with the changes, not with the number of checkpoints; dropping one merges its set into the next.
  • Bulk loads. BeginBulkLoadAsync takes any parser's quads as they are parsed; BulkLoadOptions.Workers threads resolve and spill them while the parser reads (ADR 0108), sorted outside memory within BulkLoadOptions.MemoryBytes, merged with the dataset in one sequential pass, and committed as one commit — with the dataset's validators reading the delta on disk. The result is the same at any worker count.
  • Lookups by term probe a filter first. Each run on disk carries a blocked Bloom filter over its terms (ADR 0109, derived format 3), so a commit's new term costs one probe per run and an index read only where the filter says maybe; a format-2 dataset is read as before and migrates as maintenance rewrites its runs.
  • Replicas by copying files. ShipAsync copies the log up to a position and a checkpoint's extent sets into another storage, which opens at exactly that position.
  • Recovers from crashes. A torn or unclosed tail is ignored, a copy taken while the dataset was being written opens at its last closed commit, and damage that no crash produces refuses rather than guesses.
  • SPARQL-free and SHACL-free. Reads are through IQuadSource from Varve.Rdf; writes are an ordered list of assertions and retractions over terms.
await using FileStorage storage = await FileStorage.OpenAsync(
    new DatasetDirectory("my-dataset"), new FileStorageOptions { Clock = TimeProvider.System });
DatasetOptions options = new() { Clock = TimeProvider.System };

await using Dataset dataset = await Dataset.CreateAsync(storage, new DatasetId(Guid.NewGuid()), options);
// Later: await Dataset.OpenAsync(storage, options);

CommitResult result = await dataset.CommitAsync(new CommitRequestBuilder()
    .Assert(RdfTerm.Iri("http://example.org/s"u8), RdfTerm.Iri("http://example.org/p"u8),
            RdfTerm.Literal("chat"u8, "en"u8)));

using DatasetView view = dataset.Pin();

// A bulk load: the parser's handler is the load's Assert.
await using BulkLoad load = await dataset.BeginBulkLoadAsync();
NQuadsParser.Parse(File.OpenRead("data.nq"), load.Assert, new ParseOptions { Syntax = RdfSyntax.NQuads });
CommitResult loaded = await load.CommitAsync(new CommitMetadata());

In a browser, Varve.Store.Browser provides the storage: OPFS from a worker, IndexedDB elsewhere.

Layer 4 of Varve, a .NET-native event-sourced RDF store and SPARQL toolkit. MPL-2.0.

Product Compatible and additional computed target framework versions.
.NET net10.0 is compatible.  net10.0-android was computed.  net10.0-browser was computed.  net10.0-ios was computed.  net10.0-maccatalyst was computed.  net10.0-macos was computed.  net10.0-tvos was computed.  net10.0-windows was computed. 
Compatible target framework(s)
Included target framework(s) (in package)
Learn more about Target Frameworks and .NET Standard.

NuGet packages (8)

Showing the top 5 NuGet packages that depend on Varve.Store:

Package Downloads
Varve.Sparql.Store

SPARQL 1.1 Update over a Varve store: every request pinned, evaluated operation by operation over an overlay, and committed as one commit.

Varve.Protocol

SPARQL 1.1 Protocol, Graph Store Protocol, service description, time travel, change feed and diff over HTTP for a Varve store, as ASP.NET Core endpoint groups.

Varve.Store.Browser

Browser storage for a Varve store: the origin private file system through synchronous access handles in a dedicated worker, and IndexedDB where they do not exist.

Varve.Store.ObjectStorage

Storage for a Varve store in any object store with conditional writes: the log as write-once chunk objects, one writer by an epoch fenced in the log itself, and a local cache.

Varve.Store.Azure

Azure Blob Storage for a Varve store's object-storage backend: the five object-store operations over the REST API, authenticated by the workload's own identity.

GitHub repositories

This package is not used by any popular GitHub repositories.

Version Downloads Last Updated
0.1.0-preview.20 70 11/10/2026
0.1.0-preview.19 97 11/6/2026
0.1.0-preview.18 88 11/6/2026
0.1.0-preview.17 86 11/6/2026
0.1.0-preview.16 88 11/3/2026
0.1.0-preview.15 96 10/26/2026
0.1.0-preview.14 90 10/26/2026
0.1.0-preview.13 101 10/26/2026
0.1.0-preview.12 102 10/23/2026
0.1.0-preview.11 88 10/21/2026
0.1.0-preview.10 91 10/20/2026
0.1.0-preview.9 89 10/19/2026
0.1.0-preview.8 94 10/17/2026
0.1.0-preview.7 79 10/17/2026
0.1.0-preview.6 75 10/15/2026
0.1.0-preview.5 70 10/15/2026
0.1.0-preview.4 72 10/13/2026
0.1.0-preview.3 76 10/12/2026
0.1.0-preview.2 76 10/9/2026
0.1.0-preview.1 85 10/7/2026