第 2 讲 · 知识工程与图数据库
机器学习是让机器从样本中“猜”规律,知识工程则尝试把人已经知道的事实和规则明确交给机器。二者解决的不是同一个问题:前者擅长从像素、声音等连续数据中拟合模式,后者擅长表达实体、关系和可追溯的事实。
数据、信息和知识
一串孤立数字只是数据;知道它们是“每一天的气温”,数据才有语义,成为信息;进一步知道“连续高温时要调整生产计划”,才形成可行动的知识。课件把知识看作经过组织、带有语境并能够支持判断的信息。
知识可以有许多分类:经验知识与理论知识、对象层知识与元知识、全局与局部、显式与隐性、完备与不完备、确定与不确定、陈述性与过程性、固定与可变化。分类的目的不是背名词,而是提醒我们:不同知识不能都塞进同一种表示。例如“南京是江苏省省会”适合陈述为事实,“怎样排查程序错误”更像过程,“这个诊断有 70% 概率”还要表达不确定性。
一个知识系统通常至少包含:
- 领域知识:这个世界中有哪些对象和事实;
- 推理知识:从已知事实怎样得到新结论;
- 任务知识:解决当前问题时,先做什么、后做什么。
知识工程不只是录入资料,还包括获取知识、建模、实现系统、验证结果,以及在系统给出答案时解释“为什么”。
语法正确不等于有意义
机器理解一段表示,需要逐层解决:
- 语法:表示是否符合格式;
- 语义:符号指向什么;
- 语境:同一个词在当前上下文中的含义;
- 语用:说这句话的目的是什么;
- 经验:现实世界中哪些默认常识没有被写出来。
这也是开放世界知识表示困难的原因。仅仅把自然语言换成 XML 或 JSON,只是换了语法;如果实体没有统一身份、关系没有明确定义,机器仍然不知道各字段在现实里指什么。
从网页到语义网
普通 Web 主要把文档链接给人看,语义网希望进一步把“资源之间的关系”链接给机器。URI 用来给资源稳定命名。需要注意,现实资源和介绍它的网页不是一回事:一个人的 URI 指向这个人,个人主页 URI 指向一份文档。服务器还可以通过内容协商,让同一个资源按请求返回 HTML 或机器可读数据。
RDF 用三元组表达事实:主语和谓语通常是 URI,宾语可以是 URI,也可以是字符串、数字等字面量;暂时没有全局名字的资源可以使用空白节点。
同一批三元组可以写成 N-Triples、RDF/XML 等不同语法。语法不同,图的含义不变。多个数据源若使用共同 URI,就能形成 Linked Data;DBpedia 之类的数据集再通过 SPARQL 提供跨图查询。
图数据库的五个基本对象
Neo4j 使用属性图模型:
- 节点 Node:实体;
- 关系 Relationship:带方向、带类型的边;
- 属性 Property:节点或关系上的键值对;
- 标签 Label:给节点分组,如
Person; - 路径 Path:一串相连节点和关系。
RDF 和属性图都能画成点和边,但不要把它们完全等同。RDF 的谓语本身是可全局标识的资源,强调语义互联;Neo4j 的标签、关系类型和属性更贴近数据库工程。
Cypher:先画模式,再写查询
圆括号表示节点,方括号表示关系,箭头表示方向:
CREATE (lee:Person {name: '李东骏', studentId: '23371100'})
CREATE (course:Course {name: '人工智能导论'})
CREATE (lee)-[:TAKES {semester: 'spring'}]->(course)
查询时用 MATCH 描述想找的图形,用 WHERE 过滤,用 RETURN 输出:
MATCH (p:Person)-[r:TAKES]->(c:Course)
WHERE c.name = '人工智能导论'
RETURN p.name, r.semester
删除前也要先匹配。节点还连着关系时,直接 DELETE 通常会失败;可明确先删关系,或在确认范围后使用 DETACH DELETE:
MATCH (p:Person {studentId: '23371100'})
DETACH DELETE p
推荐系统就是一个典型图模式:用户喜欢商品,其他相似用户也喜欢某些商品,就可以沿“用户—商品—用户—商品”的路径找候选。不过图上存在路径,只说明它是候选关联,不自动证明因果关系。
建图时最容易犯的三个错误
- 把名字当唯一身份:同名实体会被误合并。应该另设稳定 ID。
- 关系方向随手写:
人物-[:属于]->组织和反方向查询不同,建模前先约定。 - 边界无限扩张:知识图谱不需要把全世界都录进去。先明确要回答的问题,再决定节点和关系。
本讲的作业正是用 Cypher 建一个节点数超过 10 的主题知识图谱。第 6 讲以后会转向从数据中学习;知识工程提供的是另一种“把已知知识交给机器”的路径。