Back to Devoured - June 24, 2026
DEVOURED
Fluree DB (GitHub Repo)

Fluree DB (GitHub Repo)

AI GitHub
Fluree DB integrates vector, text, and geo search directly into its graph database to provide long-term, persistent memory for AI coding agents.
What: Fluree DB is a graph database using RDF 1.1/1.2 that supports SPARQL, JSON-LD, time-travel queries, and git-like branching. It offers an embedded 'Fluree Memory' feature designed to store project contexts for AI tools like Cursor and Claude Code.
Why it matters: By moving persistent context storage into the database layer, developers can avoid the context window limitations of LLMs while ensuring that data remains verifiable and version-controlled.
Takeaway: Run 'npx @fluree/cli' or download the binary to experiment with persistent, branchable memory for your AI agent's project context.
Deep dive
  • Features a git-like branching and merging workflow for data.
  • Supports time-travel queries using commit IDs, timestamps, or transaction numbers.
  • Integrated BM25 full-text search and HNSW vector search within the query engine.
  • Includes native support for RDF, SPARQL, and JSON-LD.
  • Implements triple-level access control within the ledger.
  • Provides an MCP server to expose data to Claude Desktop and Cursor.
  • Uses the Business Source License 1.1.
Decoder
  • RDF: Resource Description Framework, a standard model for data interchange on the web.
  • SPARQL: A query language specifically for databases that can store and retrieve data via RDF.
  • Triple: The basic unit of RDF data, consisting of a subject, predicate, and object.
  • HNSW: Hierarchical Navigable Small World, a graph-based algorithm for fast approximate nearest neighbor search in vector databases.
  • MCP: Model Context Protocol, a standard for connecting AI assistants to external data and systems.
Original article

Fluree DB - A graph database for data that matters.

Temporal, verifiable, standards-compliant, git-like branching and merging, and optimized for AI agents. Integrated vector, text and geo search, and fine-grained access control with no external dependencies.

RDF 1.1 / 1.2, Open Cypher Preview, SPARQL and JSON-LD query (includes history query and other Fluree feature extensions).

Billions of graph facts on commodity hardware. Over 2M facts/second bulk import. Benchmark leader, 10.4x faster than next database. On the full 21.5-billion-triple Wikidata dump, all 850/850 WGPB graph-pattern queries complete with a 43 ms geometric mean.

Fluree Memory — is part of the Fluree DB CLI. Persistent, searchable memory for AI coding assistants. Give Claude Code, Cursor, and other AI tools long-term project memory: facts, decisions, and preferences persist across sessions in a Fluree ledger you control — scoped per-repo or per-user, shareable via git.

Install

Cloud / Serverless — Run in a dedicated serverless stack at no cost (usage limited), spin up dedicated servers on demand as needed. Interact seamlessly with local fluree CLI (install instructions below).

Docker — pre-configured HTTP server, ready to accept queries on port 8090. Best for trying out the API or running Fluree as a service.

docker run -p 8090:8090 fluree/server:latest

Homebrew, shell installer, or Windows PowerShell — installs the fluree binary that bundles both the CLI and the embedded server (fluree server run).

# Homebrew (macOS / Linux)
brew install fluree/tap/fluree

# Shell installer (macOS / Linux)
curl --proto '=https' --tlsv1.2 -LsSf https://github.com/fluree/db/releases/latest/download/fluree-db-cli-installer.sh | sh
# Windows (PowerShell)
irm https://github.com/fluree/db/releases/latest/download/fluree-db-cli-installer.ps1 | iex

Pre-built binaries and the changelog for every release are on the GitHub Releases page.

Zero to graph in 60 seconds

fluree init
fluree create movies

fluree insert '
@prefix schema: <http://schema.org/> .
@prefix ex:     <http://example.org/> .

ex:blade-runner  a schema:Movie ;
  schema:name        "Blade Runner" ;
  schema:dateCreated "1982-06-25"^^<http://www.w3.org/2001/XMLSchema#date> ;
  schema:director    ex:ridley-scott .

