neo4j基础
曾经使用neo4j实现了一个娱乐圈明星关系网络,那次在安装的时候耗费了我一上午的时间,距离上次使用之后我已经一年没使用过了,忘得差不多了,现在有需要要重新使用neo4j。再次使用docker安装使用想要记录一下。
简介
neo4j简介
neo4j是一种图数据库,与常见的关系型数据库不同,图数据库不以表结构存储数据。图数据库本身属于NoSql数据库中的一种,是基于数学中图论实现的一种数据库。图数据库将数据和数据之间的关系存在节点和边中,在图数据库中这被称作节点和关系。没有了库表字段的概念,相当于是把数据存在了一张大宽表中。
Neo4j是图数据库中一个主要代表,其开源,且用Java实现。经过几年的发展,已经可以用于生产环境。其有两种运行方式,一种是服务的方式,对外提供REST接口;另外一种是嵌入式模式,数据以文件的形式存放在本地,可以直接对本地文件进行操作。
举一个简单但不是很恰当的案例,图数据库将数据按图数据结构进行存储数据,按数据节点与关系进行存储,保存节点和关系的数据以及其属性信息。
docker简介
docker的英文意思是 码头工人,意思就是搬运东西的意思,其实这和docker的特点是一样的,docker提供的就是一种容器化搬运东西(我们的软件、程序)的过程。docker自己本来是运行在操作系统上一个程序软件,它会提供一个容器环境,使我们的程序独立地运行在容器中。
举一个简单但不是很恰当的案例,如果需要拷贝自己电脑上的环境给别人,最好的办法是把环境搞成虚拟机,直接把虚拟机给别人,但是这样太过于庞大。docker创建了一个容器,可以达到仅仅拷贝环境就行的程度,并且这个容器可以被迁移到其他有docker的机器上正常运行。
安装
由于自己是基于docker进行安装的,所以安装十分简单,访问docker官网,按照教程输入:
1  | # 安装  | 
安装启动好之后,需要访问对应端口设置账号密码,初始帐号密码为:neo4j/neo4j
个人推荐通过portainer管理docker
基础语法(增删改查)
neo4j的语法非常简单,语法本身就像画图一样,这里只列举简单操作。
增
作为图数据库,一定存在两种对象,一是节点,二是关系。当需要创建节点时候需要明确节点信息,假设我们需要创建一个Cat类别,并且具有以下属性的节点:
1  | {  | 
改写成数据库语句如下:
1  | create (n:Cat {name:"tom",color:"blue",age:"1940-?",height:92,sex:"man",hobby:"Catch mice"}) return n;  | 
其中Cat是属性,n是对当前节点起的别名,其他字母也行,注意return的时候一致。
对于关系,一样的有这样的信息,因此sql语句也类似。但是关系不是凭空出现的,一定是两个节点存在才能够创建关系,因此要么创建关系的时候也创建节点,要么就需要优先找到关系,如下:
1  | MATCH (a:Cat), (b:Mouse) WHERE a.name = "tom" AND b.name = "jerry"  | 
如果没有节点就想要关系,就需要创建节点的时候一并创建关系,简写如下:
1  | CREATE (fb1:FaceBookProfile1)-[like:LIKES]->(fb2:FaceBookProfile2)  | 
注意:关系的创建只能够单向创建,不能够创建双向关系。
就这么简单,像画图一样
删
对于删除,涉及到删除节点、删除关系、删除属性,其中删除节点与删除关系类似。但是删除了节点之后,节点附带的所有关系也会被一并删除,因此删除节点需要十分小心。
删除节点或者关系:
1  | MATCH(node:Cat{name:"Tom"})  | 
这种删除模式本质上都是先找定位到这个节点或者关系,然后删除掉。
当涉及到删除其属性信息的时候语法需要做一点点改变:
1  | MATCH(node:Cat)  | 
最后说一种,由于自己是实验,因此常常用到全部删除:
1  | match (n) detach delete n  | 
改
修改一般来说就是修改属性信息,关系的指向不能够被修改,只能删除重建。修改属性如下:
1  | MATCH(node:Cat)  | 
新增亦如此
查
查询其实在上面已经被提及过了即MATCH,如下:
1  | MATCH(node:Cat) return node  | 
以上仅为简单使用操作
python操作
python当中很早便为neo4j提供了便利的操作API:
1  | from py2neo import Graph  | 
python 当中既包含操作的函数同时也提供直接的sql语句操作:
1  | A = Node("概念", name="向量", chapter = 1 , ID = 100)  | 
或
1  | graph_.run('MATCH (n) detach delete n')  | 
篇幅所限就不展开详述讲解了


/封面.png)







