基于 PostgreSQL 的企业级图数据库
AgensGraph 是一款基于 PostgreSQL 的多模型图数据库,完美结合了关系型数据库和图数据库的优势。它支持标准 SQL 查询和 Cypher 图查询语言,让你可以在同一个数据库中同时使用关系模型和图模型。
在同一查询中混合使用 SQL 和 Cypher
完全兼容 PostgreSQL 生态系统
优化的图遍历和查询性能
支持 ACID 事务和数据持久化
| 参数 | 值 | 说明 |
|---|---|---|
| 主机 | agensgraph.{your-box}.heiyu.space |
从 Lazycat 管理台获取 |
| 端口 | 5432 |
PostgreSQL 默认端口 |
| 数据库 | agens |
默认数据库名 |
| 用户名 | postgres |
默认管理员用户 |
| 密码 | agens |
默认密码(建议修改) |
使用 agens 客户端或 psql 连接:
# 使用 agens 客户端
agens -h agensgraph.{your-box}.heiyu.space -p 5432 -U postgres -d agens
# 或使用 psql
PGPASSWORD=agens psql -h agensgraph.{your-box}.heiyu.space -p 5432 -U postgres -d agens-- 创建图
CREATE GRAPH demo_graph;
-- 设置默认图路径
SET graph_path = demo_graph;
-- 创建节点标签和关系标签
CREATE VLABEL person;
CREATE ELABEL knows;\dvl 查看节点标签,\del 查看关系标签,SHOW graph_path; 查看当前图路径。
-- 插入节点
CREATE (:person {id: 1, name: 'Alice', city: 'Shanghai'});
CREATE (:person {id: 2, name: 'Bob', city: 'Shanghai'});
CREATE (:person {id: 3, name: 'Carol', city: 'Beijing'});
CREATE (:person {id: 4, name: 'Dave', city: 'Shenzhen'});
-- 插入转介绍关系
MATCH (a:person {name: 'Alice'}), (b:person {name: 'Bob'})
CREATE (a)-[:knows {channel: 'wechat', since: 2019}]->(b);
MATCH (a:person {name: 'Bob'}), (b:person {name: 'Carol'})
CREATE (a)-[:knows {channel: 'event', since: 2021}]->(b);
MATCH (a:person {name: 'Alice'}), (b:person {name: 'Dave'})
CREATE (a)-[:knows {channel: 'referral', since: 2018}]->(b);-- 查找两跳内的潜在客户
MATCH (origin:person {name: 'Alice'})-[:knows*1..2]->(target:person)
WHERE origin <> target
RETURN DISTINCT target.name AS candidate, target.city AS city
ORDER BY candidate;
-- 查找最短链路
MATCH path = shortestPath(
(start:person {name: 'Alice'})-[:knows*1..5]->(target:person {name: 'Carol'})
)
RETURN nodes(path) AS hop_nodes, relationships(path) AS hop_edges;AgensGraph 非常适合分析社交网络、推荐系统等场景。以下示例展示如何分析客户转介绍关系:
-- 创建补充信息表
CREATE TABLE person_metrics (
person_id int PRIMARY KEY,
total_orders int,
last_order_amount numeric
);
INSERT INTO person_metrics VALUES
(1, 15, 1200),
(2, 8, 760),
(3, 25, 3100),
(4, 2, 200);
-- SQL + Cypher 混合查询
SELECT graph_result.p->>'name' AS customer,
m.total_orders,
m.last_order_amount
FROM person_metrics m,
LATERAL (
MATCH (p:person)-[:knows]->(:person {name: 'Carol'})
RETURN p
) AS graph_result
WHERE m.person_id = (graph_result.p->>'id')::int
AND m.total_orders >= 5
ORDER BY m.last_order_amount DESC;| 位置 | 路径 |
|---|---|
| 容器内部 | /var/lib/postgresql/data |
| 宿主机路径 | /data/appvar/cloud.lazycat.app.{user}.agensgraph/data |
-- 查看所有图
SELECT * FROM ag_graph;
-- 切换图
SET graph_path = your_graph;
-- 删除图(级联删除所有数据)
DROP GRAPH demo_graph CASCADE;
-- 删除标签
DROP VLABEL person CASCADE;
DROP ELABEL knows CASCADE;-- 查看连接信息
\conninfo
-- 列出所有数据库
\l
-- 列出所有表
\dt
-- 查看内置图函数
\df cypher.*
-- 退出
\qALTER USER postgres WITH PASSWORD 'your_new_password';SHOW graph_path;使用 ->> 操作符访问节点属性(返回文本),使用 -> 返回 JSON:
-- 在 MATCH 中返回文本
MATCH (p:person {name: 'Alice'})
RETURN p->>'name' AS name_text;
-- 在 MATCH 中返回 JSON
MATCH (p:person {name: 'Alice'})
RETURN p->'city' AS city_json;# 备份整个数据库
pg_dump -h agensgraph.{your-box}.heiyu.space -p 5432 -U postgres -d agens > backup.sql
# 恢复数据库
psql -h agensgraph.{your-box}.heiyu.space -p 5432 -U postgres -d agens < backup.sqlAgensGraph is a multi-model graph database based on PostgreSQL, perfectly combining the advantages of relational and graph databases. It supports standard SQL queries and Cypher graph query language, allowing you to use both relational and graph models in the same database.
Mix SQL and Cypher in the same query
Full compatibility with PostgreSQL ecosystem
Optimized graph traversal and query performance
ACID transactions and data persistence
| Parameter | Value | Description |
|---|---|---|
| Host | agensgraph.{your-box}.heiyu.space |
Get from Lazycat console |
| Port | 5432 |
PostgreSQL default port |
| Database | agens |
Default database name |
| Username | postgres |
Default admin user |
| Password | agens |
Default password (recommend changing) |
Use agens client or psql to connect:
# Using agens client
agens -h agensgraph.{your-box}.heiyu.space -p 5432 -U postgres -d agens
# Or using psql
PGPASSWORD=agens psql -h agensgraph.{your-box}.heiyu.space -p 5432 -U postgres -d agens-- Create graph
CREATE GRAPH demo_graph;
-- Set default graph path
SET graph_path = demo_graph;
-- Create vertex and edge labels
CREATE VLABEL person;
CREATE ELABEL knows;\dvl to view vertex labels, \del for edge labels, and SHOW graph_path; to check current graph path.
-- Insert nodes
CREATE (:person {id: 1, name: 'Alice', city: 'Shanghai'});
CREATE (:person {id: 2, name: 'Bob', city: 'Shanghai'});
CREATE (:person {id: 3, name: 'Carol', city: 'Beijing'});
CREATE (:person {id: 4, name: 'Dave', city: 'Shenzhen'});
-- Insert referral relationships
MATCH (a:person {name: 'Alice'}), (b:person {name: 'Bob'})
CREATE (a)-[:knows {channel: 'wechat', since: 2019}]->(b);
MATCH (a:person {name: 'Bob'}), (b:person {name: 'Carol'})
CREATE (a)-[:knows {channel: 'event', since: 2021}]->(b);
MATCH (a:person {name: 'Alice'}), (b:person {name: 'Dave'})
CREATE (a)-[:knows {channel: 'referral', since: 2018}]->(b);-- Find potential targets within 2 hops
MATCH (origin:person {name: 'Alice'})-[:knows*1..2]->(target:person)
WHERE origin <> target
RETURN DISTINCT target.name AS candidate, target.city AS city
ORDER BY candidate;
-- Find shortest referral path
MATCH path = shortestPath(
(start:person {name: 'Alice'})-[:knows*1..5]->(target:person {name: 'Carol'})
)
RETURN nodes(path) AS hop_nodes, relationships(path) AS hop_edges;AgensGraph is ideal for analyzing social networks, recommendation systems, and more. This example shows how to analyze customer referral relationships:
-- Create supplementary metrics table
CREATE TABLE person_metrics (
person_id int PRIMARY KEY,
total_orders int,
last_order_amount numeric
);
INSERT INTO person_metrics VALUES
(1, 15, 1200),
(2, 8, 760),
(3, 25, 3100),
(4, 2, 200);
-- SQL + Cypher hybrid query
SELECT graph_result.p->>'name' AS customer,
m.total_orders,
m.last_order_amount
FROM person_metrics m,
LATERAL (
MATCH (p:person)-[:knows]->(:person {name: 'Carol'})
RETURN p
) AS graph_result
WHERE m.person_id = (graph_result.p->>'id')::int
AND m.total_orders >= 5
ORDER BY m.last_order_amount DESC;| Location | Path |
|---|---|
| Container Internal | /var/lib/postgresql/data |
| Host Path | /data/appvar/cloud.lazycat.app.{user}.agensgraph/data |
-- List all graphs
SELECT * FROM ag_graph;
-- Switch graph
SET graph_path = your_graph;
-- Drop graph (cascade delete all data)
DROP GRAPH demo_graph CASCADE;
-- Drop labels
DROP VLABEL person CASCADE;
DROP ELABEL knows CASCADE;-- Show connection info
\conninfo
-- List all databases
\l
-- List all tables
\dt
-- Show built-in graph functions
\df cypher.*
-- Exit
\qALTER USER postgres WITH PASSWORD 'your_new_password';SHOW graph_path;Use ->> for text values and -> for JSON values:
-- Return text within MATCH
MATCH (p:person {name: 'Alice'})
RETURN p->>'name' AS name_text;
-- Return JSON within MATCH
MATCH (p:person {name: 'Alice'})
RETURN p->'city' AS city_json;# Backup entire database
pg_dump -h agensgraph.{your-box}.heiyu.space -p 5432 -U postgres -d agens > backup.sql
# Restore database
psql -h agensgraph.{your-box}.heiyu.space -p 5432 -U postgres -d agens < backup.sql