ex:ridley-scott  a schema:Person ;
  schema:name "Ridley Scott" .

ex:alien  a schema:Movie ;
  schema:name        "Alien" ;
  schema:dateCreated "1979-05-25"^^<http://www.w3.org/2001/XMLSchema#date> ;
  schema:director    ex:ridley-scott .
'

fluree query --format table 'SELECT ?title ?date WHERE {
  ?movie a <http://schema.org/Movie> ;
         <http://schema.org/name> ?title ;
         <http://schema.org/dateCreated> ?date .
} ORDER BY ?date'
┌──────────────┬────────────┐
│ title        │ date       │
├──────────────┼────────────┤
│ Alien        │ 1979-05-25 │
│ Blade Runner │ 1982-06-25 │
└──────────────┴────────────┘

That's a SPARQL query. The same query in JSON-LD:

fluree query --jsonld '{
  "@context": { "schema": "http://schema.org/" },
  "select": ["?title", "?date"],
  "where": [
    { "@id": "?movie", "@type": "schema:Movie",
      "schema:name": "?title", "schema:dateCreated": "?date" }
  ],
  "orderBy": "?date"
}'

Both languages access the same engine — same features, same performance.

Now update the data and query the past:

# Give every Ridley Scott movie a genre
fluree update '
PREFIX schema: <http://schema.org/>
PREFIX ex:     <http://example.org/>
INSERT { ?movie schema:genre "sci-fi" }
WHERE  { ?movie schema:director ex:ridley-scott }
'

# What did the data look like before that update?
fluree query --at 1 'SELECT ?title ?genre WHERE {
  ?movie a <http://schema.org/Movie> ;
         <http://schema.org/name> ?title .
  OPTIONAL { ?movie <http://schema.org/genre> ?genre }
}'
# → Blade Runner (no genre), Alien (no genre)

# And now?
fluree query 'SELECT ?title ?genre WHERE {
  ?movie a <http://schema.org/Movie> ;
         <http://schema.org/name> ?title .
  OPTIONAL { ?movie <http://schema.org/genre> ?genre }
}'
# → Blade Runner "sci-fi", Alien "sci-fi"

Every change is preserved. Query any point in history by transaction number, ISO timestamp, or commit ID.

What makes Fluree different

Time travel

Every transaction is immutable. Query data as it existed at any point in time — by transaction number, ISO-8601 timestamp, or content-addressed commit ID. No special tables, no slowly-changing dimensions. It's built into the storage model.

fluree query --at 2024-06-15T00:00:00Z 'SELECT * WHERE { ?s ?p ?o }'

Property graphs & edge annotations

Attach properties to a relationship, not just a node — a role and since date on a worksFor edge, a source and confidence on a claim. Fluree implements the RDF 1.2 / SPARQL 1.2 annotation syntax, so you get labeled-property-graph edges, parallel relationships between the same two nodes, and RDF-star statement-level provenance on a single surface. Plain triple queries are left untouched — annotations only change cardinality when you ask for them.

# Attach metadata to the edge itself, not to Alice or Acme
INSERT DATA {
  ex:alice ex:worksFor ex:acme {| ex:role "Engineer" ; ex:since 2024 |} .
}

# Match the edge and its metadata together
SELECT ?role ?since WHERE {
  ex:alice ex:worksFor ex:acme {| ex:role ?role ; ex:since ?since |} .
}

Integrated search

BM25 full-text search and HNSW vector similarity are built into the query engine — not bolted-on external services. Search results participate in joins, filters, and aggregations like any other graph pattern.

{
  "@context": { "ex": "http://example.org/" },
  "from": "mydb:main",
  "where": [
    { "@id": "?doc", "ex:title": "?title" },
    ["bind", "?score", "(fulltext ?title \"knowledge graph\")"]
  ],
  "select": ["?doc", "?title", "?score"],
  "orderBy": [["desc", "?score"]],
  "limit": 10
}

