4、网络构建基础:从关系数据到图结构
各位同学,今天我们来聊聊投资知识网络里最核心的一步——网络构建。
说白了,就是把那些散落在Excel表格、数据库里的关系数据,变成一张能跑能算的图。我刚开始做投资分析时,总觉得数据就是数据,直到有一次我试图找出两家看似无关的公司之间的隐性关联,手动翻了三天报表……嗯,从那以后,我彻底明白了:没有图结构,你永远看不到关系的全貌。
4.1 关系数据 vs 图结构:到底差在哪?
你想想看,传统的关系数据长什么样?
一张表,行是实体,列是属性。比如「公司信息表」里,一行就是一家公司,列是名称、行业、市值。另一张「投资关系表」里,一行就是一笔投资,列是投资方、被投方、金额。
这种结构,查单条记录很快。但如果你想问:「A公司投过的所有公司里,有哪些后来又投了B公司的竞争对手?」——嗯,SQL写起来能让你怀疑人生。
图结构就不一样了。它把实体变成节点,把关系变成边。节点可以带属性(比如公司名称、行业),边也可以带属性(比如投资金额、时间)。
我个人习惯把图结构想象成一张「关系网」。你站在一个节点上,顺着边一跳,就能找到所有关联。这种直觉,是传统表格给不了的。
4.2 邻接矩阵:最直观的数学表达
说到图结构,第一个绕不开的概念就是邻接矩阵。
假设我们有4家公司:A、B、C、D。它们之间的投资关系如下:
- A 投资了 B
- A 投资了 C
- B 投资了 D
- C 投资了 D
用邻接矩阵表示,就是一个4x4的方阵:
A B C D
A 0 1 1 0
B 0 0 0 1
C 0 0 0 1
D 0 0 0 0
行表示投资方,列表示被投方。1表示有关系,0表示没关系。
我在项目中遇到过一个问题:当节点数量超过1000时,邻接矩阵会变得非常稀疏——大部分格子都是0。存储起来浪费空间,计算起来也慢。所以,邻接矩阵更适合小规模、稠密的网络分析。
4.3 边列表:实战中最常用的格式
邻接矩阵虽然直观,但实际工作中,我更常用边列表。
边列表就是一张两列(或三列)的表:
| 源节点 | 目标节点 | 权重(可选) |
|---|---|---|
| A | B | 500万 |
| A | C | 300万 |
| B | D | 200万 |
| C | D | 150万 |
你看,每一行就是一条边。简单、清晰、容易扩展。我处理过最大的边列表有上亿条记录,用CSV格式存储,配合Python的pandas库,处理起来毫无压力。
为什么会这样?因为边列表只存储有关系的边,没有冗余的0。对于稀疏网络来说,这是最经济的方式。
4.4 图数据库简介:为什么需要Neo4j?
当你的网络规模大到一定程度——比如几百万个节点、几千万条边——内存里放不下,硬盘上查不动,这时候就需要图数据库了。
我个人最常用的是Neo4j。它原生支持图结构,查询语言叫Cypher,写起来非常直观。
举个例子,你想查「A公司投资过的所有公司」:
MATCH (a:Company {name: 'A'})-[r:INVESTED_IN]->(b:Company)
RETURN b.name, r.amount
是不是很像在画图?你几乎是在用自然语言描述「从A出发,沿着投资边,找到目标公司」。
Neo4j的底层存储就是邻接表——每个节点都存着它所有邻居的指针。所以遍历关系时,不需要全表扫描,速度极快。
我记得有一次帮一个基金做尽调,需要分析一个包含50万家公司、200万条投资关系的网络。用传统数据库查一个「三层关联」的路径,跑了20分钟还没出结果。换成Neo4j,同样的查询,0.3秒。
- 你的数据中,关系比实体本身更重要
- 你需要频繁做多跳查询(比如查「朋友的朋友的朋友」)
- 你的网络规模超过10万节点
4.5 本章知识体系总览
下面这张图,是我自己梳理的本章知识结构。你可以把它当作一张「地图」,随时回来对照。
这张图把本章的核心脉络串起来了。从左到右,是从数据格式到存储引擎的演进;从上到下,是每个分支的具体实现方式。你可以把它当作一个「导航图」,随时回来对照。
好了,这一章的内容就到这里。网络构建是投资知识可视化的地基,地基打牢了,后面画图、分析、挖掘才会顺手。下一章我们会聊到「布局算法」——也就是怎么把这张网画得既好看又好懂。