图形数据库是什么呢?如果从字面理解是进行图形处理的数据库,那么你就错了哈哈。
我们先来解释什么是图形数据库。
图形数据库是NoSQL数据库的一种类型,它应用图形理论存储实体之间的关系信息。最常见的例子,就是社会网络中人与人之间的关系。关系型数据库用于存储关系型数据的效果并不好,其查询复杂、缓慢、超出预期,而图形数据库的独特设计恰恰弥补了这个缺陷。
举个例子:
如图表示人、城市、餐馆三个实体,直接的关系有:人和人谁和谁是朋友的关系,人居住在某个城市的关系,城市和餐馆的关系,人和餐馆的关系。
按照传统做法,可以创建person,Restaurant ,City表,创建各种关系表。人与人,任何城市,任何餐馆,城市和餐馆的关系表。
假设我们要查询某人的朋友喜欢的餐馆。
假设我们要查询居住在同一城市的人喜欢的同一餐馆。
....................
是不是开始有点晕了。
是不是要感觉关联n多张表,还要自我关联。
为了解决这样的问题,业界发明了图形数据库。而SQL 2017 和Azure SQL现在全面支持图形数据库。 怎么来实现呢?
见下图:
新的数据表节点(node)表和edge(边缘表) ,节点表表示数据实体,比如人,城市,餐馆。
边缘表表示实体之间的关系。
第一张图所表示的关系,我们可以用下面代码创建节点表,注意关键词 NODE:
CREATE TABLE Person ( ID INTEGER PRIMARY KEY, name VARCHAR(100)) AS NODE; CREATE TABLE Restaurant ( ID INTEGER NOT NULL, name VARCHAR(100), city VARCHAR(100)) AS NODE; CREATE TABLE City ( ID INTEGER PRIMARY KEY, name VARCHAR(100), stateName VARCHAR(100)) AS NODE;`
创建边缘表:
CREATE TABLE likes (rating INTEGER) AS EDGE; CREATE TABLE friendOf AS EDGE;CREATE TABLE livesIn AS EDGE; CREATE TABLE locatedIn AS EDGE;
创建好后,可看到数据库表属性下,会有一个图形表出现,node表和edge表表示图标有所不同:
查询数据如下
select * from city select * from person select *from livesIn
如图可以看到:node表自动生成了node_id这列,edge自动生成了edge_id,from_id,to_id,后面都加上了唯一标识。这列的属性是nvarchar(1000),
事实上每张表系统会生成一个graph_id_,和其他的系统列,这些列都无法访问,由系统进行管理。见下图
边缘表表示了实体之间的关系,from to的关系,如果双向关系,就需要建立两条。下面进行查询是这样的 :
--查找john的朋友喜欢的餐馆 SELECT Restaurant.name FROM Person person1, Person person2, likes, friendOf, Restaurant WHERE MATCH(person1-(friendOf)->person2-(likes)->Restaurant) AND person1.name='John'; -- 查找在同一城市里面喜欢同一餐馆的人 SELECT Person.name FROM Person, likes, Restaurant, livesIn, City, locatedIn WHERE MATCH (Person-(likes)->Restaurant-(locatedIn)->City AND Person-(livesIn)->City); ---注意:使用关键字 Match进行查询。
通过上面的简单的语句可以实现在关系型模型下,需要非常复杂的关联才能得到的结果。并且SQL 2017的图形数据库与数据库引擎完全融合,也就是可以使用比如备份,SSIS ,POWERBI等各种功能。
在应用上可以分析如:社交关系、犯罪追踪、医疗领域等等。
更多信息请参考:https://docs.microsoft.com/zh-cn/sql/relational-databases/graphs/sql-graph-overview
.NET社区新闻,深度好文,欢迎访问公众号文章汇总 http://www.csharpkit.com