图形数据库之争:Neo4J与Infinite Graph
在图形理论当中,一幅简单的图形是由一系列节点与边线所构成。事实上图形类数据库往往会赋予节点与连线更多类别与属性,以使其更具可描述性及实际应用功能。至少用户希望图形类数据库能够支持快速遍历——这也是大家不会简单地使用像HBase或者Cassandra这样的表格类数据库存储所有边线的原因(联合运算往往会提高使用成本)。
图形类数据库属于NoSQL数据库四大类型之一,图形存储类产品中也以下列七种较为流行及常用: Neo4J, Infinite Graph, DEX, InfoGrid, HyperGraphDB, Trinity 以及AllegroGraph。本文以Java程序员的视角出发,与我们共同探讨上述产品的各类细节。
1. Neo4J (Neo Technology出品)
Neo4J可能是当下人气高的图形数据库。从名称我们就能看出Neo4J在设计上主要考虑到Java应用程序的实际需求,但它同时也支持Python。Neo4J属于开源项目,共有GPLv3社区版、版、企业版三种版本;后两者都以AGPLv3商业许可为基础。
Neo4J中的图形模型如图一所示。简单来说:
·节点与边线可以被赋予属性(键-值对);
·只有边线能够与类别相关联,例如“KNOWS”;
·边线可以指定为有指向或无指向。
由于节点名称的存在,如果大家想在图中找到对应节点,那么必须依靠索引。Neo4J使用以下索引机制:一个超级参考节点通过一条特殊类别的边线“REFERENCE”与所有节点相连。这实际上允许我们创建多个索引,借以通过不同的边线类别对其加以区分。索引结构如图二所示。
Neo4J还提供了一些特殊功能,例如列出特定节点的相邻诸节点或是两节点间长度短的诸类路径等。请注意,要使用上述各类“遍历”功能,Neo4J要求大家指定路径中经过的边线类别,其实这一点并不麻烦。
其实大家不必将Neo4J作为软件加以安装。我们完全可以简单地导入JAR文件来建立一套嵌入式图形数据库,该操作将在硬盘上建立对应的目录。具体信息在Neo4J的说明文档中已经相当完备,而且其免费版本也没有设置节点支持数量的上限。
缺点:
·尽管我们可以手动为节点类别通过“type”键添加注释,但相比之下为节点类别在API中提供本地支持无疑更好,因为这将使图形模型更具普遍意义。另外一旦某个节点具备多种不同类别,麻烦也将随之而来。
·由用户手动为新边线设置索引机制似乎有点奇怪并且很不方便。好是采用如今关系类数据库的普遍做法:用户只需表明要“为一组节点创建索引”,工作即可完成。
2. Infinite Graph (Objectivity Inc.出品)
InfiniteGraph 是一款由Objectivity公司推出的图形类数据库,该公司还推出过一款同名的对象类数据库。免费许可版本只能支持高100万节点及边线总数。InfiniteGraph需要作为服务项目加以安装,这与以MySQL为代表的传统数据库颇为相似。InfiniteGraph借鉴了Objectivity/DB中的面向对象概念,因此其中的每一个节点及边线都算作一个对象。尤其是:
·所有节点类都将扩展BaseVertex基本类;
·所有边线类都将扩展BaseEdge基本类。
在 http://wiki.infinitegraph.com/w/index.php?title=Tutorial:_Hello_Graph!中所显示的展示页面中,假设人是一个节点类、而会议算作为边线类。以下是将一条边线加入到两个节点之间的代码:
Person john = new Person("John", "Hello ");
helloGraphDB.addVertex(john);
Person dana = new Person("Dana", "Database!");
helloGraphDB.addVertex(dana);
Meeting meeting1 = new Meeting("NY", "Graph");
InfiniteGraph还提供了一套可视化工具用以查看数据。由上述代码所生成的边线将如图三所示呈现出可视化效果。相比Neo4J在图一中所展现的图形模型,InfiniteGraph能够支持同时具备多种不同类别/类的节点。请注意,Neo4J中的键-值对能够对应InfiniteGraph类中的成员变量。
缺点:
·作为服务项目进行安装本身没什么问题,但配置过程完全可以更简单些。
·由于节点与边线都能成为用户的定义对象,因此在灵活性得到保证的情况下,作者怀疑当其处理庞大的图形结构时,性能方面将受到严重影响。请大家记住,NoSQL数据库一直以来所赢得的广泛关注都建立在其始终傲人的性能表现上。
相关文章