Varve.Store
0.1.0-preview.20
dotnet add package Varve.Store --version 0.1.0-preview.20
NuGet\Install-Package Varve.Store -Version 0.1.0-preview.20
<PackageReference Include="Varve.Store" Version="0.1.0-preview.20" />
<PackageVersion Include="Varve.Store" Version="0.1.0-preview.20" />
<PackageReference Include="Varve.Store" />
paket add Varve.Store --version 0.1.0-preview.20
#r "nuget: Varve.Store, 0.1.0-preview.20"
#:package Varve.Store@0.1.0-preview.20
#addin nuget:?package=Varve.Store&version=0.1.0-preview.20&prerelease
#tool nuget:?package=Varve.Store&version=0.1.0-preview.20&prerelease
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
NoChangeand 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.
FileStoragekeeps a dataset directory of plain files —log/, the source of truth, never rewritten, andderived/, which can be deleted and is rebuilt — and flushes every commit to the device.MemoryStoragekeeps 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.
BeginBulkLoadAsynctakes any parser's quads as they are parsed;BulkLoadOptions.Workersthreads resolve and spill them while the parser reads (ADR 0108), sorted outside memory withinBulkLoadOptions.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.
ShipAsynccopies 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
IQuadSourcefromVarve.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 | Versions 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. |
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 |