当前位置:网站首页>了解图数据库neo4j(一)

了解图数据库neo4j(一)

2022-06-09 08:52:00 余生大大

介绍

neo4j是一个图形数据库也可以叫做知识图谱知识图谱的数据包含实体、属性、关系。知识图谱就是通过不同知识的关联性形成一个网状的知识结构。当前AI领域热门的计算机图像、语音识别甚至是NLP,其实都是AI的感知能力,真正AI的认知能力,就要靠知识图谱。

知识图谱目前的应用主要在搜索、智能问答、推荐系统等方面。

像我们在使用社交软件中经常会推荐你可能认识的人、共同关注的人、你的朋友也关注了他 等等的关系网推荐,这个在社交领域中叫做关注模型,我们下面尝试使用neo4j来实现它。

Neo4J简介

图形数据库也被称为图形数据库管理系统(GDBMS),现发展比较成熟的图数据库有Neo4j、OracleNoSQL、OrientDB、HypherGraphDB和GraphBase等

其中Neo4j是基于Java语言编写的图形数据库,它采用节点和关系的形式存储信息,并在此基础上提供界面友好的可视化演示,Neo4j图形数据库的主要组成有:

  • 节点:即实体,用于表示一个单独存在的个体,节点一般包含多个属性
  • 关系:也就是“边”,两个节点靠关系才能连接,每个关系也具有它自己的名词,可以通过Cypher检索关系名称来查找具有该关系的所有节点
  • 属性:可以看作是节点的扩展描述,id、名称这些也属于节点的属性,详细的属性需要通过数据浏览器的Text标签进行查看
  • 标签:即分组,Neo4j在建立节点或关系时要求事先分组
  • 数据浏览器:Neo4j自己的可视化界面,用于提供用户执行Cypher查询命令并查看输出文本和图形

Neo4J安装

在我之前的文章中使用linux安装了neo4j,可以借鉴:Linux在线安装一个Neo4j图数据库

Neo4J基础操作

Neo4J安装后已经提供了可视化页面,并且可以直接执行语句来操作数据和查看数据库关系即标签,可谓非常好用。

安装好后访问neo4j的web页面:http://你的ip地址:7474/browser/

在这里插入图片描述

主页面是有执行命令的窗口,左侧导航栏有展示选择的数据库及数据库的节点总数和拥有的标签和关系,可以清晰看到我们这个数据库拥有哪些标签跟关系

Cypher查询语言

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

常用命令如下:

# 删除以往的所有节点和关系,MATCH是匹配操作,()表示一个节点,n是标识符
MATCH (n) DETACH DELETE n
 
# 创建一个标签为Person的节点,节点有一个name属性,属性值为'John'
CREATE (n:Person{
    name:'John'}) RETURN n
 
# 从a到b建立起FRIENDS关系,关系有一个since属性,属性值为2001
MATCH (a:Person{
    name:'Liz'}),(b:Person{
    name:'Mike'})MERGE (a)-[:FRIENDS{
    since:2001}]->b
 
# 查询在Boston出生的所有Person
MATCH (a:Person)-[:BORN_IN]->(b:location{
    city:'Boston'}) RETURN a,b
 
# 查询所有具有对外关系的节点
MATCH (a)-->() RETURN a
 
# 查询所有具有关系的节点
MATH (a)--() RETURN a
 
# 查询所有具有对外关系的节点,并返回节点的name属性值和关系类型
MATCH (a)-[r]->() RETURN a.name, type(r)
 
# 给a节点设置一个age属性,属性值为34
MATCH (a:Person{
    name:'Liz'}) SET a.age = 34
 
# 删除a节点的test属性
MATCH ... REMOVE a.test
 
# 删除a节点
MATCH ... DELETE a

# 只删除关系
match (n:Person{
    name:"龙傲天"})<-[r:BIGBROTHER]-(m:Person{
    name:"龙小弟"}) DELETE  r

# 添加关系属性
MATCH p=({
    name:'龙二弟'})-[r:BIGBROTHER ]->() SET r={
    since:"2017-01-02"}  RETURN p;   

neo4j实战

我们接下来使用neo4j实现社交的关系模型

1. 清除数据库

将数据库初始化一下,保证我们的操作属性不受影响,在运行框内执行如下命令

MATCH (n) DETACH DELETE n

这条命令中MATCH为匹配,小括号()中写匹配的节点,n为标识符,DETACH DELETE为操作。
组合下来就是匹配标识符为n的进行删除

在这里插入图片描述
如上图执行成功清除命令

2. 创建人物

房间腾好了,那就该让我们的人物入住了,先创建我们的第一位嘉宾:龙傲天

CREATE (n:Person {
    name:'龙傲天'}) RETURN n

