ontograph
LLM-powered knowledge graph engine
Ontological entity resolution · Orbit-based proximity scoring · Hybrid semantic-graph retrieval
Install
pip install ontograph
Requires OPENAI_API_KEY environment variable (or set it in a .env file — loaded automatically).
Quick Start
from ontograph import OntoDB, Schema
db = OntoDB("my_knowledge.db")
# Define an ontology schema (constrains what the LLM extracts)
db.register_schema(Schema(
name="workplace",
entity_types=["person", "project", "team", "meeting", "topic"],
relationship_types=[
{"name": "works_on", "directed": True},
{"name": "manages", "directed": True},
{"name": "colleague", "directed": False},
{"name": "discussed", "directed": True},
],
))
# Ingest unstructured text — entities and relationships extracted automatically
db.ingest(
"Meeting with Nara and Marco about Project Neptune. "
"Nara is leading the backend rewrite. Marco raised concerns about the launch deadline.",
source_type="transcript",
schema_name="workplace",
)
# Search the graph (semantic + keyword + graph traversal)
results = db.search("What is Nara working on?")
# Ask a question — LLM synthesizes answer from graph context
answer = db.ask("Who is concerned about the launch deadline?")
print(answer)
Core Concepts
Entities, Relationships, Attributes
Everything decomposes into three primitives:
| Primitive | Description |
|---|---|
| Entities | Nodes — people, projects, topics, anything nameable |
| Relationships | Edges — directed (A → B) or bidirectional (A ↔ B) |
| Attributes | Key-value metadata on entities and relationships |
Entity Resolution
When ingesting text, names are fuzzy-matched against existing entities using a four-signal composite score:
| Signal | Method | Catches |
|---|---|---|
| Phonetic | Metaphone | Pronunciation-similar names |
| Spelling | Jaro-Winkler | Typos and minor variations |
| Semantic | Embedding cosine | Conceptual matches |
| Orbit | Interaction frequency | Context-aware disambiguation |
Orbit
Your "orbit" is a proximity model. Entities you interact with frequently score higher — when "Sal" appears in a transcript, the system weights your manager "Sam" (who you interact with daily) over random "Sal"s elsewhere.
sam = db.get_entity("Sam")
db.add_alias(sam.id, "Sal", alias_type="transcript_error")
File References
Entities can reference external files — receipts, photos, PDFs, contracts — that live on disk. These references are surfaced during search and Q&A so the LLM knows where to find supporting material.
# Attach files to an entity
db.attach_files("kitchen renovation", [
"/Users/me/photos/kitchen_before.jpg",
"/Users/me/photos/kitchen_after.jpg",
])
# When you ask a question, the LLM sees the file references
answer = db.ask("What photos do we have of the kitchen?")
# Or via CLI
ontograph attach "kitchen renovation" /Users/me/photos/kitchen_before.jpg
Schemas
Ontology schemas define valid entity and relationship types for a domain. They constrain what the LLM can extract during ingestion.
Self-Improving Feedback Loop
Every entity resolution is logged. Mark resolutions as correct/incorrect to track accuracy over time:
db.mark_resolution("log_id", correct=True)
print(db.stats()["resolution_accuracy"])
Python API
| Method | Description |
|---|---|
OntoDB(db_path, api_key, observer_id) |
Main entry point |
.ingest(text, source_type, schema_name) |
Ingest unstructured text |
.search(query, limit, graph_depth) |
Hybrid search |
.ask(question) |
LLM-synthesized answer from graph context |
.add_entity(name, type, attributes, file_refs) |
Manual entity creation |
.add_relationship(source, target, type) |
Manual relationship creation |
.attach_files(entity, file_paths) |
Attach file references |
.detach_files(entity, file_paths) |
Remove file references |
.resolve(name, entity_type, observer) |
Entity resolution |
.orbit(observer, limit) |
Proximity-ranked entities |
.stats() |
Graph statistics and resolution accuracy |
CLI
ontograph --help # Full command list with examples
ontograph ingest --text "..." # Ingest text (also accepts --file or stdin)
ontograph search "query" # Hybrid search
ontograph ask "question" # LLM-synthesized answer
ontograph entities [--type person] # List entities
ontograph entity "name" # Get single entity
ontograph relationships "name" # Get relationships
ontograph neighbors "name" # Graph traversal
ontograph resolve "name" # Entity resolution
ontograph attach "entity" file.pdf # Attach file references
ontograph detach "entity" file.pdf # Remove file references
ontograph schema register --file s.json # Register ontology schema
ontograph dashboard # Interactive graph visualization
Dashboard
ontograph dashboard # Opens browser at http://127.0.0.1:8484
ontograph dashboard --port 9000 # Custom port
ontograph --db project.db dashboard
Interactive force-directed graph visualization powered by D3.js. Starts with the most-connected entity as hub, showing its top 50 relationships. Click to select, double-click to expand connections on demand, drag to reposition, scroll to zoom.
License
MIT
Metadata
Release files for ontograph 0.4.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | Provenance | Actions |
|---|---|---|---|---|
| ontograph-0.4.0.tar.gz | 6.3 MB | Without provenance | Details for ontograph-0.4.0.tar.gz |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Actions Reset |
|---|---|---|---|---|
| ontograph-0.4.0-py3-none-any.whl | Python 3 | none | any | Details for ontograph-0.4.0-py3-none-any.whl |
Total release size: 6.3 MB
Release files / ontograph-0.4.0.tar.gz
| Download URL | ontograph-0.4.0.tar.gz |
|---|---|
| Size | 6.3 MB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
3511e02ad328be675d7af3368bdb2917ae93c980f4a53d25d7b6aaf3aa0337e9
|
|
BLAKE2b-256 checksum How to use checksums |
96027f24e3223efa0448365408d6a9644c7f75e7823bed0be931533275071ffc
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
uv/0.9.26 {"installer":{"name":"uv","version":"0.9.26","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"macOS","version":null,"id":null,"libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}
|
Release files / ontograph-0.4.0-py3-none-any.whl
| Download URL | ontograph-0.4.0-py3-none-any.whl |
|---|---|
| Size | 44.3 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
9246f63f8b6a159bef2a63b57b5ea6edec47a940698a2eefd0f3c861e26e1873
|
|
BLAKE2b-256 checksum How to use checksums |
e53327d27e6739cb54ddc13af9ef15e70a6bc010b5dc236420d0e9ac3b021d61
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
uv/0.9.26 {"installer":{"name":"uv","version":"0.9.26","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"macOS","version":null,"id":null,"libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}
|
Security for ontograph 0.4.0
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
No provenance found
None of the files in this release were uploaded with provenance metadata.
A note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.
To learn more about protecting yourself from malicious actors, visit our package security documentation.