Files
semantica/docs/storage-backends.md
T
KaifAhmad1 fdafffa980 fix(docs): correct storage-backends adapter names, kwargs, and inventory
The adapter inventory and connection examples referenced classes that
don't exist in semantica.graph_store (Neo4jGraphStore, NeptuneGraphStore,
AgeGraphStore) and used constructor kwargs that don't match the actual
adapters (username vs user, host vs endpoint, url vs endpoint, etc.),
verified against each adapter's real __init__ signature and by
constructing every example against the live classes.

- Correct class names: Neo4jStore, AmazonNeptuneStore, ApacheAgeStore
- Fix kwargs for all seven examples to match actual constructors
- Fix ApacheAgeStore's connection_string to libpq keyword=value format
  instead of a postgresql:// DSN, which the adapter doesn't accept
- Reclassify Anzo from interface/BYO to built-in — AnzoStore is a real,
  exported, tested adapter
- Add the two adapters missing from the inventory: FalkorDBStore and
  OxigraphStore
- Replace the literal password='password' example with an env var
- Note a real RDF4JStore bug found while verifying the RDF4J example:
  repository_id is a named constructor parameter but the implementation
  reads it from **config instead, so it's silently ignored and the
  store always connects to the "default" repository
2026-08-23 17:57:53 +05:30

6.8 KiB

Graph storage backends and feature matrix

Semantica separates graph modeling from physical storage. LPG backends are accessed through graph_store adapters; RDF backends are accessed through triplet_store adapters.

This page is intentionally conservative: it distinguishes between an adapter existing, a feature being generally available with that model, and a backend needing user-supplied wiring.

Status labels

  • built-in: adapter implementation exists in Semantica core.
  • tested: covered by automated integration fixtures or tests.
  • example-only: usable example exists, but support is not asserted by integration tests.
  • interface/BYO: interface or integration point exists; bring your own backend wiring.

Adapter inventory

Backend Model Adapter Status Reference
Neo4j LPG semantica.graph_store.Neo4jStore built-in cookbook/introduction/09_Graph_Store.ipynb
FalkorDB LPG semantica.graph_store.FalkorDBStore built-in docs/reference/graph_store.md
Amazon Neptune LPG semantica.graph_store.AmazonNeptuneStore built-in cookbook/introduction/21_Amazon_Neptune_Store.ipynb
Apache AGE LPG semantica.graph_store.ApacheAgeStore built-in docs/graph_stores/apache_age.md
RDF4J RDF semantica.triplet_store.RDF4JStore built-in cookbook/introduction/20_Triplet_Store.ipynb
Apache Jena RDF semantica.triplet_store.JenaStore built-in cookbook/introduction/20_Triplet_Store.ipynb
Blazegraph RDF semantica.triplet_store.BlazegraphStore built-in cookbook/introduction/20_Triplet_Store.ipynb
Anzo RDF semantica.triplet_store.AnzoStore built-in cookbook/introduction/20_Triplet_Store.ipynb
Oxigraph RDF semantica.triplet_store.OxigraphStore built-in docs/reference/triplet_store.md

Feature matrix

Yes means the capability is expected to work with the adapter and graph model. Partial means the capability works with model-specific constraints. BYO means the user must supply or validate wiring for the backend.

Backend Model Ingestion Context graph construction Reasoning/analytics Provenance Known limitations
Neo4j LPG Yes Yes Yes Partial Provenance and context metadata are stored as node and edge properties; relationship properties and stable node identifiers are required.
FalkorDB LPG Yes Yes Partial Partial Redis-based; provenance depends on node/edge properties, and multi-graph isolation depends on the selected graph name.
Amazon Neptune LPG Yes Yes Partial Partial Use the property-graph endpoint; AWS auth, VPC, and endpoint configuration can affect local tests. Provenance depends on node/edge properties.
Apache AGE LPG Yes Yes Partial Partial Runs through PostgreSQL/AGE; Cypher compatibility and property handling can differ from standalone LPG engines.
RDF4J RDF Yes Partial Partial Partial Context separation relies on named graphs; triple-level provenance may require reification or graph-level metadata. RDF4JStore(repository_id=...) currently has no effect — the constructor always connects to the "default" repository regardless of the value passed; track a fix separately.
Apache Jena RDF Yes Partial Partial Partial Named graphs are needed for context separation; backend configuration and transaction behavior matter.
Blazegraph RDF Yes Partial Partial Partial Use quads/named graphs for context; IRI stability and graph naming matter for provenance.
Anzo RDF Yes Partial Partial Partial Anzo deployments are environment-specific; validate dataset_uri/graphmart naming, named-graph support, and provenance mapping.
Oxigraph RDF Yes Partial Partial Partial Embedded, single-process store (in-memory or on-disk); named graphs are supported, but there is no separate server process to scale independently.

RDF and LPG differences

  • LPG backends store context and provenance as graph elements and properties. If a backend does not support relationship properties, some provenance patterns may be degraded.
  • RDF backends rely on IRIs, named graphs, and optional reification. Context graphs and provenance are easiest to preserve when the store supports named graphs/quads.
  • Ingestion works across both models, but the physical representation differs: LPG stores nodes/edges directly, while RDF stores subject-predicate-object statements.
  • Reasoning and analytics should be validated against the adapter's query capabilities, especially for path traversal, property filters, and named-graph queries.

Minimal connection examples

Prefer the referenced notebook cells for a working setup. The examples below show the intended adapter entrypoints, not a universal connection DSL.

Neo4j

import os
from semantica.graph_store import Neo4jStore

store = Neo4jStore(
    uri='bolt://localhost:7687',
    user='neo4j',
    password=os.environ['NEO4J_PASSWORD']
)

FalkorDB

from semantica.graph_store import FalkorDBStore

store = FalkorDBStore(
    host='localhost',
    port=6379,
    graph_name='semantica'
)

Amazon Neptune

from semantica.graph_store import AmazonNeptuneStore

store = AmazonNeptuneStore(
    endpoint='your-neptune-cluster-endpoint',
    port=8182,
    region='us-east-1'
)

Apache AGE

from semantica.graph_store import ApacheAgeStore

store = ApacheAgeStore(
    connection_string='host=localhost dbname=agedb user=postgres password=postgres',
    graph_name='semantica'
)

RDF4J

from semantica.triplet_store import RDF4JStore

store = RDF4JStore(
    endpoint='http://localhost:8080/rdf4j-server',
    repository_id='semantica'  # currently has no effect; connects to "default" (see Known limitations)
)

Apache Jena

from semantica.triplet_store import JenaStore

store = JenaStore(
    endpoint='http://localhost:3030/ds'
)

Blazegraph

from semantica.triplet_store import BlazegraphStore

store = BlazegraphStore(
    endpoint='http://localhost:9999/blazegraph/sparql'
)

Anzo

from semantica.triplet_store import AnzoStore

store = AnzoStore(
    endpoint='http://anzo-host:8080',
    dataset_uri='http://cambridgesemantics.com/Graphmart/your-graphmart-id'
)

Oxigraph

from semantica.triplet_store import OxigraphStore

# Omit `path` for an in-memory store; pass a directory for on-disk persistence.
store = OxigraphStore(path='./semantica-oxigraph-data')

Replace hostnames, ports, repositories, graphs, and credentials with values from your environment. For regulated or self-hosted deployments, keep credentials in environment variables or secret storage rather than source code.