图数据库 Neo4j

Neo4J 简单教程

1、简介

​ 知识图谱(Knowledge Graph),在图书情报界称为知识域可视化或知识领域映射地图,是显示知识发展进程与结构关系的一系列各种不同的图形,用 可视化技术描述知识资源及其载体,挖掘、分析、 构建、绘制和显示知识及它们之间的相互联系。 知识图谱是通过将应用数学、 图形学、信息可视化技术、 信息科学等学科的理论与方法与计量学引文分析、共现分析等方法结合,并利用可视化的图谱形象地展示学科的核心结构、发展历史、 前沿领域以及整体知识架构达到多学科融合目的的现代理论。它能为学科研究提供切实的、有价值的参考。

​ 知识图谱由于其数据包含实体、属性、关系等,常见的关系型数据库诸如MySQL之类不能很好的体现数据的这些特点,因此知识图谱数据的存储一般是采用图数据库(Graph Databases)。而Neo4j是其中最为常见的图数据库。

​ Cypher是Neo4J的声明式图形查询语言,允许用户不必编写图形结构的遍历代码,就可以对图形数据进行高效的查询。Cypher的设计目的类似SQL,适合于开发者以及在数据库上做点对点模式(ad-hoc)查询的专业操作人员。其具备的能力包括: - 创建、更新、删除节点和关系 - 通过模式匹配来查询和修改节点和关系 - 管理索引和约束等。

2、安装

docker 安装

  1. 拉取镜像

    1
    docker pull neo4j  # 默认安装最新版本
  2. 启动容器

    1
    2
    3
    4
    5
    6
    7
    8
    9
    docker run -d --name container_name \  //-d表示容器后台运行 --name指定容器名字
    -p 7474:7474 -p 7687:7687 \ //映射容器的端口号到宿主机的端口号
    -v /home/neo4j/data:/data \ //把容器内的数据目录挂载到宿主机的对应目录下
    -v /home/neo4j/logs:/logs \ //挂载日志目录
    -v /home/neo4j/conf:/var/lib/neo4j/conf //挂载配置目录
    -v /home/neo4j/import:/var/lib/neo4j/import \ //挂载数据导入目录
    --env NEO4J_AUTH=neo4j/password \ //设定数据库的名字的访问密码
    neo4j //指定使用的镜像

  3. 检测是否启动成功

    本地访问localhost:7474,输入用户名及密码,能出现下边的页面即部署成功

    image-20220516144523419

3、创建节点、关系、属性

通过实际案例讲解,节点包括电影和演员,电影和演员间存在主演关系等

1、清空数据库

删除数据库中全部的数据,保证一个空白的环境进行操作

1
MATCH (n) DETACH DELETE n;

2、创建节点

  • 演员节点(Person为节点,name 为属性)
1
2
3
4
CREATE (n:Person {name:'葛优'}) RETURN n;
CREATE (n:Person {name:'巩俐'}) RETURN n;
CREATE (n:Person {name:'章子怡'}) RETURN n;
CREATE (n:Person {name:'李连杰'}) RETURN n;

image-20220516145920097

  • 电影节点(Movie 为节点,name 为属性)
1
2
3
4
CREATE (n:Movie {name:'活着'}) RETURN n;
CREATE (n:Movie {name:'红高粱'}) RETURN n;
CREATE (n:Movie {name:'卧虎藏龙'}) RETURN n;
CREATE (n:Movie {name:'少林寺'}) RETURN n;

image-20220516145937971

3、创建关系

  • 创建电影与演员的关系
1
2
3
4
5
6
7
8
9
10
11
12
MATCH (a:Person {name:'葛优'}), 
(b:Movie {name:'活着'})
MERGE (a)-[:主演]->(b);
MATCH (a:Person {name:'巩俐'}),
(b:Movie {name:'红高粱'})
MERGE (a)-[:主演]->(b);
MATCH (a:Person {name:'章子怡'}),
(b:Movie {name:'卧虎藏龙'})
MERGE (a)-[:主演]->(b);
MATCH (a:Person {name:'李连杰'}),
(b:Movie {name:'少林寺'})
MERGE (a)-[:主演]->(b);

