部署 Neo4j
图数据库用于连接数据,Cypher 查询语言和图算法。
平台高级
为什么
Neo4j 以节点和关系存数据,连接查询(朋友的朋友、推荐)O(1) 而非 SQL 的 O(n) join。Cypher 是声明式图查询语言。
平台即服务采用率 2024 年增长 24%,团队从虚拟机管理转向 git push 部署。the cloud infrastructure market reached $330B in 2024, growing 22% year-over-year (Synergy Research),PaaS 层捕获了大多数新工作负载。
何时使用
社交网络、推荐引擎、欺诈检测和知识图谱用 Neo4j。简单 CRUD 避免(用 SQL)。
如何做
1. Docker — neo4j:5 镜像加 volume
2. 认证 — NEO4J_AUTH=neo4j/password
3. Cypher — Cypher Shell 或 Browser :7474
4. 导入 — LOAD CSV 或 APOC 过程
5. 索引 — CREATE INDEX FOR (n:User) ON (n.email)
6. 集群 — Neo4j Enterprise 因果集群
7. 驱动 — neo4j-driver 用于 JS/Python/Java
示例
# docker-compose.yml
services:
neo4j:
image: neo4j:5
environment:
NEO4J_AUTH: neo4j/password
ports: ["7474:7474", "7687:7687"]
volumes: [neo4jdata:/data]
volumes: { neo4jdata: }
# Cypher — 创建和查询
CREATE (alice:User {name: "Alice"})-[:KNOWS]->(bob:User {name: "Bob"});
MATCH (u:User {name: "Alice"})-[:KNOWS*1..2]-(friend)
RETURN friend.name;
# JS 驱动
import neo4j from "neo4j-driver";
const driver = neo4j.driver("bolt://localhost:7687", neo4j.auth.basic("neo4j", "password"));
const session = driver.session();
const result = await session.run("MATCH (u:User) RETURN u");
常见问题
- ⚠无索引 — 全图扫描,查找属性建索引
- ⚠内存过低 — Neo4j 最少 2-4GB,设 NEO4J_server_memory_heap_max__size
- ⚠环境间配置漂移 — 使用基础设施即代码(Terraform/Pulumi)保持 dev/staging/prod 一致
最佳实践
- ✓所有查找属性建索引 — 大幅加速查询
- ✓用 APOC 过程 — 导入、遍历和 ETL 工具函数
- ✓设置健康检查和优雅关闭 — 处理 SIGTERM 以在退出前排空进行中的请求