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  查询实现完备的家谱内
   192   193   194   195   196   197   198   199   200   201   202