一、Ubuntu20.04安装Neo4j教程

先安装java8:
sudo apt-get update
sudo apt-get install openjdk-8-jdk
然后安装neo4j
wget -O - https://debian.neo4j.org/neotechnology.gpg.key | sudo apt-key add -
echo 'deb https://debian.neo4j.org/repo stable/' | sudo tee -a /etc/apt/sources.list.d/neo4j.list
(非Ubuntu用户请多执行一条「apt-get install apt-transport-https」)
sudo apt-get update
sudo apt-get install neo4j
sudo nano /etc/neo4j/neo4j.conf
(把以下这行的注释取消)
dbms.connectors.default_listen_address=0.0.0.0
接着执行:
sudo ufw allow 7474
sudo ufw allow 7687
sudo service neo4j start(重启就restart)
等待1分钟左右,不行就restart然后再等
最后访问当前ip:7474即可进入主页
初始密码:
neo4j:neo4j
输入后会提示输入新密码

二、数据库语句基础

1、官方示例

https://bytedance.feishu.cn/docs/doccnBVmeV7Ses6AO0rI0hpCQgg#

2、创建相关

(1)创建节点

CREATE (实例:实体 {属性A:具体值a, 属性B: 具体值b})
其中Movie和Person表示实体,泛指一类对象,Keanu、Carrie等这些就是属于实体的个体,也称之为实例;每个实体有很多统一的属性,而每个实例的这些属性就有不同的值了;上述关系通过语句就是这样表述的,建议多看几次加深理解。

(2)创建关系

CREATE (实体节点A)-[:连接关系名称 {连接属性:连接属性值}]->(实体节点B)
乍一看我们通过上述语句创建的关系图,好像所谓的「角色」也可以成为电影的属性之一,但作者却设计为了“演员和电影”关系的属性,这就是图数据库的重难点之一了,最开始你就要考虑好哪些实体会加入进来,且设计好这些实体之间的关系,最后再加入值;比如「角色」在目前的设计中,它和“演员和电影”这两个实体都有关联,所以它就不能成为某个单独实体的属性,而会被设计为关联关系的属性,这一点和关系型数据库中的联合主键有那么点神似,建议多看几次加深理解。

3、查找相关

(1)传统查找

①以图显示

示例:MATCH (新创实例 {属性: "属性值"}) RETURN 新创实例

②以表显示

示例:MATCH (新创实例:实体) RETURN 新创实例.属性 LIMIT 限制数量
其中以图还是以表查找的区别,就在于return的是「节点」还是「节点.属性」,前者为图,后者为表。

(2)结构查找

(*此处不再赘述以图&以表显示的区别,为更直观地介绍下列关系,统一用图查询)

①连接关系

两种实体之间的连接关系,示例:MATCH (新创实例A:实体 {属性: "属性值"})-[:连接关系名称]指向关系(新创实例B) RETURN 新创实例A, 新创实例B;其中连接关系名称可以使用relatedTo,它可以抽象地指代并查出所有连接关系。

②层级关系

单个实体通过其他实体为媒介向外扩展的层级关系,示例:MATCH (新创实例A:关联实体 {属性: "属性值"})-[:连接关系名称]->(媒介实例)<-[:连接关系名称]-(新创实例B) RETURN 新创实例A, 媒介实例, 新创实例B

③跳跃关系

两个实体之间通过跳跃N个实体实现连接,示例↓
N维社交圈:MATCH (新创实例A:关联实体 {属性: "属性值"})-[*1..N]-(新创实例B)
RETURN DISTINCT 新创实例A, 新创实例B;其中DISTINCT为过滤重复的值,一般都需要加上。
最短路径:MATCH (新创实例A:关联实体 {属性: "属性值"}), (新创实例B:关联实体 {属性: "属性值"}), 新创实例C =shortestPath((新创实例A)-[*]-(新创实例B)) RETURN 新创实例C;

④混合查询

将上述几种关系模式结合起来进行复合查询,示例↓
两实体间的所有关联:MATCH (新创实例A:关联实体 {属性: "属性值"})-[:连接关系名称]->(媒介实例A)<-[:连接关系名称]-(新创实例B), (新创实例B)-[:连接关系名称]->(媒介实例B)<-[:连接关系名称]-(新创实例C:关联实体 {属性: "属性值"}) RETURN 新创实例A, 媒介实例A, 新创实例B, 媒介实例B, 新创实例C
实际上返回的结果即return后边这些实体之间形成的关系图↑
  • 实例可以是具象(被定义的),也可以是抽象的(未定义)
  • 关联实体也可以任意设置为库中任意的实体值
  • 连接关系名称也可以被理解为连接实体,它和节点一样具有属性和属性值(k:v)
  • 任何属性的值都可以是对象,例如String、Integer、Json、List等
  • (遇到了再补充)

Tips: 通过「MATCH (n) RETURN n」查询全部数据关系↓
*删库跑路:MATCH (n) DETACH DELETE n

(3)附录

*通过PROFILE、EXPLAIN关键字可以查看整个查找的流程:

4、关键字

(*此处仅提及和MySQL不同的关键字
MERGE
shortestPath
DISTINCT
PROFILE
<>
定义:类似于Create和Match的集合体,创建并返回节点或关系。
原文:Ensures that a pattern exists in the graph. Either the pattern already exists, or it needs to be created.
定义:查找两节点中的最短路径;
原文:The Shortest Path algorithm calculates the shortest (weighted) path between a pair of nodes.
定义:移除重复查询内容
原文:Duplicate removal
定义:列出某个查询的执行流程
原文:无
定义:不等于
原文:无
※目前遇到的:CREATE、MATCH、shortestPath、DISTINCT、<>、PROFILE、MERGE……

5、导入导出

sudo neo4j stop
sudo service neo4j stop
sudo neo4j-admin dump --database=graph.db --to=/home/ubuntu/graph.db.dump
sudo neo4j-admin load --from=/home/ubuntu/graph.db.dump --database=graph.db --force
sudo neo4j start

人生有無數種可能,人生有無限的精彩,人生沒有盡頭。一個人只要足夠的愛自己,尊重自己內心的聲音,就算是真正的活著。