1. 图数据库的存储模型,原生图(Neo4j, NebulaGraph, JanusGraph)与多层映射(图→关系表→内存图)的性能差异?
原生图存储(Neo4j、NebulaGraph、JanusGraph)与多层映射(图→关系表→内存图)在性能上有什么差异?
- 原生图存储模型的特点
- 多层映射(图→关系表→内存图)的代价
- 两者性能差异的根源
原生图存储(如 Neo4j、NebulaGraph、JanusGraph)在图结构上直接存储节点与边,用指针/邻接结构把边与两端节点物理相邻存放,遍历时通过指针跳转实现"索引邻居"(index-free adjacency),多跳遍历无需全局索引查找,遍历性能与图大小无关、只与遍历子图相关,因此深度遍历与多跳查询很高。多层映射通常是先把图建模为关系表(节点表+边表),再用 JOIN 或加载到内存图(如内存图计算框架)执行遍历,其代价是每跳遍历都要通过索引/JOIN 重建邻接关系,涉及多次索引查找与行的物化,遍历深度越大开销越大,且内存图还需要加载与序列化开销。性能差异的根源是"邻接关系是否物理化存储":原生图把邻接关系固化在存储中,遍历零成本获取邻居;映射式每次遍历都要重新计算邻接关系,导致遍历成本随深度线性叠加。
核心概念是 index-free adjacency(索引无关邻接访问)。回答应强调原生图把"邻居关系"作为物理存储的一部分,遍历是内存指针跳转,而映射式依赖 JOIN/索引重建邻接,遍历成本随深度放大。同时说明内存图适合批量算法(如全图 PageRank)但一次性加载有成本,体现对两种路径适用场景的理解。