沈云,资深工程师,微软解决方案专家
图形数据库是什么呢?如果从字面理解是进行图形处理的数据库,那么你就错了。
我们先来解释什么是图形数据库。
图形数据库是 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 表和 edge 表表示图标有所不同:
如图可以看到: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
立即访问http://market.azure.cn