技术编程像图一样的数据模型


前面我们已经看到 , 多对多关系是不同数据模型之间的重要区别特征 。 如果您的应用程序主要具有一对多关系(树结构数据)或记录之间没有关系 , 则文档模型是合适的 。
但是 , 如果您的数据中多对多关系很常见怎么办?关系模型可以处理多对多关系的简单情况 , 但是随着数据中的连接变得越来越复杂 , 更常规的做法是开始将数据建模为图 。
图由两种对象组成:顶点vertices(也称为节点或实体)和边edges(也称为关系或弧) 。 可以将多种数据建模为图 。 典型示例包括:
社交图:顶点是人 , 边表示哪些人彼此认识 。
网络图:顶点是网页 , 边表示指向其他页面的HTML链接 。
公路或铁路网:顶点是交汇点 , 边表示它们之间的道路或铁路线 。
众所周知的算法可以在这些图上运行:例如 , 汽车导航系统搜索道路网络中两点之间的最短路径 , 而PageRank可以在网络图上使用以确定网页的受欢迎程度并由此在搜索结果中确定其排名 。
在刚才给的例子中 , 图中的所有顶点代表了相同类型的事物(分别是人 , 网页 , 或是道路交汇点) 。 但是 , 图并不仅限于此类同质数据:图相当强有力的用途是提供一种在单个数据存储中存储完全不同类型的对象的一致方法 。 例如 , Facebook维护了具有多个不同类型的顶点和边缘的单个图:顶点代表人员 , 位置 , 事件 , 签到和用户发表的评论;边表示哪些人是彼此的朋友 , 哪些签到发生在哪个位置 , 谁在哪个帖子上发表评论 , 谁参加了哪个活动 , 等等 。
接下来 , 我们会以下图为例展开讨论 。 它来自社交网络或是一个家谱数据库:它显示了两个人 , 分别是爱达荷州Idaho的Lucy和法国博恩Beaune的Alain 。 他们已婚并居住在伦敦 。
技术编程像图一样的数据模型
本文插图
有几种不同但相关的结构化和查询图中数据的方式 。 之后 , 我们将讨论属性图模型(由Neo4j , Titan和InfiniteGraph实现)和Tripe-Stores存储模型(由Datomic , AllegroGraph等实现) 。 我们将研究图的三种声明性查询语言:Cypher , SPARQL和Datalog 。 除了这些 , 还有命令式的图查询语言 , 例如Gremlin和图处理框架 , 例如Pregel 。 属性图Property Graph
在属性图中 , 每个顶点由下列组成:
一个独一无二的标识符
一组向外(指向其他顶点)的边
一组向内(指向自己的)的边
属性集合(键值对)
每条边由下列组成:
一个独一无二的标识符
边开始的顶点(尾部顶点tail vertex)
边结束的顶点(头部顶点head vertes)
一个描述两个顶点间关系的标签
属性集合(键值队)
你可以认为图是由两张关系型表组成:一个定点的表 , 一个是边的表 , 如下所示:
技术编程像图一样的数据模型
本文插图
基于PostgreSQL
头顶点和尾顶点存储于每一个边中;如果你想要一个顶点的一组入边和出边 , 你可以分别通过边表中的head_vertex或是tail_vertex查询 。
这个模型中的一些重要的注意事项是:
任何顶点都有一条边与其他顶点相连 。 对于关联没有任何的限制 。
给定任何顶点 , 您都可以有效地找到其传入和传出的顶点边 , 从而遍历图 - 即沿着一条通过一连串顶点的路径 - 向前和向后都行(这就是为什么在上图中建立索引) 。
通过使用不同关系的不同标签 , 你可以好几种不同类系的信息存储于单个图中 , 从而维护一个干净的数据模型
这些功能为图(如下图)提供了极大的数据建模灵活性 。
该图显示了一些难以用传统的关系模式表达的东西 , 例如不同国家的不同类型的区域结构(法国拥有departments和regions , 而美国则具有countries和states) , 诸如一个country内有另一个country的奇葩的历史问题 , 以及不同的数据粒度(Lucy的当前住所被指定为city , 而她的出生地仅在state一级被指定) 。


推荐阅读