图数据库的价值在于把「关系」变成一等公民。但「万物皆图」往往适得其反——选错场景会付出建模、性能与运维三重代价。本文聚焦 Neo4j 属性图(property graph)的建模方法、数据适用范围,以及与 MySQL、PostgreSQL、Elasticsearch 的边界划分。
段末注释:属性图指节点与边均可携带属性的图模型;Neo4j 即典型实现,区别于 RDF(resource description framework,资源描述框架)三元组模型。
一、Neo4j 数据模型精讲
1.1 四类元素
1 | // 节点:可多标签 |
| 规则 | 说明 |
|---|---|
| 关系必有类型 | 如 KNOWS、INTERACTS_WITH,便于索引与查询 |
| 关系有方向 | 无向语义可用双向边,或约定 -(r)- 匹配时忽略方向 |
| 节点可多标签 | (:Protein:Enzyme) 表达多重分类 |
| 属性类型 | 布尔、整数、浮点、字符串、数组、点/时间(Neo4j 5+) |
1.2 建模 vs 关系型:心智转换
| 关系型思路 | 图思路 |
|---|---|
| 用户表 + 订单表 + 外键 | (:User)-[:PLACED]->(:Order) |
| 多对多中间表 | 直接一条关系,属性放边上 |
| 深度 JOIN 查好友的好友 | 变长路径 (a)-[:KNOWS*2]->(b) |
| 范式化拆表 | 反范式:为查询便利可冗余属性到节点 |
图建模的核心问题不是「表怎么拆」,而是:哪些 traversal(遍历)是你的核心查询?
二、数据适用范围:什么时候该用 Neo4j
2.1 强适用场景
| 场景 | 典型查询 | 为何适合 |
|---|---|---|
| 社交网络 | 好友推荐、N 度人脉 | 多跳遍历是原生操作 |
| 知识图谱 | 实体关系问答、语义检索 | 实体-关系-属性天然契合 |
| 金融风控 | 团伙识别、担保环 | 模式匹配毫秒级 |
| 推荐系统 | 「买了 A 的人也买了 B」 | 协同过滤路径查询 |
| IT 运维 / 调用链 | 故障根因、依赖分析 | 服务拓扑即图 |
| 生物信息学 | 蛋白互作、通路、文献引用网络 | 关系密集、层次不深但连通复杂 |
| 权限 / 访问控制 | 用户-组-资源继承链 | 继承路径查询 |
2.2 弱适用或不应首选
| 场景 | 原因 | 更优选择 |
|---|---|---|
| 强事务账务 | 图库非为复式记账设计 | PostgreSQL + 严格 ACID |
| 海量单行 CRUD | 简单主键读写无图优势 | MySQL / PostgreSQL |
| 全文检索为主 | 图库全文是辅助能力 | Elasticsearch / OpenSearch |
| 纯时序指标 | 时间序列聚合非强项 | InfluxDB / Prometheus |
| 超大规模 OLAP 图算法 | 单机 Neo4j OLAP 弱 | Spark GraphX + 离线 + 结果回写 |
| 万亿边实时写入 | 社区版横向扩展有限 | NebulaGraph / JanusGraph |
2.3 决策速查
1 | flowchart TD |
三、建模原则与反模式预告
3.1 推荐原则
- 按查询建模型,而非按源系统表结构 1:1 映射
- 关系类型语义清晰:
WORKS_AT优于泛化的RELATED_TO - 高频过滤字段建索引(见 Neo4j-05)
- 唯一业务键 + 约束:
MERGE依赖唯一性 - 控制超级节点(super node):高度数节点单独设计(详见 Neo4j-08)
3.2 常见反模式
| 反模式 | 问题 | 改法 |
|---|---|---|
| 上帝节点 | 一个 Country 连百万 Person |
中间层 City、或时间分片 |
| 属性塞爆 | 节点上数百 KB JSON | 大字段放对象存储,图只存引用 |
| 无类型关系 | 全部 LINK |
按语义拆分类型 |
| 重复 CREATE | 导入产生重复节点 | 用 MERGE + 唯一约束 |
四、领域建模示例
4.1 企业知识图谱(简化)
1 | // 论文引用网络 |
查询「某主题被引 2 跳内的相关论文」:
1 | MATCH (t:Topic {name: 'CRISPR'})<-[:ABOUT]-(p:Paper)-[:CITES*1..2]->(cited) |
4.2 蛋白互作(生物信息)
1 | MERGE (a:Protein {uniprot: 'P00533'}) // EGFR |
源数据常见格式:TSV 边列表(蛋白 A、蛋白 B、score)、Neo4j 友好 CSV、或从 NetworkX 导出(见 Neo4j-04)。
4.3 风控:设备关联
1 | MERGE (u:User {id: 'U1001'}) |
查询「与某用户共享设备或 IP 的其他用户」(2 跳内):
1 | MATCH (u:User {id: 'U1001'})-[*1..2]-(other:User) |
五、常见源数据格式与图模型的映射
| 源格式 | 典型内容 | 映射策略 |
|---|---|---|
| CSV 边表 | src,dst,type,weight |
每行 MERGE 两个节点 + 一条关系 |
| CSV 点表 + 边表 | 节点属性与边分开 | 先导点再导边 |
| JSON / JSON-LD | API 嵌套文档 | APOC 解析或应用层转换 |
| RDF / Turtle | 三元组 | neosemantics 插件或 ETL 转属性图 |
| SQL 表 + 外键 | 规范化 schema | 表 → 标签,外键 → 关系 |
| GraphML / GML | 通用图交换 | NetworkX、yEd 中转 |
| 邻接矩阵 | 稀疏网络科学数据 | SciPy / NetworkX 转边列表 |
细节与工具命令见 Neo4j-04.数据导入与对接工具。
六、与 PostgreSQL 的混合架构
生产常见模式:PostgreSQL 存权威业务数据,Neo4j 存关系视图。
1 | flowchart LR |
| 存 PG | 存 Neo4j |
|---|---|
| 订单金额、库存、发票 | 用户-商品-类目浏览图 |
| 强一致账务 | 推荐、风控图模式 |
同步手段:Debezium + Kafka、Airbyte、自研 MERGE 批任务。
七、小结
- Neo4j 适合关系遍历、模式匹配、路径分析;不适合替代通用 OLTP 账务与纯检索引擎。
- 建模以核心查询路径为中心,避免超级节点与无类型关系。
- 源数据多为 CSV 边表、SQL 外键、JSON API;大图导入与驱动对接见下一系列篇。
| 下一篇 | 内容 |
|---|---|
| Neo4j-03.Cypher增删改查 | CREATE / MATCH / SET / DELETE / 约束 |
| Neo4j-04.数据导入与对接工具 | LOAD CSV、bulk import、Python |