Page 197 - 《软件学报》2025年第12期
P. 197
5578 软件学报 2025 年第 36 卷第 12 期
2.2.2 基于 Jena 框架的完备推理逻辑定义
正如第 2.1 节所述, 一般的家谱图谱在人物关系上只会定义 “父亲”“儿子”“女儿”“丈夫”和“妻子”这 5 种关系,
但这些关系对知识图谱逻辑推理而言并不具备完备性. 因此, 在按照第 2.2.1 节构建的符合 RDF 协议的家谱图谱
上, SPARQL 语句难以处理用户提出的复杂关系查询问题. 例如, 当用户询问“曾国藩的后代是谁?”时, 华谱通会抽
取关系三元组“?n : 后代 ?m.”, 然而, 由于家谱数据中并不包含“后代”关系, 导致华谱通无法推理出正确的答案. 此
外, 诸如“后代”和“祖先”这种需要递归处理的关系, 在 SPARQL 查询端是难以实现的, 这大大增加了华谱通中关系
完备性推理功能的开发难度.
为了应对上述挑战, 华谱通采用 Jena 框架完善 RDF 家谱数据中的关系缺失问题. Jena 框架以 Fuseki 服务器
管理 RDF 数据, 并支持开发者通过自定义推理规则来完善系统的推理逻辑. 相较于在 SPARQL 端开发复杂的查
询语句, Jena 端构建的推理规则在语义清晰度、逻辑完备性和系统扩展性上都有显著的优势. 因此, 根据家谱数据
中定义的 5 种关系, 华谱通在 Jena 框架上定义了 26 种关系的推理规则, 以支持完备的谱内亲属关系推理. 在系统
实际运行过程中, Jena 框架能够编译开发者在脚本中定义的推理规则 (规则格式如表 2 所示), 编译结果会映射到
家谱数据的 RDF 格式文件内, 并存储至计算机磁盘中, 用于后续的推理操作. 为便于读者直观地理解 Jena 推理规
则的部署过程, 本文提供了华谱通部署 Jena 规则框架的核心代码与操作, 详见 https://github.com/lazyloafer/Huaputong/
tree/main/Jena.
表 2 华谱通中定义的 26 种关系推理规则
关系 Jena推理规则 关系 Jena推理规则
(?a : 姐姐 ?b)→(?a : 姐妹 ?b)
父亲 (?a : 父亲 ?b)→(?a : 父亲 ?b) 姐妹
(?a : 妹妹 ?b)→(?a : 姐妹 ?b)
(?a : 兄弟 ?b)→(?a : 兄弟姐妹 ?b)
儿子 (?a : 儿子 ?b)→(?a : 儿子 ?b) 兄弟姐妹
(?a : 姐妹 ?b)→(?a : 兄弟姐妹 ?b)
女儿 (?a : 女儿 ?b)→(?a : 女儿 ?b) 姑姑 (?a : 父亲 ?b) (?b : 姐妹 ?c)→(?a : 姑姑 ?c)
丈夫 (?a : 丈夫 ?b)→(?a : 丈夫 ?b) 叔叔 (?a : 父亲 ?b) (?b : 弟弟 ?c)→(?a : 叔叔 ?c)
妻子 (?a : 妻子 ?b)→(?a : 妻子 ?b) 伯伯 (?a : 父亲 ?b) (?b : 哥哥 ?c)→(?a : 伯伯 ?c)
母亲 (?a : 父亲 ?b) (?b : 妻子 ?c)→(?a : 母亲 ?c) 侄子 (?a : 兄弟 ?b) (?b : 儿子 ?c)→(?a : 侄子 ?c)
(?a : 父亲 ?b)→(?a : 父母 ?b)
父母 侄女 (?a : 兄弟 ?b) (?b : 女儿 ?c)→(?a : 侄女 ?c)
(?a : 母亲 ?b)→(?a : 父母 ?b)
(?a : 儿子 ?b)→(?a : 子女 ?b)
子女 爷爷 (?a : 父亲 ?b) (?b : 父亲 ?c)→(?a : 爷爷 ?c)
(?a : 女儿 ?b)→(?a : 子女 ?b)
(?a : 父亲 ?b) (?c : 父亲 ?b) (?c : 性别 "男") (?a : 出生日期 ?n) (?c : 出生
哥哥 奶奶 (?a : 父亲 ?b) (?b : 母亲 ?c)→(?a : 爷爷 ?c)
日期 ?m) notEqual(?a, ?c) lessThan(?m, ?n)→(?a : 哥哥 ?c)
(?a : 父亲 ?b) (?c : 父亲 ?b) (?c : 性别 "男") (?a : 出生日期 ?n) (?c : 出生
弟弟 孙子 (?a : 儿子 ?b) (?b : 儿子 ?c)→(?a : 孙子 ?c)
日期 ?m) notEqual(?a, ?c) greaterThan(?m, ?n)→(?a : 弟弟 ?c)
(?a : 哥哥 ?b)→(?a : 兄弟 ?b)
兄弟 孙女 (?a : 儿子 ?b) (?b : 女儿 ?c)→(?a : 孙女 ?c)
(?a : 弟弟 ?b)→(?a : 兄弟 ?b)
(?a : 父亲 ?b) (?c : 父亲 ?b) (?c : 性别 "女") (?a : 出生日期 ?n) (?c : 出生 (?a : 父母 ?b)→(?a : 祖先 ?b)
姐姐 祖先
日期 ?m) notEqual(?a, ?c) lessThan(?m, ?n)→(?a : 姐姐 ?c) (?a : 祖先 ?b) (?b : 父母 ?c)→(?a : 祖先 ?c)
(?a : 父亲 ?b) (?c : 父亲 ?b) (?c : 性别 "女") (?a : 出生日期 ?n) (?c : 出生 (?a : 子女 ?b)→(?a : 后代 ?b)
妹妹 后代
日期 ?m) notEqual(?a, ?c) greaterThan(?m, ?n)→(?a : 妹妹 ?c) (?a : 后代 ?b) (?b : 子女 ?c)→(?a : 后代 ?c)
表 2 定义的 26 种关系可以分为递归 (如祖先和后代) 与 Ad-hoc (如父亲~孙女) 两类关系. 根据 Jena 自定义规
则的右赋值语法, 被定义的规则需要位于“→”符号的右侧, 其左侧为可推导出被定义规则的条件, 这些条件必须是
数据集中已包含的关系/属性或 Jena 中已定义的规则. 例如, “父亲”“儿子”“女儿”“丈夫”和“妻子”这 5 种关系的推
理规则可以直接映射为数据集中已包含的关系, 而其余的关系则需以这 5 种推理规则为基础, 结合人物自身的属
性构造相应推理规则. 根据表 2 中定义的 26 种关系推理规则, 华谱通可以借助 SPARQL 查询实现完备的家谱内

