安装Neo4j并尝试创建数据
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,最后一个是讲 Cypher,大家可以看一看,我们重点说说第二个,实际演示一下,点击 Play guide。
官方简单示例:
让我们切换到 system 数据库,然后执行语句创建 movies 表:
点击运行后发现报错不能创建,因为我们是使用的社区版不能创建表,只有企业版才能创建
文档原文中也有提到:https://neo4j.com/docs/operations-manual/current/manage-databases/configuration/#table-note
但是我搜了一下还是发现了一个可以完成该操作的技巧:
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
发现默认库就是 movies了,就可以创建库了。
创建成功后就可以创建 movie graph 了,复制语句执行即可。
完成后就如下图所示:
我们稍微看看官方给得示例 Cypher 语句就会发现,其实就是三部分组成:
- 创建电影节点
CREATE (TheMatrix:Movie {title:'The Matrix', released:1999, tagline:'Welcome to the Real World'})
- 创建人物
使用 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})
- 创建关系
这里除了使用 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)
结果即为此:
可能用到的查询删除语句:
// 查询和马云相关的
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/