Lesson 06 · 查询与推理

查询与推理(SPARQL)

你用"模式"去匹配一张图;并且,"没查到"不等于"为假"

本体的价值一半在"怎么用"——也就是查询。查询语言叫 SPARQL(SPARQL 协议与资源描述框架查询语言),你可以把它想成"SQL,但查的是一张由三元组连成的图、而且能带上推理"。这一课用 0005 的供应链本体来查。

先说明:你要带走的是"概念",不是语法。查具体的 SELECT/WHERE/OPTIONAL 语法,完全可以交给 agent 代写。但你真正要记住的是三个语义洞察——①查询是"用三元组模式匹配图";②开放世界里"查不到 ≠ 为假";③推理能补全后再查。这是判断"查询对不对、结果可不可信"的功底,也是你设计本体、让 agent 写对查询的基础。

01一句话:用"三元组模式"匹配图

SQL 是"查表 → 匹配行"。SPARQL 是"给一个三元组模式 → 在整张图里找匹配"。模式里用 ? 开头的就是变量(待填充)。

SELECT ?order ?sku WHERE { ?order :requiresProduct ?sku . }

这句话的意思:"找出所有 ?order,它通过 :requiresProduct 连到某个 ?sku。" —— 就一个三元组模式。

和 SQL 的区别一句话:SQL 里你选择列;SPARQL 里你描述"关系的样子",变量像占位符,匹配上就返回。你不是先有表,而是先有"图"。

02连接 = 多个模式共享变量

想跨过多个三元组?"共享同一个变量"就把它们串起来了,就像 SQL 的 JOIN。下面找出"每个订单所需的物料、以及该物料的提前期":

SELECT ?order ?sku ?lt WHERE { ?order :requiresProduct ?sku . ?sku :hasLeadTime ?lt . }

两个三元组都用了 ?sku —— 于是把"订单→物料"和"物料→提前期"这两段接起来了。

再加个条件,用 FILTER:

SELECT ?sku ?lt WHERE { ?sku :hasLeadTime ?lt . FILTER (?lt > 14) }

"提前期大于 14 天的物料"。

03关键:开放世界下,"查不到" ≠ "为假"

这是你最容易踩的一处,也最要紧。本体是开放世界——某物料没写提前期,不代表"提前期是 0"或"不存在",而是尚未被人断言(未知)。

同一句"某 SKU 没写提前期"关系数据库(闭世界)本体(开放世界)
含义没有 / 视为零缺失只是未断言,可能未知
查询结果查不到=当作没有查不到=还不确定

所以,若你在意"就算没提前期也想列出这个订单",用 OPTIONAL——它让那段可缺省,缺了也不丢结果:

SELECT ?order ?sku ?lt WHERE { ?order :requiresProduct ?sku . OPTIONAL { ?sku :hasLeadTime ?lt . } }

订单仍然都返回;有提前期的 ?lt 有值,没有的就是空白(未知)。—— 这正是开放世界的表达。

和 SQL 的天壤之别

SQL 的 LEFT JOIN 里,"右边没行"常被当成"没有";而本体的 OPTIONAL 里,?lt 为空是"尚未声明"——它可能被推理器补出来。所以本体的查询天然更"宽容未知"。

04让推理也参与查询

前几课的推理器能补三元组(如"7 号线是资源")。选对推理级别后,查询也能看到这些被推出来的三元组——哪怕它们没被显式写入。

SELECT ?r WHERE { ?r rdf:type :Resource . } # 开启推理后,连"只写了 hasCapacity、没写 rdf:type"的资源也能被查出

这就是"推理增强查询":先把隐式的补全,再匹配。这是本体比纯图查询更强的点。

05检查你的理解

SPARQL 查询的本质是什么?

开放世界下,某 SKU "没写提前期",查询到它时意味着什么?

想查到推理器推出的(未被显式写的)三元组,关键在?

本课主来源 · 温和上手 《Learning SPARQL》—— Bob DuCharme oreilly.com / learningsparql.com 这本书从"马上写简单查询"带你入门,是最不吓人的 SPARQL 读物。想动手可配合 三元组速查。

权威语法见 资源描述框架(RDF)1.1 入门 及 SPARQL 1.1 查询规范。


[1] DuCharme, B. Learning SPARQL(第 2 版) —— 最温和的 SPARQL 入门。

[2] 万维网联盟(World Wide Web Consortium, W3C),SPARQL 1.1 查询语言 —— 权威语法。

有疑问?问 agent

这一课记一句:SPARQL 是用三元组模式匹配图,而且本体的"查不到"是未知、不是"没有"。想针对你 0005 建的本体试一条具体查询,把问题发我,我帮你写成 SPARQL。