想象你是社区居委会的张主任。为了管理全社区的信息,你在办公室墙上钉了一块巨大的软木板:凡是住户、商店、医院、学校,都用一张小卡片写上名字挂上去;谁和谁有什么关系,就用不同颜色的毛线把两张卡片连起来——张三和李四是“邻居”,李四“住在”幸福小区,幸福小区里“有”社区医院。这块软木板就是一张活生生的“邻里关系网”。更进一步,你不仅能靠它查信息,还能根据已有的毛线推断出新的关系:张三认识李四,李四住在幸福小区,那张三八成也对幸福小区很熟悉。 知识图谱做的事和这块软木板一模一样:用“三元组”(谁—关系—谁)表达知识,用图数据库把海量三元组存起来,再用查询语言和推理引擎让人和机器快速找到答案、补全缺失的联系。本文从软木板上的一张卡片讲起,一直讲到原生图存储、SPARQL/Cypher 查询,以及规则推理和图神经网络推理,帮你把这套系统的每一层都装进脑子里。
对 AI 从业者而言,掌握知识图谱的存储建模、查询语言与推理机制,是构建可解释、可推理的多源知识系统的核心竞争力——这几乎是未来智能问答与决策引擎工程师的必备技能。
可视化演示
展示系统处理流水线、实时性能指标曲线及多方案对比分析,包含数据流转、吞吐延迟监控与方案评估。
本节配有交互动效(进入视口后自动加载,约 3KB)。
系统可视化 处理流程:输入→处理→模型→输出 性能监控:实时指标 P=L×T
三元组基础
张主任的软木板上,最底下那张卡片只写一件事:谁,和谁,什么关系。比如“张三—住在—幸福小区”,卡片上三个格子填得清清楚楚。这张卡片就是全社区信息的原子单位,计算机科学里叫它三元组(Triple)。软木板上贴的每一张卡,都是这么一张“三格卡”。
在知识图谱里,三元组记作 (s, p, o):主语(Subject)是关系的起点,谓语(Predicate)是关系本身,宾语(Object)是终点。主语和宾语是实体——人、地点、事件、物品都可以;谓语说明它们之间是什么关系。把千千万万张三、李四、幸福小区的卡片放到一起,就拼成了一张巨大的知识网络。
三元组是有方向的:主语指向宾语,方向一旦反了意思就完全不同。“张三住在幸福小区”和“幸福小区住在张三”是两个彻底不同的世界。这个方向性决定了后面查询和推理都要沿着边的指向走,就像毛线的两个端头不能接反一样。
1. \(s_i\)(主语):主语是关系的起点,指一个具体实体,比如“张三”。
2. \(p_i\)(谓语):谓语描述两个实体之间的关系类型,是毛线上的标签,比如“住在”“认识”。
3. \(o_i\)(宾语):宾语是关系的终点,可以是另一个实体,也可以是数值或文本。社区医院、幸福小区都是合法宾语。
4. \(G\) 与集合化表达:把 n 个三元组收集进一个集合,就是整个知识图谱;集合里的卡片可以查、可以拼、可以推。
理解了这“三格卡”,后面所有话题——RDF 模型、SPARQL 查询、规则推理——都是在给这张卡换样式、加索引、做推断。软木板的地基,就是这一张张三格卡。
RDF图模型
张主任发现,各单元楼交上来的卡片格式五花八门:有人写“张三大哥住幸福小区”,有人写“小区里有张三”。为了防止串门走错,他决定统一规格:每个住户配一个全网唯一的“门牌号”。在 RDF 世界里,这个门牌号叫 URI(统一资源标识符)。有了 URI,“北京市朝阳区幸福小区 3 号楼的张三”和“上海浦东的张三”再也不会混淆。
RDF(资源描述框架)是 W3C 制定的标准模型,它规定知识图谱的三元组里,主语、谓语、宾语都要尽量用 URI 表示,宾语还可以是字面量(数字、文本、日期)。因为大家共用一套门牌号规范,不同机构发布的 RDF 数据可以互相引用、拼接成一张更大的网——这就是语义网能成立的前提。
RDF 的开放性是它最大的武器:你不用和你隔壁的图谱系统提前约定数据格式,只要都用 URI 发布三元组,两套图谱就能自动融合。很多开放知识库(如 Wikidata、DBpedia)都基于 RDF 发布数据。正因如此,RDF 特别适合多源数据集成、知识问答、跨机构共享等场景。
1. \(\mathcal{U}\)(URI 集合):URI 是全局唯一的资源标识符,类似门牌号,指向某个具体的人、地点或概念。
\displaystyle \mathcal{U} = \{\text{0 \dots\}
2. \(\mathcal{L}\)(字面量):字面量就是具体的数值和文本,比如"45"、“医生”;它只能当宾语,不能当主语。
3. \(\times\)(笛卡尔积):主语、谓语、宾语三组候选集合互相组合,得到“所有可能的三元组”这个大空间。
4. \(\subseteq\)(子集关系):真正的 RDF 图只包含实际存在的三元组,是全集空间的一个子集,远比“所有组合”小。
RDF 是“统一门牌号”风格:标准、开放、可融合。但也正因为要照顾全局规范,灵活性打了折扣。下周社区开大会,张主任的另一位朋友带来了一套更随性的方法——那就是属性图。
属性图模型
另一个社区的李主任参观软木板后说:“你们搞得这么正规,我们那儿更自由。我们不用门牌号,直接在卡片上写名字、年龄、职业,连毛线上都贴备注。”这种“自由便利贴”风格,就是属性图模型(Property Graph),Neo4j 等图数据库的看家本领。
在属性图中,图由节点(Node)和边(Edge)构成。每个节点可以直接携带一堆键值对属性,比如张三节点上有 {name: "张三", age: 45, job: "医生"};每条边也可以携带属性,比如“住在”这条边可以带 {since: 2010}。此外,节点还可以打标签(Label)表示类型(Person、Place),边可以打关系类型(Type)。
属性图模型的优点是非常贴近直觉:不用设计 URI 规范、不用建本体层,上手快,表达力强。缺点则是:由于没有全局统一标识,两个系统的数据融合没有 RDF 那么顺滑。RDF 和属性图,一个适合开放世界共享,一个适合单系统快速迭代。
1. \(V\)(节点集合):图中所有实体的集合,节点可携带任意属性,如张三、李四、幸福小区。
2. \(E\)(边集合):边是有向的,连接两个节点并挂上关系类型和属性,如“住在”“就诊”。
3. \(\lambda_V\)(节点类型映射):把每个节点映射到一个类型标签,比如“人”“小区”,为查询提供筛选入口。
4. \(\lambda_E\)(边类型映射):把每条边映射到一种关系类型,比如“住在”“认识”。
如果说 RDF 是物业统一登记的表格,属性图就是居民随手贴、随手写的便利贴墙。两种模型都能记录社区知识,但风格迥异——这种差异一直延伸到了它们的查询语言里。
SPARQL查询
张主任想快速知道“谁住在幸福小区?”,如果一张张卡片翻过去太慢了。他拿出一张空白卡片,在上面写上“?x —住在— 幸福小区”,然后把这模板卡片在软木板上比对:凡是和它吻合的卡片,就能把?x 填出来。SPARQL 就是冲着这样的“模板匹配”设计的。
SPARQL 是 RDF 的标准查询语言。它的核心叫基本图模式(Basic Graph Pattern,BGP):在 WHERE 子句里写一组带变量的三元组模板,引擎会到数据图里匹配所有满足条件的组合。模板里的变量用 ?x 表示,就相当于填空格。
除了模式匹配,SPARQL 还支持 FILTER 过滤、GROUP BY 聚合、ORDER BY 排序,甚至可以把多个远程 SPARQL 端点连起来做联邦查询——就像张主任同时查隔壁社区的软木板。这种集合式匹配非常适合开放数据融合,也是知识问答系统的经典后端。
1. \(?x\)(查询变量):像卡片上的空位,可以匹配任意实体,最终就是我们想要的答案集。
2. \(\text{住在}\)(谓词常量):模板中固定谓词为“住在”,只匹配关系为“住在”的边。
3. \(\text{幸福小区}\)(宾语常量):宾语固定为“幸福小区”,把搜索范围缩小到“住在幸福小区的那些人”。
4. \(\in \mathcal{G}\)(图谱匹配):该三元组必须在图中真实存在;引擎借助 SPO/POS/OSP 等索引可以快速定位匹配集合。
SPARQL 用“模板填空”的思维查询知识——它不关心毛线怎么走,只关心哪些卡片能对上模板。但如果张主任想知道“张三和幸福小区之间隔了几层关系”,就需要另一种沿着毛线走路的查询方式:Cypher。
Cypher查询
张主任还有一个需求:“从张三这张卡片出发,先走'认识'毛线到李四,再走'住在'毛线,看能到哪儿。”这种沿边逐个移动的路径式思考,正是 Cypher 的核心。Cypher 是属性图数据库(典型如 Neo4j)的查询语言,它把软木板上的路径“画”在查询里。
Cypher 的招牌是它的模式语法:(a:Person)-[:KNOWS]->(b),看起来就像一张微型路线图。MATCH 语句负责把模式画到图上并找出所有匹配的路径;WHERE 可以加属性条件,RETURN 返回结果。最有特色的是可变长度路径,比如 (a)-[:KNOWS*1..3]->(b) 表示沿“认识”关系走 1 到 3 步——这个能力在好友推荐、风险传导分析中非常趁手。
Cypher 按图的拓扑结构一步步遍历,和 SPARQL 的“集合填空”思维截然不同。它写起来直观,对属性图特别友好,天然适合表达路径和子图。工程实践中常说:“RDF 的开放性和融合能力更强,属性图 + Cypher 的多跳遍历和交互分析更顺手。”
1. \((a:\text{Person})\)(带标签节点):变量 a 匹配所有标签为 Person 的节点,相当于把实体限定为“人”。
2. \(-[: \text{KNOWS}]\)(关系类型):两个节点之间必须存在一条类型为 KNOWS 的有向边。
3. \(\to (b)\)(终点变量):边的终点赋给变量 b,b 可以用于后续过滤或返回。
4. 整体匹配过程:引擎从所有 Person 节点出发,沿 KNOWS 边向外跳一步,收集所有到达的节点,完成一次路径遍历。
SPARQL 像拿着模板挨个比对卡片,Cypher 像沿着毛线一步一步走迷宫。两种思维各有千秋。不过,就算张主任把全社区的毛线都接上了,还有很多事没有记录——这时候就要靠推理。
规则推理
张主任的绝活是“经验判断”:张三认识李四,李四住在幸福小区,那张三对幸福小区八成很熟——这条信息卡片上根本没写,但张主任能推出来。这种“根据已知推未知”的脑补能力,在知识图谱里叫规则推理。
规则推理用“如果…那么…”语句表达知识。最经典的一类是传递性推理:若 A 认识 B,B 认识 C,则可以推导 A 与 C 之间至少存在间接联系。更一般的规则形如“若存在 (x, p₁, y) 且 (y, p₂, z),则推出 (x, p₃, z)”。这些规则可读性强、可解释,也方便领域专家审核。
执行上,前向链推理从已有事实出发,不断把规则结论作为新事实加入图谱,直到无法推出新事实为止;它适合离线预计算、查询要求快的场景。规则引擎还会做冲突检测、优先级排序、本体约束检查,保证推理结果既丰富又一致。许多工业级图谱系统就是靠这种“符号推理”支撑起累积式知识扩展的。
1. \((x, \text{认识}, y)\)(前提一):规则的第一条前提,要求 x 与 y 之间存在“认识”关系。
2. \(\wedge\)(逻辑与):表示两条前提必须同时成立,缺一不可。
3. \((y, \text{住在}, z)\)(前提二):第二条前提是 y 住在 z,把三个人/地串成了一条链。
4. 分母 \((x, \text{熟悉}, z)\)(结论):当前提满足时,把“x 熟悉 z”作为新三元组加入图谱——这一步就是推理落地。
规则推理就像把张主任的经验固化成条文:“见到 A 认识 B、B 住在 C,就补一条 A 熟悉 C。”它可解释、可审计,但对没见过的新花样无能为力。下一节这位“会自动看图猜话”的 AI 学徒,正好补上这块短板。
图神经网络推理
张主任的女儿带来一个 AI 助手,它不需要张主任一条条写经验规则,只要盯着软木板看很久,就能自动学会“看图猜话”——预测哪两张卡片之间还缺一根毛线。这个助手用的技术,就是图神经网络(GNN)。
GNN 把每个节点编码成一个低维向量(嵌入),通过消息传递机制在图上迭代:每一层,每个节点把自己的特征发给邻居,同时接收邻居发来的特征,聚合后再经过非线性变换形成新表示。多轮迭代后,节点向量就“吸收”了附近子图的结构信息——张主任看软木板是看整块板,GNN 看的是每个节点的高维“邻里画像”。
有了节点向量,就能做链接预测:计算两个节点之间存在某条关系的概率,从而补全图谱中缺失的边。GNN 的招牌优势是不需要显式规则,能自动捕捉复杂、非线性的关系模式;代价是训练需要大量数据、结果不易解释。所以工业界常把规则推理和 GNN 组合用:规则处理精确逻辑,GNN 负责模糊补全。
1. \(\mathbf{h}_v^{(k)}\)(节点向量):节点 v 在第 k 层的嵌入表示,初始向量来自节点自身的属性特征。
2. \(\mathcal{N}(v)\)(邻居集合):图中所有与 v 直接相连的节点,相当于软木板上与 v 有毛线相连的卡片。
3. \(\sum_{u \in \mathcal{N}(v)}\)(信息聚合):把邻居的表示逐元素相加,等价于把所有邻居的“意见”汇总到中心节点。
4. \(\mathbf{W}\) 与 \(\sigma\)(变换与激活):用权重矩阵做线性映射,再用 ReLU 等非线性函数激活,让模型表达力更强。
GNN 是那位“看图说话”的 AI 学徒:不用立规矩,看多了自然会补。如果说规则是张主任的约法三章,GNN 就是机器自己琢磨出的直觉。可不管是规则还是 GNN,最终都要跑在结实牢靠的存储上。
存储引擎选型
软木板虽然直观,但要挂上百万张卡片、接上万根毛线,木板本身就得升级——换成带金属网格的工程板,甚至配上电子目录柜。这就是存储与引擎选型要解决的问题:存储层决定了查询和推理能跑多快。
知识图谱底层的存储方案分两类。原生图存储(如 Neo4j、JanusGraph)把节点和边以邻接连指针的形式存在物理介质里,遍历邻居时顺着指针直接走,不需要做耗时的表 JOIN;非原生存储则把三元组装进关系型数据库或键值存储,开发成本低,但多跳查询性能通常较弱。选型时必须把“多跳深度”当成重要指标来压测。
索引方面,工程化的图数据库会同时维护 SPO、POS、OSP 等不同排列顺序的索引——相当于给卡片做三套目录:按主语查、按谓语查、按宾语查都能瞬间定位。现代混合引擎还会把规则推理物化的新三元组直接写进存储,查询时无需现场推理;GNN 训练出的嵌入则作为辅助特征服务相似度计算。存储、查询、推理三层协同,才是好用的知识图谱引擎。
1. \(\deg(v_0)\)(起始节点度):查询入口节点的邻居数量,决定第一步要遍历多少个分支。
2. \(\text{hops}\)(跳数):需要沿边走的步数,等价于查询深度。
3. \(\times\)(乘积):每跳都要遍历该层所有可达边,所以总代价近似为度与跳数的乘积。
4. \(O(\cdot)\)(复杂度上界):大 O 描述最坏情况;若物理存储支持邻居指针直读,这个复杂度会非常低,反之则退化成多表连接。
选型就是给社区挑“软木板材质”:几百张卡片随便挂,几百万张就要上金属网格。存储、查询、推理三者搭得好,知识图谱才能真正从 Demo 变成能扛业务的产品。张主任的软木板故事,到这里就升级成了整套系统工程。
AI 应用场景
企业知识问答机器人
阶段:知识构建与查询检索
解决的问题:传统 FAQ 只能匹配预设问题,面对“谁住在幸福小区?”这种可变问法无能为力,更处理不了“张三熟悉哪些小区”这类多跳问题。用知识图谱把业务文档抽成三元组,再用 SPARQL 把自然语言转成查询模板,就能精确回答推理类问题。
具体案例:某电商企业把商品、品牌、供应商、资质全都建模成 RDF 三元组,客服机器人接到“某品牌手机供应商在哪里”时,自动生成 SPARQL 查询在图中做两次跳转,返回精确答案并附上证据链。
金融反欺诈:规则推理发现团伙
阶段:规则推理与风险分析
解决的问题:欺诈分子会刻意绕开单点规则,但资金往来、设备、IP、手机号构成了一个天然关系网。单靠 SQL 做多表 join 查询既慢又难写,规则推理却能沿着“转账、同设备、同 IP”等关系做传递推断,自动圈出可疑团伙。
具体案例:某支付风控系统将账户、设备、IP 建模为属性图,用 Cypher 查询三度以内的关联路径,再用“若 A 设备登录过 B、B 向 C 转账,则 A 与 C 存在风险关联”等规则推理,把可疑团伙召回率提升了 40%。
商品推荐:GNN 链接预测
阶段:图神经网络推理与召回
解决的问题:传统协同过滤只利用用户—物品矩阵,忽略了“用户关注品牌”“物品属于类目”等图谱关系。GNN 可以在用户—物品—品牌—类目的异构图上做消息传递,学习节点表示后再做链接预测,大幅提升冷启动推荐效果。
具体案例:某短视频平台把用户、视频、话题构成属性图,用两层 GraphSAGE 学习节点向量,Predict 用户对未观看视频的点击概率,召回阶段命中率比纯协同过滤高了 18%。
Python 演示
# -*- coding: utf-8 -*-"""迷你知识图谱:三元组存储 + 模式查询 + 规则推理""" from collections import defaultdict class MiniGraph: """用三元组列表加倒排索引实现的简单知识图谱""" def __init__(self): self._spo = [] # 三元组事实列表 self._pos = defaultdict(list) # (谓词, 宾语) -> 主语列表 def add(self, s, p, o): """加入一条三元组 (s, p, o)""" self._spo.append((s, p, o)) self._pos[(p, o)].append(s) def query(self, s=None, p=None, o=None): """按任意位置过滤三元组,类似 SPARQL 基本图模式""" if p is not None and o is not None: return [(x, p, o) for x in self._pos[(p, o)]] return [t for t in self._spo if (s is None or t[0] == s) and (p is None or t[1] == p) and (o is None or t[2] == o)] def infer_rule(self, p1, p2, p3): """规则:(a, p1, b) 且 (b, p2, c) => (a, p3, c)""" added = [] for a, p_a, b in self._spo: if p_a != p1: continue for b2, p_b, c in self._spo: if p_b == p2 and b2 == b: if (a, p3, c) not in self._spo \ and (a, p3, c) not in added: added.append((a, p3, c)) self._spo.extend(added) return added def main(): g = MiniGraph() g.add('张三', '认识', '李四') g.add('李四', '住在', '幸福小区') g.add('幸福小区', '位于', '朝阳街道') g.add('王五', '住在', '幸福小区') print('=== 三元组存储 ===') for t in g._spo: print(f' ({t[0]}) -[{t[1]}]-> ({t[2]})') print('\n=== 查询: 谁住在幸福小区? ===') for s, p, o in g.query(p='住在', o='幸福小区'): print(f' 答案: {s}') print('\n=== 规则推理: 认识 + 住在 -> 熟悉 ===') added = g.infer_rule('认识', '住在', '熟悉') for t in added: print(f' 新增: ({t[0]}) -[{t[1]}]-> ({t[2]})') print('\n=== 再次查询: 谁熟悉幸福小区? ===') for s, p, o in g.query(p='熟悉', o='幸福小区'): print(f' 答案: {s}') if __name__ == '__main__': main()
self._pos[(p, o)].append(s)维护“谓词+宾语 → 主语”的倒排索引,让“谁住在幸福小区”这类查询不用全表扫描。g.query(p='住在', o='幸福小区')把固定谓词和宾语变成查询模板,相当于执行一条 SPARQL 基本图模式。for a, p_a, b in self._spo:扫描所有已知三元组,找出能作为规则左件前件的候选。if (a, p3, c) not in self._spo and (a, p3, c) not in added:去重检查,防止重复推导导致无限循环。g.infer_rule('认识', '住在', '熟悉')用一条人类可读的规则完成知识补全,这就是规则推理引擎的最小实现。
常见误区
误区三元组不就是一张三列的关系表吗?用 SQL 也能存,为什么要专门用图数据库?
正解三元组表在多跳查询时性能会指数级恶化。比如查“张三认识的人住在哪儿”,SQL 要做多次自连接,每多一跳就多一次全表 Join;原生图存储通过邻里指针直接顺着边跳,复杂度只和边的数量成正比。就像软木板上顺着毛线走一步就到了,而 Excel 表格要一列一列翻。
为何常见:关系型数据库统治世界太久,大家本能地把一切数据都想象成行列结构。
误区两者都长得像 SQL,换一层皮而已,会一个就会另一个。
正解深水区完全不同。SPARQL 面向 RDF,核心是“三元组模板集合匹配”,变量填的是整个图里的任意资源;Cypher 面向属性图,核心是“沿路径从某节点出发遍历”,天然支持可变长度路径。它们的图模型、遍历方式、索引依赖都不一样。好比一个是“拿着模板比对卡片”,一个是“顺着毛线走迷宫”。
为何常见:两者表面都是"SELECT……WHERE……"风格,掩盖了底层模型差异。
误区规则引擎嘛,把领域经验都写成规则,推理能力一定最强。
正解规则之间会相互冲突、循环触发,规则数量上去后维护成本爆炸,而且规则推理只能推导出显式写过的模式,遇到没见过的关系就哑火。真正工业级做法是“少量精确规则 + GNN 统计补全”的混合策略,规则保证可靠,模型负责泛化。
为何常见:规则系统直观可控,给人“多多益善”的错觉,忽略了规则冲突和覆盖率的边界。
误区图神经网络连未知模式都能学出来,规则推理该淘汰了。
正解GNN 需要大量标注数据训练、结果不可解释,在金融风控、医疗等需要审计的场景根本不敢直接用;规则推理零样本、可解释、可审计,二者是互补关系而不是替代关系。就像张主任既要有经验法则,也要有 AI 学徒的直觉,缺一个都不完整。
为何常见:深度学习“万能论”的惯性思维,忽略了可解释性在真实产业里的刚需。
面试题
Q1. 知识图谱三元组 (s, p, o) 中,p 代表什么?
- A.主语实体
- B.谓语关系← 正确答案
- C.宾语实体
- D.属性数值
答案:B。三元组中 s 是主语(起点实体),p 是谓语(关系类型),o 是宾语(终点实体或字面量)。对应软木板卡片上“谁—关系—谁”的中间格。
Q2. 下列哪种查询语言是 W3C 为 RDF 制定的标准?
- A.Cypher
- B.SPARQL← 正确答案
- C.Gremlin
- D.SQL 查询
答案:B。SPARQL 是 W3C 针对 RDF 数据发布的标准查询语言,核心是三元组模式匹配。Cypher 是 Neo4j 等属性图数据库的语言,Gremlin 是图遍历语言,SQL 用于关系型数据库。
Q3. 属性图中“节点标签”(Label)的主要作用是什么?
- A.唯一标识节点
- B.映射节点属性
- C.指示实体类型← 正确答案
- D.加速边遍历
答案:C。节点标签用来指示实体的类型(如 Person、Place),相当于给卡片分类。唯一标识由节点 ID 承担,属性映射由键值对完成,边遍历主要靠索引结构。标签是类型语义,不是唯一 ID。
Q4. 关于 RDF 与属性图的区别,以下说法正确的有?
- A.RDF 使用 URI 标识资源← 正确答案
- B.属性图节点携带键值属性← 正确答案
- C.RDF 谓词可直接携带属性
- D.属性图擅长多跳路径分析← 正确答案
答案:ABD。RDF 用 URI 做全局标识,A 对;属性图在节点上直接存键值属性,B 对;RDF 的边是纯 URI 谓词,无法直接挂属性(要加属性通常得引入中间节点),C 错;属性图因邻接存储结构而擅长多跳路径遍历,D 对。
Q5. SPARQL 基本图模式(BGP)的核心机制是什么?
- A.回溯式深度遍历
- B.变量三元组模板匹配← 正确答案
- C.哈希连接并集结果
- D.图嵌入最近邻查找
答案:B。BGP 的核心是“带变量的三元组模板”去匹配数据图中的三元组,凡是能令变量成立的三元组都会被选中。A、C 是执行层优化手段,D 是 GNN 场景的做法,都不是 BGP 的定义。
Q6. 规则推理中“前向链”(Forward Chaining)指的是?
- A.从查询目标反推前提
- B.重复扩展现有事实← 正确答案
- C.对规则做冲突消解
- D.用模型预测缺失边
答案:B。前向链从已有事实出发,循环应用规则把结论加入图谱,直到饱和。A 描述的是反向链(Backward Chaining),C 是规则引擎的优化步骤,D 是 GNN 链接预测。
Q7. 以下哪些是图神经网络在知识图谱上的典型应用?
- A.预测缺失的关系边← 正确答案
- B.学习节点低维向量← 正确答案
- C.输出可解释规则链
- D.捕捉结构做节点分类← 正确答案
答案:ABD。GNN 通过消息传递把节点表示为低维向量(B),既可用于链接预测补全关系(A),也可用于节点分类(D)。但 GNN 是黑盒模型,并不直接输出可解释的规则链(C),那是规则推理的强项。
Q8. 原生图存储相比关系型上的图存储,最大优势是什么?
- A.无需任何索引即可查询
- B.邻居数据物理聚簇存储← 正确答案
- C.自动完成本体对齐
- D.天然支持标准 SQL 语法
答案:B。原生图存储把节点和边以邻接连指针方式存放,遍历邻居时访问的是相邻物理地址,避免多表 JOIN。它仍需索引支持任意属性查询,A 错;本体对齐不是存储层功能,C 错;原生图库通常不主打 SQL,D 错。
Q9. Cypher 模式 (a:Person)-[:KNOWS]->(b) 中 :Person 的作用是什么?
- A.节点唯一标识符
- B.节点的类型标签← 正确答案
- C.节点的属性集合
- D.边的方向约束
答案:B。:Person 是节点标签,表示 a 必须是 Person 类型的节点,起过滤作用。唯一标识符是节点 ID 属性,属性集合写在 {...} 里,边方向由 -> 表达,三者都不是 :Person 的语义。
Q10. 设计知识图谱存储引擎时,需要重点考虑哪些因素?
- A.底层图存储是否原生← 正确答案
- B.事务与 ACID 支持← 正确答案
- C.查询与推理是否协同← 正确答案
- D.必须部署微服务架构
答案:ABC。原生与否决定多跳性能,事务保障写入一致性,查询与推理协同才能让离线推理物化结果直接服务线上查询。微服务只是一种部署模式,不是知识图谱引擎的必要条件,D 错。