Lesson 06 · 查询与推理
查询与推理(SPARQL)
你用"模式"去匹配一张图;并且,"没查到"不等于"为假"
本体的价值一半在"怎么用"——也就是查询。查询语言叫 SPARQL(SPARQL 协议与资源描述框架查询语言),你可以把它想成"SQL,但查的是一张由三元组连成的图、而且能带上推理"。这一课用 0005 的供应链本体来查。
SELECT/WHERE/OPTIONAL 语法,完全可以交给 agent 代写。但你真正要记住的是三个语义洞察——①查询是"用三元组模式匹配图";②开放世界里"查不到 ≠ 为假";③推理能补全后再查。这是判断"查询对不对、结果可不可信"的功底,也是你设计本体、让 agent 写对查询的基础。01一句话:用"三元组模式"匹配图
SQL 是"查表 → 匹配行"。SPARQL 是"给一个三元组模式 → 在整张图里找匹配"。模式里用 ? 开头的就是变量(待填充)。
这句话的意思:"找出所有 ?order,它通过 :requiresProduct 连到某个 ?sku。" —— 就一个三元组模式。
02连接 = 多个模式共享变量
想跨过多个三元组?"共享同一个变量"就把它们串起来了,就像 SQL 的 JOIN。下面找出"每个订单所需的物料、以及该物料的提前期":
两个三元组都用了 ?sku —— 于是把"订单→物料"和"物料→提前期"这两段接起来了。
再加个条件,用 FILTER:
"提前期大于 14 天的物料"。
03关键:开放世界下,"查不到" ≠ "为假"
这是你最容易踩的一处,也最要紧。本体是开放世界——某物料没写提前期,不代表"提前期是 0"或"不存在",而是尚未被人断言(未知)。
| 同一句"某 SKU 没写提前期" | 关系数据库(闭世界) | 本体(开放世界) |
|---|---|---|
| 含义 | 没有 / 视为零缺失 | 只是未断言,可能未知 |
| 查询结果 | 查不到=当作没有 | 查不到=还不确定 |
所以,若你在意"就算没提前期也想列出这个订单",用 OPTIONAL——它让那段可缺省,缺了也不丢结果:
订单仍然都返回;有提前期的 ?lt 有值,没有的就是空白(未知)。—— 这正是开放世界的表达。
SQL 的 LEFT JOIN 里,"右边没行"常被当成"没有";而本体的 OPTIONAL 里,?lt 为空是"尚未声明"——它可能被推理器补出来。所以本体的查询天然更"宽容未知"。
04让推理也参与查询
前几课的推理器能补三元组(如"7 号线是资源")。选对推理级别后,查询也能看到这些被推出来的三元组——哪怕它们没被显式写入。
这就是"推理增强查询":先把隐式的补全,再匹配。这是本体比纯图查询更强的点。
05检查你的理解
SPARQL 查询的本质是什么?
开放世界下,某 SKU "没写提前期",查询到它时意味着什么?
想查到推理器推出的(未被显式写的)三元组,关键在?
权威语法见 资源描述框架(RDF)1.1 入门 及 SPARQL 1.1 查询规范。
[1] DuCharme, B. Learning SPARQL(第 2 版) —— 最温和的 SPARQL 入门。
[2] 万维网联盟(World Wide Web Consortium, W3C),SPARQL 1.1 查询语言 —— 权威语法。
这一课记一句:SPARQL 是用三元组模式匹配图,而且本体的"查不到"是未知、不是"没有"。想针对你 0005 建的本体试一条具体查询,把问题发我,我帮你写成 SPARQL。