Domain-agnostic Graph RAG framework for building governed, auditable Knowledge Graphs
Project description
graphrag-core
A domain-agnostic framework for building governed, auditable Knowledge Graphs from documents using LLM-powered extraction, provenance-native storage, and multi-agent orchestration.
Architecture
YOUR DOMAIN LAYER (Layer 2)
Ontology, domain tools, domain agents, templates
|
| imports
v
graphrag-core (Layer 1)
Ingestion Extraction Graph Store Search
Curation Registry Tool Library Orchestration
Install
pip install graphrag-core # core (in-memory backends)
pip install graphrag-core[neo4j] # + Neo4j graph store and search
pip install graphrag-core[anthropic] # + Claude LLM client
pip install graphrag-core[all] # everything
Quick Start
import asyncio
from graphrag_core import (
TextParser, TokenChunker, IngestionPipeline,
InMemoryGraphStore, InMemorySearchEngine,
LLMExtractionEngine, OntologySchema, NodeTypeDefinition,
PropertyDefinition, RelationshipTypeDefinition,
ToolLibrary, register_core_tools,
)
from graphrag_core.models import ChunkConfig, DocumentChunk, GraphNode, ImportRun
from datetime import datetime
async def main():
# 1. Ingest a document
pipeline = IngestionPipeline(parser=TextParser(), chunker=TokenChunker())
chunks = await pipeline.ingest(b"Alice works at Acme Corp.", "text/plain")
# 2. Define your domain schema
schema = OntologySchema(
node_types=[
NodeTypeDefinition(
label="Person",
properties=[PropertyDefinition(name="name", type="string", required=True)],
required_properties=["name"],
),
NodeTypeDefinition(
label="Company",
properties=[PropertyDefinition(name="name", type="string", required=True)],
required_properties=["name"],
),
],
relationship_types=[
RelationshipTypeDefinition(type="WORKS_AT", source_types=["Person"], target_types=["Company"]),
],
)
# 3. Extract entities (requires an LLMClient implementation)
# engine = LLMExtractionEngine(llm_client=your_client)
# result = await engine.extract(chunks, schema, import_run)
# 4. Store in graph
store = InMemoryGraphStore()
await store.merge_node(GraphNode(id="p1", label="Person", properties={"name": "Alice"}), "run-1")
await store.merge_node(GraphNode(id="c1", label="Company", properties={"name": "Acme Corp"}), "run-1")
# 5. Search
search = InMemorySearchEngine(
nodes=[await store.get_node("p1"), await store.get_node("c1")],
)
results = await search.fulltext_search("Acme", top_k=5)
print(results)
# 6. Wire up tools for agents
library = ToolLibrary()
register_core_tools(library, store, search)
result = await library.execute("get_entity", entity_id="p1")
print(result)
asyncio.run(main())
Building Blocks
| # | Block | Interface | Implementation | Status |
|---|---|---|---|---|
| 1 | Document Ingestion | DocumentParser, Chunker |
PDF, DOCX, Text, Markdown parsers; TokenChunker | Done |
| 2 | Entity Extraction | ExtractionEngine, LLMClient |
LLMExtractionEngine, AnthropicLLMClient | Done |
| 3 | Knowledge Graph | GraphStore |
InMemoryGraphStore, Neo4jGraphStore | Done |
| 4 | Hybrid Search | SearchEngine |
InMemorySearchEngine, Neo4jHybridSearch (RRF) | Done |
| 5 | Governed Curation | DetectionLayer |
DeterministicDetectionLayer, CurationPipeline | Done (detection layer) |
| 6 | Entity Registry | EntityRegistry |
InMemoryEntityRegistry (fuzzy matching) | Done |
| 7 | Tool Library | ToolLibrary |
4 core tools (get_entity, search, audit_trail, related) | Done |
| 8 | Orchestration | Agent, Orchestrator |
SequentialOrchestrator, AgentContext | Done |
Protocols marked with (Protocol only) have no default implementation yet:
LLMCurationLayer,ApprovalGateway(BB5 layers 2-3)ReportRenderer(BB8)EmbeddingModel(cross-cutting)
Extension Pattern
from graphrag_core import OntologySchema, ToolLibrary, Tool
# 1. Define your domain ontology
schema = OntologySchema(node_types=[...], relationship_types=[...])
# 2. Register domain-specific tools
library = ToolLibrary()
library.register(Tool(name="my_tool", description="...", parameters={}, handler=my_handler))
# 3. Implement domain agents
class MyAgent:
name = "analyst"
async def execute(self, context):
result = await context.tool_library.execute("my_tool")
context.workflow_state["analysis"] = result.data
return AgentResult(agent_name=self.name, success=True)
Development
# Clone and install
git clone https://github.com/cdel1/graphrag-core.git
cd graphrag-core
uv sync --all-extras
# Run unit tests
uv run pytest tests/ -x -q
# Run integration tests (requires Neo4j)
docker run -d --name neo4j-test -p 7474:7474 -p 7687:7687 \
-e NEO4J_AUTH=neo4j/development neo4j:5-community
uv run pytest tests/ -x --run-integration
# Build
uv build
License
MIT
Project details
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file graphrag_core-0.4.0.tar.gz.
File metadata
- Download URL: graphrag_core-0.4.0.tar.gz
- Upload date:
- Size: 135.5 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: uv/0.11.6 {"installer":{"name":"uv","version":"0.11.6","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}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
9d87ba610987851592bc1aa56ced60f0cd4efa53c611b3d2da1b95da39f85524
|
|
| MD5 |
63efe48db81e23a1eecbf05c968b38a4
|
|
| BLAKE2b-256 |
7253d0b9e1a633db7496729f1c5b5ea6c498c52f2a24b7befc448b36b5122a90
|
File details
Details for the file graphrag_core-0.4.0-py3-none-any.whl.
File metadata
- Download URL: graphrag_core-0.4.0-py3-none-any.whl
- Upload date:
- Size: 33.6 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: uv/0.11.6 {"installer":{"name":"uv","version":"0.11.6","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}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
176047faceb02c9eddaaec3c6e5b7c6e560d066fe5a1275cb40018f9f91ab4eb
|
|
| MD5 |
9ed102efc9119cfb4cb0af71e41fca96
|
|
| BLAKE2b-256 |
399f4a7ac77e6eb4e901130e7628115e97909fc8eae64a0a54bc49d9bd9888de
|