image-20220516150101614

  • 创建演员之间的关系
1
2
3
4
5
6
7
8
9
10
11
12
MATCH (a:Person {name:'葛优'}), 
(b:Person {name:'巩俐'})
MERGE (a)-[:朋友]->(b);
MATCH (a:Person {name:'巩俐'}),
(b:Person {name:'章子怡'})
MERGE (a)-[:朋友]->(b);
MATCH (a:Person {name:'章子怡'}),
(b:Person {name:'李连杰'})
MERGE (a)-[:朋友]->(b);
MATCH (a:Person {name:'李连杰'}),
(b:Person {name:'葛优'})
MERGE (a)-[:朋友]->(b);

image-20220516150251832

  • 创建节点的时候就建好关系
1
CREATE (a:Person {name:'成龙'})-[r:FRIENDS]->(b:Person {name:'章子怡'})
  • 关系增加属性
1
2
3
MATCH (a:Person {name:'葛优'}), 
(b:Movie {name:'活着'})
MERGE (a)-[:主演 {since:1994}]->(b)

image-20220516150621217

4、查询数据

1、查询所有对外有关系的节点

1
MATCH (a)-->() RETURN a;

image-20220516150851145

2、查看所有有关系的节点

1
MATCH (a)--() RETURN a

image-20220516150946839

3、查看所有对外有关系的节点,以及关系类型

1
MATCH (a)-[r]->() RETURN a.name, type(r);

image-20220516151053686

4、查看所有有朋友关系的节点

1
MATCH (n)-[:朋友]-() RETURN n;

image-20220516152527772

5、查看某人的朋友的朋友

1
MATCH (a:Person {name:'葛优'})-[r1:朋友]-()-[r2:朋友]-(friend_of_a_friend) RETURN friend_of_a_friend.name AS fofName

葛优朋友的朋友就是章子怡

5、修改节点、属性

1
2
MATCH (a:Person {name:'葛优'}) SET a.age=54;
MATCH (a:Person {name:'章子怡'}) SET a.age=44;

image-20220516153150421

6、删除节点、属性、关系

1、删除节点

删除节点前需要将节点的关系等数据删除,否则会报错(Cannot delete node<50>, because it still has relationships. To delete this node, you must first delete its relationships.)

1
MATCH (a:Person {name:'章子怡'}) DELETE a;

2、删除节点属性

1
2
MATCH (a:Person {name:'葛优'}) SET a.test='test';
MATCH (a:Person {name:'葛优'}) REMOVE a.test;

3、删除有关系的节点

1
MATCH (a:Person {name:'葛优'})-[rel]-(b:Person) DELETE a,b,rel;

4、删除关系

  • 删除指定两个节点的关系
1
2
MATCH (:Person {name: "葛优"})-[r:朋友]-(:Person {name: "巩俐"}) 
DELETE r
  • 删除全部节点的某种关系
1
2
3
4
5
MATCH (:Person)-[r:朋友]-(:Person) 
DELETE r

MATCH ()-[r:朋友]-()
DELETE r

7、批量导入节点、关系

  • a.csv

image-20220516155842200

  • b.csv

image-20220516155901861

  • c.csv

image-20220516155921550

  • d.csv

image-20220516155939143

1、导入演员节点

1
LOAD CSV WITH HEADERS FROM 'file:///a.csv' AS line FIELDTERMINATOR ',' CREATE (:Person {name: line.name});

2、导入电影节点

1
LOAD CSV WITH HEADERS FROM 'file:///b.csv' AS line FIELDTERMINATOR ',' CREATE (:Movie {name: line.name});

3、增加演员与电影的关系

1
LOAD CSV WITH HEADERS FROM "file:///c.csv" AS line MATCH (from:Person{name:line.person}),(to:Movie{name:line.movie}) MERGE (from)-[r:relation {Relation:line.relation}]->(to)

4、增加演员之间的关系

1
LOAD CSV WITH HEADERS FROM "file:///d.csv" AS line MATCH (from:Person{name:line.one}),(to:Person{name:line.two}) MERGE (from)-[r:relation {Relation:line.relation}]->(to)

A5CF8D71-A3EB-49D8-8D51-F67FD4146289