CREATE是创建操作,Person是标签,代表节点的类型。花括号{}代表节点的属性,属性类似Python的字典。
这条语句的含义就是创建一个标签为Person的节点,该节点具有一个name属性,属性值是龙傲天。

创建好的效果如下:
在这里插入图片描述

看到我们傲天哥先来了,小弟都还不到,多不合适,赶紧创建天哥的小弟:

CREATE (n:Person {
    name:'龙小弟'}) RETURN n;
CREATE (n:Person {
    name:'龙二弟'}) RETURN n;
CREATE (n:Person {
    name:'龙三弟'}) RETURN n;
CREATE (n:Person {
    name:'龙四弟'}) RETURN n;
CREATE (n:Person {
    name:'龙五弟'}) RETURN n;

创建成功后我们再来看一下:

在这里插入图片描述

小弟是有了,但是他们现在跟天哥没关系啊,这可不行,哪有小弟不认大哥的道理,那接下来就该让小弟跟大哥建立关系。

创建小弟跟大哥的关系:

MATCH (a:Person {
    name:'龙小弟'}), 
      (b:Person {
    name:'龙傲天'}) 
MERGE (a)-[:BIGBROTHER]->(b)

执行后我们来看看龙小弟拜见大哥了吗:

在这里插入图片描述
根据关系图看到龙小弟有一个大哥的关系指向了龙傲天,这样傲天哥就有了一个小弟,接下来将其他小弟也拜见龙傲天,命令如下

MATCH (a:Person {
    name:'龙二弟'}), (b:Person {
    name:'龙傲天'}) MERGE (a)-[:BIGBROTHER]->(b);
MATCH (a:Person {
    name:'龙三弟'}), (b:Person {
    name:'龙傲天'}) MERGE (a)-[:BIGBROTHER]->(b);
MATCH (a:Person {
    name:'龙四弟'}), (b:Person {
    name:'龙傲天'}) MERGE (a)-[:BIGBROTHER]->(b);
MATCH (a:Person {
    name:'龙五弟'}), (b:Person {
    name:'龙傲天'}) MERGE (a)-[:BIGBROTHER]->(b);

看看效果:

在这里插入图片描述
这样一看龙傲天有了点大哥的样子,众星捧月,但是我们想知道小弟们都是什么时候跟着龙傲天的,好方便以后排座位,这样就需要给关系加属性了,如下:

CREATE (n:Person {
    name:'龙六弟'}) RETURN n;
MATCH (a:Person {
    name:'龙六弟'}), 
      (b:Person {
    name:'龙傲天'}) 
MERGE (a)-[:BIGBROTHER {
    since:"2022-01-01"}]->(b)

这时候新来了个龙六弟,并且可以看到新来的龙六弟有了时间的属性,这样以后龙六弟就可以说我跟老大风里来雨里去的时候你们还玩泥巴呢。

在这里插入图片描述

这时候其他几个小弟不乐意了,我们最先跟的老大,怎么先有时间铭牌的是这个新来的,这样就需要解决之前兄弟没有身份的问题,但是之前跟的小弟怎么加属性的,总不能让龙六弟在它的五个哥哥之前吧,所以下面就是怎么修改关系的属性

MATCH p=({
    name:'龙小弟'})-[r:BIGBROTHER ]->() SET r={
    since:"2017-01-01"}  RETURN p    

在这里插入图片描述
龙小弟拿到时间铭牌非常高兴,并且时间也比龙六弟早,不屑的对龙六弟哼了一声,其他几个兄弟看到也赶紧要求加上,我们也给他们分发时间名牌

MATCH p=({
    name:'龙二弟'})-[r:BIGBROTHER ]->() SET r={
    since:"2017-01-02"}  RETURN p;   
MATCH p=({
    name:'龙三弟'})-[r:BIGBROTHER ]->() SET r={
    since:"2017-01-03"}  RETURN p;   
MATCH p=({
    name:'龙四弟'})-[r:BIGBROTHER ]->() SET r={
    since:"2017-01-04"}  RETURN p;   
MATCH p=({
    name:'龙五弟'})-[r:BIGBROTHER ]->() SET r={
    since:"2017-01-05"}  RETURN p;   

傲天哥的基础团队有了矛盾也消除了,该出去逛逛了,可该去哪呢?

目前我们的图谱中可只有人物的标签,傲天哥想逛逛街发展一下剧情都没法发展,那就应该创建地点的标签和属性建立跟我们傲天哥的关系,这些东西就放到下一章吧,傲天哥也得休息休息。

看到这里的同学如果想要实践一下却没有自己的neo4j可以使用我的,地址放在这里了:http://110.40.220.41:7474/browser/

原网站

版权声明
本文为[余生大大]所创,转载请带上原文链接,感谢
https://blog.csdn.net/AnNanDu/article/details/125116784