知识图谱的存储方式
知识图谱通常使用三元组来表示知识,然而在关系型数据库中数据通常以表格形式进行存储,现在的关系型数据库并不适用与存储三元组这种数据结构。针对知识图谱中的三元组数据如何进行存储的问题,语义网与数据库的领域专家们给出了三种解决方式。
(1)仍使用关系型数据库进行存储
关系型数据库经过40多年漫长的考验,其理论与产品都已十分成熟,并且市面上绝大多数公司使用的是关系型数据库产品,比如市面上流行的Oracle、SQLServer、MySQL等。关系型数据库存储三元组的方式主要有五种,包括三元组表、水平表、属性表、垂直划分、六重索引。
三元组表顾名思义就是直接建立一个列数为3的表格存储三元组数据,这种方式虽然简单方便,但问题在于进行查询时会建立特别多的表连接操作,并且表格本身存储的数据量十分庞大,因此查询起来效率低下。
水平表方案也是只用一张表存储三元组数据,不同于三元组表的是它每一行的数据中存储的是一个实体与实体的所有属性与关系,因此在查询时无需进行额外的表连接操作。但这种方式会导致表格列数过多,并且表格中会存储大量空值,降低了关系型数据库的存储与查询性能。
属性表是对水平表的进一步优化,为每一类实体单独建一张表进行存储,这就避免了表格列数过多与存储大量空值的问题。但若知识图谱中实体类别有成千上万种,则就必须建立相同数量的表格,这种实现方式显然是不现实的。
垂直划分方式在2007年由美国麻省理工学院的Abadi等人提出,它使用三元组中的谓语作为表格划分的依据,每个表格仅有两列分别存储主语和宾语,每张表格代表了每个在知识图谱中的关系。这样就避免了实体种类过多带来的建表问题,但仍需要许多的谓语表来存储数据,为数据的查询与维护带来了一定的难度。
六重索引方式将三元组的六种全排列SPO、SOP、OSP、OPS、PSO、POS都存储到关系型数据库中,使用额外的空间占用换取查询上的效率优化。每种三元组的查询方式都可找到对应的索引表,从而避免了表格自连接操作,但也带来了存储空间大、维护一致性困难等问题。
(2)使用支持RDF的三元组数据库进行存储
RDF是W3C为关联数据制定的技术标准,在语义网中被广泛使用。三元组数据库可直接存储RDF数据,并能够配合RDF查询语言SPARQL[26]对数据库中的数据进行检索。开源的三元组数据库有Apache公司的Jena[27]、Eclipse公司的RDF4J等,商业的三元组数据库有GraphDB[28]、AllegroGraph、Virtuoso[29]等。
(3)使用图数据库进行存储
随着NoSQL概念的兴起,市面上涌现出一大批存储新型数据结构的数据库,比如存储Key-Value键值对的数据库Redis、专门存储列数据的Hbase[30]以及用于存储图形结构的数据库Neo4j[31]等。知识图谱从逻辑上看属于图这种数据结构,因此图数据库十分适合用于存储知识图谱的三元组数据。Neo4j作为市面上最流行且十分高效的图数据库,专门为图形结构中的节点、属性、边等优化了存储逻辑,使得Neo4j在存储图形数据时与关系型数据库相比有着天然的优势。使用图数据库存储三元组数据在进行数据查询时能够避免关系型数据库的表连接操作,使得其在查询效率上也大大提升。