Before / A separate graph database
More copies. More pipelines. More to maintain.
A separate graph database means copying source data, keeping that copy synchronized, and maintaining another database as your data changes.
PuppyGraph separates graph modeling and compute from the underlying data storage. Define relationships across your databases, warehouses, and lakehouses, then let applications and AI agents query them without loading a separate graph database.
01 / Architecture
Traditionally, using a separate graph database adds data copies, synchronization pipelines, and another system to operate. PuppyGraph separates graph compute from storage, so applications and AI agents can query relationships across your existing tables.
Before / A separate graph database
A separate graph database means copying source data, keeping that copy synchronized, and maintaining another database as your data changes.
After / With PuppyGraph
PuppyGraph brings graph modeling and compute to your existing tables. Applications and AI agents can query their relationships without a separate graph database to load and keep in sync.
Your data
Lakehouses · Warehouses · Databases
Graph query engine: no data movement required
Connect
Locate tables and configure access to each source.
Model
Map tables to entities, relationships, and properties.
Compute
Plan graph queries and execute the work across compute nodes.
Built-in assistant · Your agents
MCP & query toolsProduct integrations · Query clients
openCypher & Gremlin02 / Inside the query engine
Leader nodes compile graph queries into a plan of node and edge operators and optimize it. Compute nodes execute that plan in parallel with a vectorized engine, while your sources only serve the data each query reads.
Parse queries and map graph patterns onto tables using the graph schema.
Coordinate distributed execution.
Also serve catalog and modeling tools for the Control Plane.
Compute nodes / Scale out for query capacity
Iceberg · ClickHouse · PostgreSQL · Databricks · Snowflake · BigQuery, and more supported sources →
Load local tables when you need them. External tables are queried directly from your sources. Optional local tables store a copy on compute nodes for faster reads; their freshness depends on your loading and refresh settings.
Explore data access options →See how PuppyGraph performs on published benchmarks, then test it on your own data and query patterns.
Explore benchmarks →03 / How it works
Connect the tables you already have, define their relationships, and put the graph to work. Follow one supply-chain example from source tables to a supplier-dependency answer.
Step 1 / Connect
Add a catalog connection with the access settings for your source. The catalog makes its tables available for graph modeling.
Product and component data live in Iceberg; supplier records live in PostgreSQL. One graph model connects them.
Explore supported connectors →iceberg_supply_chainproductscomponentsproduct_componentspostgres_supply_chainsuppliersStep 2 / Model
PuppyGraph uses a labeled property graph: typed nodes and directed edges, with properties on both. A graph schema defines how your source data becomes that model.
Flexible modeling for complex data. Combine multiple tables, use composite identifiers, filter rows, derive fields with expressions, and expand nested arrays.
AI can help build the model. PuppyGraph’s built-in AI assistant can propose entities, relationships, and property mappings for you to review and approve.
A simple mapping example
productsproduct_id · nameproduct_ componentsfrom: product_idcomponentscomponent_idcomponentsfrom: component_idsupplierssupplier_id · nameid properties; endpoint columns connect the edges.Step 3 / Query
Use openCypher or Gremlin to traverse relationships and retrieve connected records. Agents can use the same engine through MCP or graph query tools.
Agent feedback loop
Entities, relationships, and properties give agents a semantic model for choosing paths and retrieving connected context.
PuppyGraph checks queries against the relationships defined in the model, bringing those semantics into execution.
Use connected records to answer or explore further.
An undefined relationship prompts the agent to revise its approach or recognize a gap in the model.
Refine the next step
Which products depend on Supplier S42?
MATCH (p:Product)-[:USES]->
(:Component)-[:SUPPLIED_BY]->
(s:Supplier {id: "S42"})
RETURN DISTINCT p.id, p.name
ORDER BY p.idBoth products use Component C10, supplied by S42.
04 / See it work
Download PuppyGraph to model your own data, book a demo to discuss your workload, or join our community to ask questions.
$ docker run -p 8081:8081 \
-p 8182:8182 -p 7687:7687 \
puppygraph/puppygraph:latestPulling puppygraph/puppygraph:latestStarting PuppyGraphWeb console listening on 0.0.0.0:8081Gremlin endpoint listening on 0.0.0.0:8182PuppyGraph is running# no pipelines · no second database · no data movement