上期已经安装了图数据库,本期就该讨论到底这个图数据库里面的一些基本的概念和如何操作。最近听到一句话,年轻不年轻,不是看年龄,而是看你对新鲜事物的热情,即使你20岁,谈起新事物也是一脸的不屑,只能说明身体和灵魂分了家。闲话不谈 回归正题。
节点和节点之间可以存在多种关系,单向,双向
上图是一个人际关系图,其中的每个人的关系是凌乱的,一个人对另外的几个人之间的角色也是不同的,这里NEO4J 通过 lable 来定位一个节点(方块位置)在整体中的扮演的角色,例如这张图中“某公司的客户”,就是定义这群人在这个图中的角色,都是某公司的客户。用这样的概念可以将这些人,进行一个一致性的分类。
理解NEO4J 中的关键的几个属性:
1 节点:下图中每个方块可以看做一个节点
2 属性:每个节点有多个属性,以 KEY VALUE 的形式来进行描述
3 关系: 节点和节点之间的关系,也是通过key value的方式来存储,同时节点和节点的关系不唯一,可以双向
4 标签:标签就是这组节点的共性,例如都是某公司的职员,或者摇身一变都是一个城市的市民 ,标签是标记每个节点之间的相同点
个人浅薄的理解
1 节点,可以理解为传统数据的行的概念
2 关系:就是表和表之间 join 的概念 (这也是比传统数据库高明的地方,其实还是空间换了时间),关系本身也是带有方向和属性的,这也是传统数据库本身做不到的地方
3 属性:理解为一个MONGODB 里面的document,一个节点会有多种属性
4 标签:理解为mongodb里面的collection 或者 传统数据库中的表,但一个节点可以属于多个表,这个又超越了传统数据库的理解的理念。
图数据库是什么个人总结一下,一个通过key value来存储数据,并且在在查询前就建立了JOIN关系的,数据字段属于多个表的 “weirdo” 出现了。
实际上在安装完neo4j 本身他就拥有自己的exmaple 的指导
在输入 :play movie graph 后,你可以看到上图从如何创建,一个实例的图,找寻数据,查询数据等等这些操作
点击箭头,可以将要执行的sample movie 库,在执行框中执行,执行后结果如下。
下面贴部分代码,并辅以解释,加速学习进度
1 建立节点和属性
CREATE (TheMatrix:Movie {title:'The Matrix', released:1999, tagline:'Welcome to the Real World'})
CREATE (Keanu:Person {name:'Keanu Reeves', born:1964})
CREATE (Carrie:Person {name:'Carrie-Anne Moss', born:1967})
上面两句话创建了三个节点,
1 TheMatrix
2 Keanu
3 Carrie
这三个节点具有两个lable 也就是这三个节点目前属于两个表
1 Movie
2 Person
而这三个节点, {} 中的信息是代表这个节点的属性,也就是这个节点的内部信息,相当于字段以key value 形式表达,或直接理解为 mongodb的部分知识
所以建立节点需要几个信息,1 节点本身,2 节点属于哪个lable 3 节点本身的属性信息, 下面就开始创建相关的关系,也就是节点和节点之间爱你的关系
CREATE
(Keanu)-[:ACTED_IN {roles:['Neo']}]->(TheMatrix),
(Carrie)-[:ACTED_IN {roles:['Trinity']}]->(TheMatrix),
(Laurence)-[:ACTED_IN {roles:['Morpheus']}]->(TheMatrix),
(Hugo)-[:ACTED_IN {roles:['Agent Smith']}]->(TheMatrix),
(LillyW)-[:DIRECTED]->(TheMatrix),
(LanaW)-[:DIRECTED]->(TheMatrix),
(JoelS)-[:PRODUCED]->(TheMatrix)
首先上面这句话的意思是(翻译成人类能看懂的文字)
1 keanu 作为一个演员在TheMatrix电影里面扮演了 Neo这个角色,同时
Carrie在TheMatrix 这个电影里面扮演了Trinity 这个角色,Laurence 在TheMatrix 电影里面扮演Morpheus角色,Hugo在TheMatrix 扮演Agent Smith 角色,LillyW LanaW Joels 导演了TheMatrix 这部电影。
通过这一个语句,将六个人与这部电影的关系描述清楚。
在能读懂一些简单的创建节点和关系的语句后,我们来一边创建创建节点,一边查询节点,加快理解的速度
CREATE (TomH:Person {name:'Tom Hanks', born:1956})
创建一个节点 TomH ,然后查询这个节点通过节点的属性
如果不理解,这里通过传统的数据库来翻译一下
select tom from Person where name = 'Tom Hanks';
CREATE (CloudAtlas:Movie {title:'Cloud Atlas', released:2012, tagline:'Everything is connected'})
创建一个MOVIE的节点,叫CloudAtlas ,并且相关的电影的title, released, tagline 等字段的内容
查询 tilte 等于 Cloud Atlas 返回节点本身
select CloudAtlas from Movie WHERE title = 'Cloud Atlas'
下面这张图的意思是 查找tom hanks 到底演过几部电影
当然写到这里我也是纳闷了两天 tom 和 tomHanksMovies 我根本就没有在任何地方输入过这些信息到NEO4J中,到底他们是怎么展示的这些信息,在经过琢磨后,照猫画虎的写出了下面查询Keanu 到底演过什么电影的查询语句。同样 K,Kmovies 我都没有输入过,到底是怎么回事???
See you next time