mirror of
https://github.com/semantica-agi/semantica.git
synced 2026-08-29 04:26:20 +00:00
* docs: replace Exported Classes import blocks with summary tables across all 25 modules * docs: add method/parameter tables to parse, ingest, ontology, normalize, triplet_store, change_management, conflicts, export, graph_store, provenance, and semantic_extract modules
12 KiB
12 KiB
title, description, icon
| title | description | icon |
|---|---|---|
| Triplet Store Module | RDF triple storage with SPARQL queries and bulk loading — Blazegraph, Apache Jena, and RDF4J. | table |
semantica.triplet_store provides W3C-standard RDF storage with full SPARQL query support. Use it when you need semantic web compatibility, OWL reasoning, SPARQL-based queries, or standards-compliant RDF serialization.
Exported Classes
| Class | Role |
|---|---|
TripletStore |
Unified interface: add_triplet, get_triplets, delete_triplet, execute_query, bulk_load |
QueryEngine |
SPARQL 1.1 execution with query optimization and result streaming |
BulkLoader |
High-volume RDF loading with progress tracking and transaction batching |
BlazegraphStore |
Blazegraph REST API — Named Graphs, SPARQL 1.1 Update, GeoSPARQL |
JenaStore |
Apache Jena Fuseki — TDB2 backend, GeoSPARQL, SPARQL 1.1 |
RDF4JStore |
Eclipse RDF4J — SailRepository, in-memory or native store |
What You Get
Unified interface across Blazegraph, Apache Jena (Fuseki), and RDF4J — swap backends with one parameter. Zero-setup in-memory mode via `backend="memory"` for unit tests and small datasets — no server required. Full SELECT, CONSTRUCT, ASK, and UPDATE query support with pagination for large result sets. Apache Jena supports OWL and RDFS inference natively — subclass and property chain queries automatically resolved. Isolate triples by source, dataset, or time period using named graph management. Load and serialize to Turtle, JSON-LD, N-Triples, and RDF/XML with a single method call.Quick Start
```python from semantica.triplet_store import TripletStorestore = TripletStore(
backend="blazegraph",
endpoint="http://localhost:9999/blazegraph/sparql"
)
```
# Bulk load a list of triplets
store.add_triplets_bulk(triplets)
```
for row in results:
print(row["person"], row["company"])
```
Backends
```python from semantica.triplet_store import TripletStorestore = TripletStore(
backend="blazegraph",
endpoint="http://localhost:9999/blazegraph/sparql",
namespace="semantica"
)
```
Best for: Wikidata-style workloads, high triple counts, SPARQL 1.1 full support.
Best for: General RDF, standard SPARQL, production deployments needing OWL inference.
**Enable OWL reasoning:**
```python
store = TripletStore(
backend="jena",
endpoint="http://localhost:3030/dataset/sparql",
update_endpoint="http://localhost:3030/dataset/update",
reasoner="OWL", # "OWL" | "RDFS" | "OWL_MINI" | None
)
# Load an OWL ontology — subclass/property chain inferences are automatic
store.import_file("ontology.ttl", format="turtle")
store.add_triplets_bulk(data_triplets)
# Query using inferred relationships
results = store.sparql("""
SELECT ?person WHERE {
?person a ex:Employee . # inferred via subClassOf chain
}
""")
```
Best for: Enterprise Java ecosystems, Eclipse Foundation deployments, plugin-based reasoning.
| Backend | License | OWL Reasoning | Hosted Option | Best For |
| ------- | ------- | ------------- | ------------- | -------- |
| Blazegraph | Open source | No | Self-hosted | Wikidata-style workloads, high triple count |
| Apache Jena | Apache 2.0 | Yes (OWL/RDFS) | Self-hosted | General RDF, OWL reasoning, standard SPARQL |
| RDF4J | Eclipse 1.0 | Via plugin | Self-hosted or cloud | Enterprise Java ecosystems |
| InMemory | Built-in | No | N/A | Unit tests, small graphs, no server required |
Namespace Prefix Management
Register custom prefixes to keep SPARQL queries readable:
from semantica.triplet_store import TripletStore
from semantica.ontology import NamespaceManager
ns = NamespaceManager(base_uri="http://example.org/")
ns.register("ex", "http://example.org/")
ns.register("schema", "https://schema.org/")
ns.register("owl", "http://www.w3.org/2002/07/owl#")
store = TripletStore(backend="jena", endpoint="...")
# Registered prefixes are automatically prepended to every SPARQL query
results = store.sparql("""
SELECT ?company WHERE {
?person ex:works_for ?company ;
schema:name "Alice" .
}
""")
TripletStore Methods
| Method | Returns | Description |
|---|---|---|
add_triplet(s, p, o, graph=None) |
str |
Add a single triplet, returns triplet ID |
add_triplets_bulk(triplets) |
List[str] |
Batch add triplets with transaction support |
get_triplets(graph=None) |
List[dict] |
Retrieve all triplets or from a named graph |
delete_triplet(triplet_id) |
bool |
Delete a triplet by ID |
sparql(query) |
List[dict] |
Execute SPARQL SELECT query |
sparql_construct(query) |
Graph |
Execute SPARQL CONSTRUCT query |
sparql_ask(query) |
bool |
Execute SPARQL ASK query |
sparql_update(query) |
None |
Execute SPARQL UPDATE (INSERT/DELETE) |
bulk_load(file, format) |
None |
Load RDF file (turtle, nt, xml) |
export(path, format) |
None |
Export to turtle, nt, xml |
list_graphs() |
List[str] |
List all named graphs |
clear_graph(graph_uri) |
None |
Delete all triples from a named graph |
SPARQL Queries
# SELECT — returns tabular results
results = store.sparql("""
PREFIX ex: <http://example.org/>
SELECT ?person ?company WHERE {
?person ex:founded ?company .
?company ex:located_in ex:SiliconValley .
}
""")
# CONSTRUCT — returns a graph of matched triples
graph = store.sparql_construct("""
PREFIX ex: <http://example.org/>
CONSTRUCT {
?s ex:connected_to ?o
} WHERE {
?s ex:founded ?company .
?company ex:has_investor ?o .
}
""")
# ASK — returns True/False
exists = store.sparql_ask("""
PREFIX ex: <http://example.org/>
ASK { ex:apple_inc ex:founded_by ex:steve_jobs . }
""")
# UPDATE — insert or delete triples
store.sparql_update("""
PREFIX ex: <http://example.org/>
INSERT DATA {
ex:apple_inc ex:listed_on ex:NASDAQ .
}
""")
SPARQL Result Pagination
For large result sets, paginate with LIMIT and OFFSET:
page_size = 1000
offset = 0
while True:
results = store.sparql(f"""
SELECT ?s ?p ?o WHERE {{
?s ?p ?o .
}}
ORDER BY ?s
LIMIT {page_size} OFFSET {offset}
""")
if not results:
break
process_batch(results)
offset += page_size
Named Graph Management
# Named graphs — store triples in isolated contexts
store.add_triplet(
subject="http://example.org/a",
predicate="http://example.org/p",
obj="http://example.org/b",
graph="http://example.org/graph1"
)
# Query a specific named graph
results = store.sparql("""
SELECT ?s ?p ?o FROM <http://example.org/graph1> WHERE {
?s ?p ?o .
}
""")
# List all named graphs
graphs = store.list_graphs()
# Clear a named graph
store.clear_graph("http://example.org/graph1")
Integration with Export Module
The Export module can write RDF that the triplet store then imports:
from semantica.export import RDFExporter
from semantica.triplet_store import TripletStore
# Export KG to Turtle
exporter = RDFExporter()
exporter.export_to_file(kg, "output.ttl", format="turtle")
# Load into triplet store
store = TripletStore(backend="jena", endpoint="http://localhost:3030/dataset/sparql")
store.import_file("output.ttl", format="turtle")
# Now query with SPARQL
results = store.sparql("SELECT * WHERE { ?s ?p ?o } LIMIT 10")