7.3 知识图谱:把散落的事实连成可问答的网 本节摘要:知识图谱把文档、表格、日志里的实体与关系收进一张图,让"问一句、答一片"成为可能。本节走完整链路:schema 先行的建模纪律、实体抽取与对齐的工程手段、实例数据的批量入库,最后搭建"自然语言问句翻译成 Cypher"的问答层。读完你将能评估自己业务的知识图谱化路径。 推荐和欺诈都从业务数据出发,知识图谱多一步"从非结构化文本里来"。它的难点不在存储——Neo4j 存图谱毫无压力——而在抽取、对齐、维护三件工程活。 一、Schema 先行:本体设计三步 与 2.
本节摘要:知识图谱把文档、表格、日志里的实体与关系收进一张图,让"问一句、答一片"成为可能。本节走完整链路:schema 先行的建模纪律、实体抽取与对齐的工程手段、实例数据的批量入库,最后搭建"自然语言问句翻译成 Cypher"的问答层。读完你将能评估自己业务的知识图谱化路径。
推荐和欺诈都从业务数据出发,知识图谱多一步"从非结构化文本里来"。它的难点不在存储——Neo4j 存图谱毫无压力——而在抽取、对齐、维护三件工程活。
与 2.1 的建模三步法同源,但知识图谱更强调"本体先行"——先定义类型系统,再灌数据:
// 本体约束:类型、唯一键、必填(约束先行的落地) CREATE CONSTRAINT org_name_unique IF NOT EXISTS FOR (o:Organization) REQUIRE o.name IS UNIQUE CREATE CONSTRAINT person_name_unique IF NOT EXISTS FOR (p:Person) REQUIRE p.name IS UNIQUE
本体设计三步: 1. 列类型:Person、Organization、Location、Concept、Event 2. 定关系:WORKS_AT、LOCATED_IN、FOUNDED、SUBCONCEPT_OF 3. 规定层级:Concept 用 SUBCONCEPT_OF 自环构成分类树
知识图谱与业务图的差别在于层级敏感:"图数据库 IS_A 数据库"这类分类关系要能支撑"把所有数据库相关的概念带出来"的泛化查询——自环关系 + 变长路径的组合(2.3 的技能)正是为此准备的。
同一实体在不同文本里的写法不同("中科院"与"中国科学院"),不对齐就会长出双头节点。工程上分两步:
// 第一步:抽取结果批量入库(MERGE 保幂等,alias 数组做别名) UNWIND $entities AS e MERGE (n:Organization {name: e.canonical}) ON CREATE SET n.aliases = e.aliases, n.type = e.type WITH n, e UNWIND e.aliases AS alias MERGE (al:Alias {name: alias}) MERGE (al)-[:REFERS_TO]->(n)
第二步:查询时先过别名层——"中科院" → Alias 节点 → REFERS_TO → 官方节点 别名层的好处:归一逻辑可迭代, 新别名随时补挂,不必改历史节点

⚠️ 别在节点上存别名数组然后每次 CONTAINS 查——别名层(独立节点 + REFERS_TO 边)让归一化变成可增量维护的图结构,这是知识图谱建模的成熟惯例。
以"人工智能领域知识图谱"为例灌入种子数据并跑一个泛化查询:
// 种子数据:概念树 + 人物关系 CREATE (ai:Concept {name: '人工智能'}) CREATE (ml:Concept {name: '机器学习'}) CREATE (dl:Concept {name: '深度学习'}) CREATE (kg:Concept {name: '知识图谱'}) CREATE (ml)-[:SUBCONCEPT_OF]->(ai) CREATE (dl)-[:SUBCONCEPT_OF]->(ml) CREATE (kg)-[:SUBCONCEPT_OF]->(ai) CREATE (t:Person {name: '陈墨'})-[:EXPERT_IN {since: 2020}]->(kg) CREATE (t)-[:WORKS_AT]->(:Organization {name: '启元实验室'})
// 泛化查询:AI 大领域下所有子概念的专家都有谁 MATCH (root:Concept {name: '人工智能'})<-[:SUBCONCEPT_OF*1..3]-(c:Concept) <-[:EXPERT_IN]-(p:Person) RETURN c.name AS 子概念, collect(DISTINCT p.name) AS 专家
子概念 | 专家 -----------|------ "机器学习" | ["王一舟"] "深度学习" | ["王一舟", "李微"] "知识图谱" | ["陈墨"]
SUBCONCEPT_OF*1..3 一行,就是关系库要写三次递归 CTE 的活——1.1 的判据在知识图谱场景的再次应验。
业务人员不会写 Cypher,问答层的职责是把问句翻译过去。成熟做法是意图模板 + 实体链接两级:
问句:"陈墨在哪个机构工作?" ↓ 意图识别 → 命中模板:{人} 的任职机构 ↓ 实体链接 → "陈墨" 经别名层定位 Person 节点 ↓ 模板实例化 → 下方 Cypher
// 模板实例化结果(参数 $person = '陈墨') MATCH (p:Person {name: $person})-[:WORKS_AT]->(o:Organization) RETURN o.name AS 机构
机构 ---- "启元实验室"
模板覆盖不了的问句,退化为"实体 + 相邻两跳"的通用查询(MATCH (n {name: $e})-[r]-(m) RETURN ...),答不出来时明确说"图谱暂未覆盖"——诚实降级比瞎答更可信,这是问答系统的产品纪律。
图谱回答"是什么、有什么关系"。下一节换成"怎么走最快"——路径查找与导航。