TripleStorePorts
What it is
Abstract interfaces (ports) and shared types for a triple store subsystem:
- Custom exceptions grouped under
Exceptions OntologyEventenum for change events- Two ABCs defining required methods for implementations:
ITripleStorePort(low-level adapter/backend)ITripleStoreService(service layer with subscriptions and schema helpers)
Public API
Exceptions
Container class defining exception types (no behavior beyond type identity):
Exceptions.SubjectNotFoundErrorExceptions.SubscriptionNotFoundErrorExceptions.ViewNotFoundErrorExceptions.GraphNotFoundErrorExceptions.GraphAlreadyExistsError
OntologyEvent (Enum)
OntologyEvent.INSERT- insertion eventOntologyEvent.DELETE- deletion event
ITripleStorePort (ABC)
Backend/adapter contract; all methods are abstract:
insert(triples: Graph, graph_name: URIRef | None = None)- insert triples into (optionally) a named graph.remove(triples: Graph, graph_name: URIRef | None = None)- remove triples from (optionally) a named graph.get() -> Graph- return the full graph from the store.handle_view_event(view: tuple[URIRef|None, URIRef|None, URIRef|None], event: OntologyEvent, triple: tuple[URIRef|None, URIRef|None, URIRef|None])- handle an event for a view pattern.query(query: str) -> rdflib.query.Result- execute a SPARQL query.query_view(view: str, query: str) -> rdflib.query.Result- execute a query scoped to a view (string identifier).get_subject_graph(subject: URIRef) -> Graph- return triples for a specific subject.create_graph(graph_name: URIRef)- create a named graph.- May raise:
Exceptions.GraphAlreadyExistsError
- May raise:
clear_graph(graph_name: URIRef | None = None)- clear triples from a graph (default or named).- May raise:
Exceptions.GraphNotFoundError
- May raise:
drop_graph(graph_name: URIRef)- drop a named graph.- May raise:
Exceptions.GraphNotFoundError
- May raise:
list_graphs() -> list[URIRef]- list named graphs.
ITripleStoreService (ABC)
Service-layer contract; all methods are abstract:
subscribe(topic: tuple[URIRef|None, URIRef|None, URIRef|None], callback: Callable[[bytes], None], event_type: OntologyEvent | None = None, graph_name: URIRef | str | None = "*") -> None- Register a callback for matching triple events (INSERT/DELETE).
- Note: despite docstring mentioning a subscription ID, the signature returns
None.
insert(triples: Graph, graph_name: URIRef | None = None)- insert triples.remove(triples: Graph, graph_name: URIRef | None = None)- remove triples.get() -> Graph- get all triples.query(query: str) -> rdflib.query.Result- execute a SPARQL query.query_view(view: str, query: str) -> rdflib.query.Result- query within a view.get_subject_graph(subject: str) -> Graph- get triples for a subject.create_graph(graph_name: URIRef)- create a named graph.- May raise:
Exceptions.GraphAlreadyExistsError
- May raise:
clear_graph(graph_name: URIRef | None = None)- clear a graph.- May raise:
Exceptions.GraphNotFoundError
- May raise:
drop_graph(graph_name: URIRef)- drop a named graph.- May raise:
Exceptions.GraphNotFoundError
- May raise:
list_graphs() -> list[URIRef]- list named graphs.load_schema(filepath: str)- load schema triples from a file into the store.get_schema_graph() -> Graph- retrieve schema/ontology triples.
Configuration/Dependencies
- Depends on rdflib:
rdflib.Graph,rdflib.URIRef, andrdflib.query.Result
- Uses Python standard library:
abc.ABC,abc.abstractmethodenum.Enum- typing:
Callable,Dict,List,Tuple
Usage
This module defines interfaces only; you must implement them to use a concrete store.
from rdflib import Graph, URIRef
from naas_abi_core.services.triple_store.TripleStorePorts import ITripleStorePort
class InMemoryTripleStore(ITripleStorePort):
def __init__(self):
self._g = Graph()
def insert(self, triples: Graph, graph_name: URIRef | None = None):
for t in triples:
self._g.add(t)
def remove(self, triples: Graph, graph_name: URIRef | None = None):
for t in triples:
self._g.remove(t)
def get(self) -> Graph:
return self._g
# Remaining abstract methods must be implemented for instantiation.
Caveats
- Both
ITripleStorePortandITripleStoreServiceare abstract; they cannot be instantiated without implementing all abstract methods. ITripleStoreService.subscribe(...)has a return type ofNone, but its docstring describes returning a subscription ID; implementations should reconcile this mismatch.