Neo4j基础学习

发布时间 2023-11-19 17:05:10作者: 辛几何旋律

还是参考微信公众号的一篇文章
“关于图数据库(Neo4j)你应该知道的一切”

先简单介绍一下,Neo4j相关的服务

Neo4j 数据库,又名为Noe4j DBMS
同时还有Neo4j AuraDB,是一种完全托管的云服务。
比较重要的还有Cypher,是neo4j的查询语言

采用neo4j数据库主要可以提升在大图中深度和广度恒定时间遍历效率
同时可以动态的增加新的关系和属性

neo4j的安装教程网上很多,这里就不再过多介绍
这边主要讲解如何使用Cypher实现简单的知识图谱构建,更新,查询,删除等操作
还是以公众号上面的小例子开展。

组成要素

neo4j主要由节点、关系、属性三方面组成
节点可以有一个或者多个label(标签)
label一般看作是节点或关系的集合

节点和关系,都可以具有多个属性。
关系一般是有方向的

下面以一个具体的实例来探讨neo4j的应用。

1. 场景描述

例子

“金角大王和银角大王两个妖怪是兄弟俩,他们都想吃唐僧这个和尚的肉。”
以个例子开展。

节点提取

首先,我们可以确定例子中的实体

金角大王
银角大王
唐僧

一般情况下节点代表具体的实体,而“和尚”,“妖怪”等更多的代表实体的类型(作为标签或属性)

节点标签提取

一个节点可以具有一个或多个标签,利用标签对节点进行分类或分组
在本例子中:
金角大王和银角大王的标签为“妖怪”
而唐僧的标签为“和尚”

关系定义

关系允许我们链接两个节点,它有一个源节点、带箭头的方向以及一个目标节点,同时关系也有自己的名字(动作),以及他们自己的属性。

上面的关系为:
“金角大王和银角大王是兄弟”
“金角大王想吃唐僧”
“银角大王想吃唐僧”

属性定义

节点和关系都可以定义属性,为键值对的形式,十分灵活

接下来重点是如何通过neo4j实现增删查等操作

2.创建节点关系

这里采用的是MERGE方法

MERGE (j:Monster {name: '金角大王'})
    ON CREATE set j.age = 3100
MERGE (y:Monster {name: '银角大王'})
  ON CREATE set y.age = 2800
MERGE (t:Monk {title: '唐僧'})
  ON CREATE set t.height = 182
MERGE (j)-[rel1:IS_BROTHER]->(y)
  ON CREATE SET rel1.since = '-2023'
MERGE (j)-[rel2:WANT_EAT]->(t)
  ON CREATE SET rel2.desire = 4, rel2.possibility = 0
MERGE (y)-[rel3:WANT_EAT]->(t)
  ON CREATE SET rel3.desire = 3, rel3.possibility = 0

节点()表示,关系[]表示
注意这里的ON CREATE SET表示条件性创建,即为不存在则创建
{}内部表示属性
j:Monster就是节点:label的形式

可以用SET命令向节点或关系添加新的属性或label

3.查询

采用MATCH和RETURN共同实现

MATCH (n1)-[r]->[n2] RETURN n1,r,n2

查找所有的关系,结果如下
image

4.删除

这里需要注意的是,Neo4j中不允许出现损害的边,所以要求先删除边在删除节点
还是采用MATCH和DELETE,
删除妖怪想吃唐僧的边

MATCH  (n1:Monster)-[r:WANT_EAT]->()
DELETE r

删除 唐僧节点

MATCH (n:Monk{title:"唐僧"})
DELETE n

其他删除也是类似的

注意,neo4j也是支持中文的
一般来讲,title和name还是采用英文合适,便于neo4j识别节点名称

当然,知识图谱的表示非常灵活,上面的场景不一定非要用对应上述的知识图谱表示,
例如和尚和人,可以作为唐僧的属性,也可以作为唐僧邻接的节点

两种表达形式,
image

image

更复杂的技巧,比如超边、索引等先不在本文中提出了。
掌握上面的例子,就可以借助neo4j实现知识图谱最基础的操作了。