知识图谱基础:什么是知识图谱?

说实话,我第一次接触知识图谱这个概念时,脑子里全是问号。什么图?什么谱?跟知识有啥关系?

后来我做了几个金融风控项目,才真正明白——知识图谱,说白了就是用图的方式,把现实世界里的实体和它们之间的关系给串起来。你想想看,我们平时处理的数据,大多是表格形式的,一行一行的。但现实世界哪有这么规整?人和人之间有社交关系,公司和公司之间有股权关系,借款人和担保人之间有担保关系……这些关系天然就是一张网,而不是一张表。

我在一个反欺诈项目里遇到过这样的情况:两个借款人,表面上看毫无关联,住址不同、手机号不同、身份证归属地也不同。但用知识图谱一查,发现他们共用过同一个WiFi热点,而且那个热点正好在一个被标记为“欺诈团伙据点”的地址附近。这种隐藏关系,传统的关系型数据库根本查不出来。

核心定义:知识图谱是一种用图结构来组织和表示知识的技术。它把现实世界中的事物抽象为“节点”,把事物之间的关联抽象为“边”。

三元组:实体、关系、属性

知识图谱最基础的单位,叫做三元组。这个名字听起来挺唬人,其实特别简单——就是三个东西组成的一个小单元。

举个例子:

  • 实体:就是图中的节点。比如“张三”、“工商银行”、“贷款合同12345”。实体是知识图谱里的主角。
  • 关系:就是图中的边。比如“申请了”、“担保了”、“属于”。关系把两个实体连起来。
  • 属性:描述实体的特征。比如张三的“年龄:35岁”、工商银行的“注册资本:1万亿”。

一个完整的三元组长这样:

(张三) — [申请了] → (贷款合同12345)
(贷款合同12345) — [金额] → "50万元"

第一行是“实体-关系-实体”,第二行是“实体-属性-属性值”。

我习惯把三元组理解成一句话的主谓宾结构。主语是实体,谓语是关系,宾语是另一个实体或属性值。你想想看,我们平时说话不就是这样吗?“张三申请了贷款”——主语、谓语、宾语,齐活。

个人经验:在金融风控场景里,我建议把三元组设计得尽量细粒度。比如“担保关系”,不要只写“张三担保李四”,而要写成“张三(担保人)— [担保] → 李四(被担保人)— [涉及] → 贷款合同C001”。这样后续做图分析时,能挖出更多有价值的信息。

为什么金融风控需要知识图谱?

这个问题我问过自己很多次。传统的关系型数据库,加上机器学习模型,难道不够用吗?

嗯,这里要注意——传统方法擅长处理“特征明确”的问题,但金融欺诈往往是“关系复杂”的问题

举个例子:

  • 一个欺诈团伙,可能用10个不同的身份证去申请贷款。这些身份证的姓名、年龄、职业都不同,传统模型会认为这是10个不同的好人。
  • 但知识图谱能发现:这10个身份证都绑定了同一个手机号,或者都填了同一个单位地址,或者都通过同一个IP地址提交申请。

这种“多对一”的关联模式,就是欺诈团伙的典型特征。知识图谱能把这些隐藏的关联给揪出来。

我曾经处理过一个团伙欺诈案,涉及200多个借款人。用传统方法查了三天,只发现其中5个人有直接关联。后来用知识图谱做了一轮两度关联查询,好家伙——200多个人里,有180个都通过某种方式关联到了同一个核心节点。那个核心节点,是一个已经被列入黑名单的中介公司。

避坑指南:我曾经犯过一个错误——把知识图谱当成万能药,什么数据都往里塞。结果图变得又大又乱,查询效率极低。后来我学乖了:先明确业务问题,再设计图谱结构。比如做反欺诈,就重点构建“人-手机号-设备-地址-银行卡”这几类实体和它们之间的关系。无关的数据,先别往里加。

图数据库(Neo4j)简介

有了知识图谱的概念,接下来就是怎么存、怎么查的问题了。传统的关系型数据库存图结构,效率很低。你想啊,查一个“张三的朋友的朋友的朋友”,在关系型数据库里可能要JOIN四五张表,性能直接崩掉。

这时候就需要图数据库登场了。

图数据库是专门为存储和查询图结构数据而设计的。市面上有很多选择,比如Neo4j、JanusGraph、ArangoDB等。我个人最常用的是Neo4j,原因很简单:社区活跃、文档齐全、上手快。

Neo4j有几个核心概念:

概念 说明 类比关系型数据库
节点(Node) 代表实体,比如人、公司、合同 类似表中的一行记录
关系(Relationship) 代表实体之间的关联,有方向 类似外键关联
标签(Label) 给节点分类,比如:Person、:Company 类似表名
属性(Property) 节点或关系的键值对信息 类似表中的字段

Neo4j的查询语言叫Cypher,语法很直观。我刚开始学的时候,花了不到半小时就能写基本的查询了。

举个例子,创建一个“张三申请了贷款”的三元组:

CREATE (zhangsan:Person {name: '张三', age: 35})
CREATE (loan:Loan {id: 'L001', amount: 500000})
CREATE (zhangsan)-[:APPLIED_FOR {date: '2024-01-15'}]->(loan)

查询张三的所有贷款:

MATCH (p:Person {name: '张三'})-[:APPLIED_FOR]->(l:Loan)
RETURN p.name, l.id, l.amount

是不是很直观?MATCH就是匹配模式,RETURN就是返回结果。你甚至可以用自然语言的方式去理解这段查询:找到一个人,他叫张三,他申请了贷款,返回他的名字、贷款ID和金额。

小技巧:在Neo4j里做多度关联查询,性能优势特别明显。比如查“张三的朋友的朋友的朋友”,用Cypher写就是:MATCH (p:Person {name: '张三'})-[:FRIEND*3]->(f) RETURN f。这个*3表示三度关系,Neo4j内部用图遍历算法,效率比关系型数据库高好几个数量级。

知识图谱的核心逻辑

说了这么多,我画了一张图来总结知识图谱的核心逻辑。这张图展示了从原始数据到知识图谱,再到风控应用的完整链路。

知识图谱驱动金融风控的核心逻辑 原始数据 用户信息、交易记录 关系数据 担保、社交、设备关联 外部数据 黑名单、工商信息 三元组构建(实体 → 关系 → 属性) (张三) — [申请了] → (贷款合同L001) | 属性:金额50万、日期2024-01-15 图数据库(Neo4j)存储与查询 Cypher查询:MATCH (p)-[:APPLIED_FOR]->(l) RETURN p, l 团伙欺诈识别 关联风险传导 担保圈风险分析 异常模式发现

这张图展示的就是知识图谱在金融风控中的完整链路。从原始数据出发,经过三元组构建,存入图数据库,最后支撑各种风控应用。每一步都有坑,但也都有对应的解决方案。

我个人觉得,知识图谱最迷人的地方在于——它能让你看到数据之间的“连接”。在金融风控里,很多时候风险就藏在这些连接里。你找到了连接,就找到了风险。

一句话总结:知识图谱 = 实体 + 关系 + 属性,图数据库 = 存图 + 查图。两者结合,让金融风控从“看单点”升级为“看网络”。


公众号:蓝海资料掘金营,微信deep3321