Git-like data management

Branch, rebase, merge, push, pull — the same workflow developers already use for code, applied to data. Fork a dataset to experiment without affecting production. Merge when ready. Rebase to catch up with upstream changes. Every branch has its own independent commit history.

fluree branch create experiment
fluree use mydb:experiment
# ... make changes safely ...
fluree branch rebase experiment    # catch up with main
fluree branch merge experiment     # fast-forward merge into main
fluree branch drop experiment      # clean up

Triple-level access control

Policies are data in the ledger, enforced at query and transaction time. Users see only what they're authorized to see — not rows, not tables, individual facts. No application-layer filtering required.

Reasoning and inference

RDFS subclass/subproperty reasoning, OWL 2 RL forward-chaining, and user-defined Datalog rules. The database infers facts you didn't explicitly store.

Standards-first

Full SPARQL 1.1 with zero compliance failures against the W3C test suite. Native JSON-LD for idiomatic JSON APIs. Both query languages access the same engine with the same capabilities — time travel, policies, graph sources, and all.

Also worth knowing

  • SHACL validation — declarative shape constraints enforced at transaction time, with violations reported per-target, per-property.
  • OWL ontology imports — pull external vocabularies into a ledger via f:schemaSource + owl:imports, materialized at commit time.
  • Apache Iceberg / R2RML — query Parquet warehouses and relational stores as first-class graph sources alongside native Fluree data.

Use it your way

CLI — Explore data, script pipelines, manage ledgers from the terminal.

fluree query -f report.rq --format csv > output.csv

HTTP Server — Run fluree server for a production API with OIDC auth, content negotiation, and OpenTelemetry.

fluree server run
curl -X POST http://localhost:8090/v1/fluree/query?ledger=mydb:main \
  -H "Content-Type: application/sparql-query" \
  -d 'SELECT ?s ?p ?o WHERE { ?s ?p ?o } LIMIT 10'

Rust library — Embed Fluree directly in your application. No server process needed.

let fluree = FlureeBuilder::memory().build_memory();
fluree.create_ledger("mydb").await?;

let result = fluree.graph("mydb:main")
    .query()
    .sparql("SELECT ?s WHERE { ?s a <http://schema.org/Person> }")
    .execute()
    .await?;

MCP server — Expose Fluree to AI assistants over the Model Context Protocol.

fluree mcp serve            # stdio transport for Claude Desktop, Cursor, etc.

Capabilities

Feature Description
Query languages SPARQL 1.1, JSON-LD Query
Data formats JSON-LD, Turtle, TriG, N-Triples, N-Quads
Edge annotations Property-graph edges & statement-level metadata (RDF 1.2 / SPARQL 1.2)
Time travel Transaction number, ISO timestamp, commit ID
Full-text search Integrated BM25 with Block-Max WAND
Vector search Embedded HNSW or remote service
Reasoning RDFS, OWL 2 QL, OWL 2 RL, Datalog rules
Access control Triple-level policy enforcement
Geospatial GeoSPARQL, S2 cell indexing
Verifiability JWS-signed transactions, Verifiable Credentials
Data sources Apache Iceberg, R2RML relational mappings
Storage backends Memory, file, AWS S3 + DynamoDB, IPFS
Replication Clone, push, pull between instances
Branching Fork ledgers, independent commit histories
Observability OpenTelemetry tracing, structured logging
Validation SHACL shape constraints

Documentation

For documentation and more information, visit labs.flur.ee/docs.

For AI agents

The published docs are available as LLM-readable text following the llms.txt convention:

  • Curated index: https://fluree.github.io/db/llms.txt
  • Full corpus: https://fluree.github.io/db/llms-full.txt

License

Licensed under the Business Source License 1.1, with a Change Date to Apache License 2.0 as specified in that file.

Explore all 56 articles in today's digest

Fresh dev news, AI-digested daily. Never miss a trend at devoured.fyi