目录

Neo4j 是什么?

Neo4j是一个高性能的,NOSQL 图形数据库,它将结构化数据存储在网络((从数学角度叫做图))上而不是表中。它使用节点属性来表示和存储数据。该系统的关键概念是,它直接将存储中的数据项,与数据节点和节点间表示关系的的集合相关联。这些关系允许直接将存储区中的数据链接在一起,并且在许多情况下,可以通过一个操作进行检索。图数据库将数据之间的关系作为优先级。查询图数据库中的关系很快,因为它们永久存储在数据库本身中。可以使用图数据库直观地显示关系,使其对于高度互连的数据非常有用,如:知识图谱。

安装

先运行:

docker run --name $CONTAINER \
    -v ~/data/neo4j/data:/data \
    -v ~/data/neo4j/logs:/logs \
    -p 7474:7474 \
    -p 7687:7687 \
    -e NEO4J_AUTH=neo4j/123456 \
    -d $IMAGE

运行后,copy 出 neo4j 配置文件,放到 ~/data/neo4j/conf 文件夹中,以便后续直接在宿主机修改配置文件:

docker cp neo4j:/var/lib/neo4j/conf/neo4j.conf ~/data/neo4j/conf/neo4j.conf

挂载好配置文件重新启动,算了,我们写个 shell 脚本执行 docker 的启动吧

deploy.sh

#!/bin/bash
IMAGE=neo4j:4.1.4
CONTAINER=neo4j
PORT=7474
PORT_BOLT=7687

echo "1st step: Removing existing $CONTAINER container..."
docker rm -f $CONTAINER || true
echo "2nd step: Deploying new docker instance of $IMAGE..."
docker run --name $CONTAINER \
    -v ~/data/neo4j/data:/data \
    -v ~/data/neo4j/logs:/logs \
    -v ~/data/neo4j/conf:/conf \
    -p $PORT:7474 \
    -p $PORT_BOLT:7687 \
    -e NEO4J_AUTH=neo4j/123456 \
    -d $IMAGE

使用

打开:http://localhost:7474,输入密码,Connect

安装Neo4j并尝试创建数据

首页:这里有三个引导模块,第一个是界面指南,第二个是尝试使用Neo4j,最后一个是讲 Cypher,大家可以看一看,我们重点说说第二个,实际演示一下,点击 Play guide。

安装Neo4j并尝试创建数据

官方简单示例:

安装Neo4j并尝试创建数据

让我们切换到 system 数据库,然后执行语句创建 movies 表:

安装Neo4j并尝试创建数据

点击运行后发现报错不能创建,因为我们是使用的社区版不能创建表,只有企业版才能创建

文档原文中也有提到:https://neo4j.com/docs/operations-manual/current/manage-databases/configuration/#table-note

安装Neo4j并尝试创建数据

但是我搜了一下还是发现了一个可以完成该操作的技巧:

https://stackoverflow.com/questions/60429947/error-occurs-when-creating-a-new-database-under-neo4j-4-0

1. Edit the file  NEO4J_HOME\conf\neo4j.conf

2. Un-comment the line:  dbms.default_database=neo4j

3. Change the neo4j  to whatever database name you want for a new database.  Note: names must have between 3 and 63 characters.   For example:   dbms.default_database=mydatabase

4. Save the file

5. (If applicable) Kill the database server, and close the browser window with the Neo4j UI

6. Start the neo4j server, and open a new browser window, pointed as usual to http://localhost:7474/

7. Both the old (default) database, "neo4j" and the one you just created will show up.  However, attempting to switch between them causes an error.   If a switch is desired, repeat the above steps starting from (3)

打开我们刚刚挂载的配置文件 ~/data/neo4j/conf/neo4j.conf ,找到 dbms.default_database=neo4j 配置,修改为 dbms.default_database=movies,然后重新运行neo4j:sh deploy.sh

安装Neo4j并尝试创建数据

发现默认库就是 movies了,就可以创建库了。

创建成功后就可以创建 movie graph 了,复制语句执行即可。

安装Neo4j并尝试创建数据

完成后就如下图所示:

安装Neo4j并尝试创建数据

我们稍微看看官方给得示例 Cypher 语句就会发现,其实就是三部分组成:

  1. 创建电影节点
CREATE (TheMatrix:Movie {title:'The Matrix', released:1999, tagline:'Welcome to the Real World'})
  1. 创建人物

使用 CREATE 指令创建了一个个 Person 节点,节点带有两个属性:名字和出生年份。

CREATE (Keanu:Person {name:'Keanu Reeves', born:1964})
CREATE (Carrie:Person {name:'Carrie-Anne Moss', born:1967})
CREATE (Laurence:Person {name:'Laurence Fishburne', born:1961})
CREATE (Hugo:Person {name:'Hugo Weaving', born:1960})
CREATE (LillyW:Person {name:'Lilly Wachowski', born:1967})
CREATE (LanaW:Person {name:'Lana Wachowski', born:1965})
CREATE (JoelS:Person {name:'Joel Silver', born:1952})
  1. 创建关系

这里除了使用 CREATE 指令外,还使用了箭头运算符,如:

(Keanu)-[:ACTED_IN {roles:['Neo']}]->(TheMatrix)

这一行的意思是创建一个演员参演电影的关系,演员 Keanu 以角色 roles:['Neo'] 参演 ACTED_IN 到电影 TheMatrix 中。

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)

代码前4行都是创建演员参演电影关系的指令。第5-6行指令意思是创建导演与电影的关系,即 LillyW 导演了 [:DIRECTED] 电影 TheMatrix。第7行指令意思是生产商与电影的关系,即 JoelS 生产了 [:PRODUCED] 电影 TheMatrix。

后面还有很多示例,可以跟着走一遍。

自己动手试试

我们也可以自己尝试创建一些三元组:

CREATE (China:Country {name:'中国'})

CREATE (MaYun:Person {name:'马云', birthDate: '1964-9-10', citizenship: '中国', spouse: '张瑛'})
CREATE (ZhangYing:Person {name:'张瑛', birthDate: '1966', citizenship: '中国', spouse: '马云'})

CREATE (Alibaba:Company {name:'阿里巴巴', foundingTime: '1999'})

CREATE
(MaYun)-[:国籍]->(China),
(ZhangYing)-[:国籍]->(China),
(MaYun)-[:妻子]->(ZhangYing),
(ZhangYing)-[:丈夫]->(MaYun),
(MaYun)-[:就职 {职位:['创办人','董事长']}]->(Alibaba)

结果即为此:

安装Neo4j并尝试创建数据

可能用到的查询删除语句:

// 查询和马云相关的
MATCH (n {name: "马云"}) RETURN n

// 删除马云的所有关系
MATCH (n)-[r]-()
WHERE n.name = '马云'
DELETE r

// 删除单个节点
MATCH (n:Person { name: '马云' })
DELETE n

// 删除全部节点及关系
MATCH (n)
DETACH DELETE n

更多 Cypher 语句查看:https://neo4j.com/docs/cypher-manual/4.1/