下面选取几种典型 的关系型数据库存储知识图谱的方法做简单 介绍。
只通过一张表来维护知识图谱数据,表包含 三列,分别对应三元组的主语、谓语和宾语, 所有的三元组数据都存储在一张表中。这种 存储方法通用性较好,但由于所有数据都存 储于一张表中,查询时会有大量的自连接操 作,所以查询的性能较差。
水平存储依然是将所有三元组都存储于一张 表中,三元组中的主语实体存储为数据库中 的一行,数据库中的列为该实体的所有属性, 如表 1 所示。该存储方式设计简单,查询单 个实体时可快速展示出其所有属性值。但缺 点也同样明显,主要体现在表格的列数较多, 关系复杂时可能会超出数据库的上限。
同时 由于所有属性水平铺开,单个实体不可能在 所有属性上都有值,所以必定会存在大量空 值,空值不仅增加了存储的压力,同时也影 响查询的效率。最关键的是,一旦一个实体 的一种属性拥有多个属性值,该存储方式将 大大受限,如示例中糖尿病的临床表现实际 上有多个,如多食、多饮、多尿和消瘦等, 水平存储并不适合该类多值数据存储 [56] c) 属性表存储 属性表可以简单的理解为将水平存储中的一 张表按照实体的类型分成多张表,保证同类 实体的属性大致相同。属性表的 存储方式可以解决水平存储中列数过多的问 题,但空值问题可以一定程度上减轻但仍无 法完全避免,单属性的多值问题也仍然无法 解决。由于分为多个表进行存储,所以在一 些查询时需要对多个表进行关联,比较影响 性能。

垂直划分的存储方法是依据属性将水平存储 的表划分成不同的表,即保证每张表中三元 组的属性都相同,每张表只包含两列,分别 对应三元组的主语和宾语。垂直划分的存储 方法有效解决了水平存储和属性表存储中的 空值和单属性的多值问题,但由于表数量的 增加大大增加了查询时表间连接的数量,影响查询性能。同时对于一些特殊查询场景, 如已知三元组的主语和宾语查询谓语时,垂 直划分的存储方式无法有效支持 [57]