曾经使用neo4j实现了一个娱乐圈明星关系网络,那次在安装的时候耗费了我一上午的时间,距离上次使用之后我已经一年没使用过了,忘得差不多了,现在有需要要重新使用neo4j。再次使用docker安装使用想要记录一下。

简介

neo4j简介

neo4j是一种图数据库,与常见的关系型数据库不同,图数据库不以表结构存储数据。图数据库本身属于NoSql数据库中的一种,是基于数学中图论实现的一种数据库。图数据库将数据和数据之间的关系存在节点和边中,在图数据库中这被称作节点关系。没有了库表字段的概念,相当于是把数据存在了一张大宽表中。

Neo4j是图数据库中一个主要代表,其开源,且用Java实现。经过几年的发展,已经可以用于生产环境。其有两种运行方式,一种是服务的方式,对外提供REST接口;另外一种是嵌入式模式,数据以文件的形式存放在本地,可以直接对本地文件进行操作。

举一个简单但不是很恰当的案例,图数据库将数据按图数据结构进行存储数据,按数据节点与关系进行存储,保存节点和关系的数据以及其属性信息。


docker简介

docker的英文意思是 码头工人,意思就是搬运东西的意思,其实这和docker的特点是一样的,docker提供的就是一种容器化搬运东西(我们的软件、程序)的过程。docker自己本来是运行在操作系统上一个程序软件,它会提供一个容器环境,使我们的程序独立地运行在容器中。

举一个简单但不是很恰当的案例,如果需要拷贝自己电脑上的环境给别人,最好的办法是把环境搞成虚拟机,直接把虚拟机给别人,但是这样太过于庞大。docker创建了一个容器,可以达到仅仅拷贝环境就行的程度,并且这个容器可以被迁移到其他有docker的机器上正常运行。

安装

由于自己是基于docker进行安装的,所以安装十分简单,访问docker官网,按照教程输入:

1
2
3
4
# 安装
docker pull neo4j
# 启动
docker run --publish=7474:7474 --publish=7687:7687 --volume=$HOME/neo4j/data:/data neo4j

安装启动好之后,需要访问对应端口设置账号密码,初始帐号密码为:neo4j/neo4j

个人推荐通过portainer管理docker

基础语法(增删改查)

neo4j的语法非常简单,语法本身就像画图一样,这里只列举简单操作。

作为图数据库,一定存在两种对象,一是节点,二是关系。当需要创建节点时候需要明确节点信息,假设我们需要创建一个Cat类别,并且具有以下属性的节点:

1
2
3
4
5
6
7
8
{
"name":"tom",
"color":"blue",
"age":"1940-?",
"height":92,
"sex":"man",
"hobby":"Catch mice"
}

改写成数据库语句如下:

1
create (n:Cat {name:"tom",color:"blue",age:"1940-?",height:92,sex:"man",hobby:"Catch mice"}) return n;

其中Cat是属性,n是对当前节点起的别名,其他字母也行,注意return的时候一致。


对于关系,一样的有这样的信息,因此sql语句也类似。但是关系不是凭空出现的,一定是两个节点存在才能够创建关系,因此要么创建关系的时候也创建节点,要么就需要优先找到关系,如下:

1
2
3
MATCH (a:Cat), (b:Mouse) WHERE a.name = "tom" AND b.name = "jerry" 
CREATE (a)-[r:Catch {function:"chase"}]->(b)
RETURN a, b

如果没有节点就想要关系,就需要创建节点的时候一并创建关系,简写如下:

1
CREATE (fb1:FaceBookProfile1)-[like:LIKES]->(fb2:FaceBookProfile2) 

注意:关系的创建只能够单向创建,不能够创建双向关系。

就这么简单,像画图一样

对于删除,涉及到删除节点、删除关系、删除属性,其中删除节点与删除关系类似。但是删除了节点之后,节点附带的所有关系也会被一并删除,因此删除节点需要十分小心。

删除节点或者关系:

1
2
MATCH(node:Cat{name:"Tom"})
DETACH DELETE node

这种删除模式本质上都是先找定位到这个节点或者关系,然后删除掉。


当涉及到删除其属性信息的时候语法需要做一点点改变:

1
2
3
4
5
6
MATCH(node:Cat)
REMOVE node.property_name
-- 或者可以将属性制空
MATCH(node:Cat)
SET node.name = null
return node

最后说一种,由于自己是实验,因此常常用到全部删除:

1
match (n) detach delete n

修改一般来说就是修改属性信息,关系的指向不能够被修改,只能删除重建。修改属性如下:

1
2
3
MATCH(node:Cat)
SET node.mood = good
return node

新增亦如此

查询其实在上面已经被提及过了即MATCH,如下:

1
MATCH(node:Cat) return node

以上仅为简单使用操作

python操作

python当中很早便为neo4j提供了便利的操作API:

1
2
3
from py2neo import Graph

graph = Graph("http://localhost:7474", auth=("neo4j", "test123"))

python 当中既包含操作的函数同时也提供直接的sql语句操作:

1
2
3
4
A = Node("概念", name="向量", chapter = 1 , ID = 100)
B = Node("属性", name="向量叉积", chapter = 2 , ID = 99)
graph.create(A)
graph.create(B)

1
graph_.run('MATCH (n) detach delete n')

篇幅所限就不展开详述讲解了