AbutionGraph新特性-支持动态增删改的scheam free知识结构
AbutionGraph是图特摩斯科技自主研发的时序动态、多维异构网络数据存储和分析的GraphOLAM认知图数据仓库系统,孵化自中国科学院计算机网络信息中心,面向实时的关联数据查询与分析、IoT实时数据计算与监控,同时兼具图数据库+时序数据库+HOLAP数据仓库的综合能力。
本文将简要介绍AbutionGraph在分布式图数据库中的创新功能-schema-free,一种动态更改图/表数据结构的能力,即动态的无性能开销的给历史数据增加和删除属性,并将新结构应用到新导入的数据上。
属性知识图谱概述
知识图谱由实体和关系组成,实体和关系包含着业务的真实数据,即属性信息。
属性图 本体构建/schema信息(元数据) 示例:
本体“人”示例数据(原始数据):
如上图所示,“人”包含了姓名、生日、地区属性来表示真实的数据,这就是属性知识图谱。知识图谱的构建就是通过将原始数据映射到知识结构中,形成网状关系的表示形式,数据还是那些数据,只是抽象为了图形表达,俗称“数据图谱”。
动态schema图例
动态schema,即数据结构的可更改性-增加和删除,具有free特性。一般来说,动态schema是指非固定表结构,schema字段 (有时也指索引)的增删对于正常的读写没有任何影响,无需额外空间消耗,无需在线修改,透明的使用,几乎无downtime,这也是我们在分布式图数据库领域的一个创新功能。
强schema与schema-free
在数据图谱中,属性信息基本不会变化,我们存储在节点的属性字段里,作为一种不能更改的存储结构。但在很多真实场景中,属性信息可能需要动态改变,比如新增一个属性“年龄”来丰富人物画像信息,这就需要schema具有free特性。在常见的图数据库产品中,只有Neo4j是具有free特性的,因为它根本不使用schema,数据导入前无需制定数据结构,导入数据的字段不对齐也不影响读写,只要开发人员能记住区分就行。而其他图数据库JanusGraph、Nebula等属于强schema结构,即在数据导入图谱前,必须构建好schema数据结构(与传统关系型数据库定义表结构一样),在schema结构建立后不能增删改,并且导入的数据必须与schema中定义的属性一致(不能缺少属性,也不能多了属性,数据类型也必须一致)。
Neo4j的schema free
前面已说过neo4j 不使用schema,所以从理论上来说 neo4j 可以存储任何形式的数据。但由于neo4j 是通过键值对(Key-Value) 的双向列表来保存节点和关系的属性值,所以neo4j仅适用于存储实体关系和实体简单的属性。在实际应用中一个实体通常会包含众多的属性,如果将这些属性全部存储到 neo4j 中,neo4j 的查询将变得异常的慢,而在实际的应用场景下,经常会遇到高并发的情况,这时候单节点的 neo4j 就会显得力不从心。看一组在8h8g服务器下的测试报告:
通过上面的测试可以看出,当节点(Node)的数量超过1000万时,平均查询延时已经超过了6秒,说明此时 neo4j 已经明显“吃不消”了,显然这样的延时在实际的项目应用中是完全不可接受的。但是我们发现设置索引之后查询时间明显降下来了,那么是不是设置的索引越多越好呢?我们看下在1000万节点的情况下有索引和无索引插入延时测试:
由上图测试结果可以看出: 在千万级数据的情况下有索引插入比无索引插入要慢30%, 所以索引并不是越多越好,也就是说,在属性较多的情况下,Neo4j这种使用双向列表保存节点和关系属性值的方式是不优化的。随着属性数量和数据量的增加,在查询性能、写入性能方面成指数级下降;在空间占用方面,如果构建索引,那就意味着在内存或磁盘多保存了一份映射数据,先走索引表的查询必然会随着索引的增加而拖慢查询获得结果的速度。
AbutionGraph的schema free
在Neo4J和其他图数据库产品上,出现了2个极端,前者放弃了schema,后者定死了schema,意味着必须要在性能和功能上二选一。我们在过往的项目案例中,特别是在点边数据量为百亿级的科研类数据中,经常遇到需要增删改实体属性的情况,如果按照Neo4j的实现思路,数据量在千万时就卡死了,如果按照Nebula、TigerGraph等图库的实现思路,则只能删库重新构图、预处理,在导入数据,代价极大。
在AbutionGraph中,我们设计了弱schema的free(schema-less)结构,“弱schema”是“无schema”和“强schema”的一个折中互融实现,可以在万亿点边的图谱中实现毫秒动态全量数据更新。当然,我们依然需要像强schema那样指定数据结构,这是知识建模的过程,但是数据结构具有了像无schema那样的增删改能力。弱schema的一些设计优点:
1. 指定数据结构是为了定义数据类型以便更好的压缩数据。Neo4j不压缩,Nebalu全局压缩,Abution采用的局部压缩算法,每种数据类型运用不同的优压缩算法,大化降低占用存储空间。
2. 动态schema,规范图谱结构,同时增加灵活性。强schema是一种硬性约束使图谱规范化,缺点是一旦定义则不可改动,而无schema对数据无约束容易产生混乱。动态schema可以在原有已定义的知识结构上增加和删除一个属性,并且已经录入的数据不用重新导入,也不用触发更新,是一种无性能损耗的能力。对于新增属性,Abution只对新录入的数据新增,历史数据则允许缺失该属性信息;对于删除属性,因为删除数据的成本很高,如果已有百亿历史数据,那么每条数据都更新一遍,可想而知的开销,所以Abution中采用隐藏的方式删除,只需要将schema中的属性去掉即可,查询时该属性会自动剔除,您还可以在任何时刻通过增加属性的方式来进行属性恢复,这些操作都是无任何性能开销的。
采用AbutionGraph的弱schema动态知识结构,可以更方便的定制化项目,满足上层应用的灵活需求,如果在业务中无此需求,则忽略此能力,在需要时随时更改你的schema即可适配你的数据。
来源 https://www.modb.pro/db/246073
相关文章