Neo4J-图数据库入门

1. neo4j的简介

Neo4j是一种基于图形数据库模型 的开源图形数据库管理系统。它专注于存储和处理图形数据结构,如节点、关系和属性,以提供高效的图形数据查询和分析功能。

基于硬盘

为什么要使用

对数据的需求不在局限于对数据本身的获取,还需要获取数据与数据件的关系(就是连接数据)

简单来说,图数据库主要用于存储更多的连接数据。

2. 特点和优势

特点:

  1. 使用Neo4j CQL
  2. 遵循属性图数据模型
  3. 使用Apache Lucence 支持索引
  4. 支持 unique 约束
  5. 包含一个用于执行CQL命令的UI:Neo4j 数据浏览器
  6. 支持完整的事务(ACID)
  7. 采用原生图形库与本地GPE(图形处理引擎)
  8. 支持数据导出为Json 和XLS格式
  9. 提供rest api ,可以被任何编程语言调用
  10. 可以通过任意UI MVC 框架
  11. 支持Java API :Cypher API 和 Native Java API 来开发java 应用程序

优点:

  • 它很容易表示连接的数据
  • 检索/遍历/导航更多的连接数据是非常容易和快速的
  • 它非常容易地表示半结构化数据
  • Neo4j CQL查询语言命令是人性化的可读格式,非常容易学习
  • 使用简单而强大的数据模型
  • 它不需要复杂的连接来检索连接的/相关的数据,因为它很容易检索它的相邻节点或关系细节没有连接或索引

3. 名词

  1. 节点 节点通常用于表示实体
  2. 标签 标签用于分类节点
  3. 关系 图中的边表示关系,关系连接两个节点,如撰写关系
  4. 关系类型 关系与节点一样具有类型划分,但关系有且仅有一种关系类型。
  5. 属性 属性是用于描述节点和关系特性的名称 - 值
  6. 路径与遍历 在图中,查询过程是路径搜索与遍历的过程

4. 下载与安装

下载链接https://neo4j.com/download/

neo4j 博客 W3Cschool:Neo4j - 图形理论基础_w3cschool

支持三种版本

刚打开的时候就是需要一个激活码

eyhbGci0jQUzl1 NilsinR5ccl6lkpxvcj9.eyjyWxsYmFjayl6llsimvtywisljolMjQ2MTYyNjc2ODYyQHFxLmNvbslslmZvcm hdcl6lmpzb24iLC]vcmci0ij3dwhhbiB1bml2ZXjzaXR5liwicHVilioibmVvNGouY29tliwicmVnlioiewluZyBsaxUiLC]zdWiiOijuZw80ai1kZXNrdY29tliwibmImljoxNTg4MikONZIzLCIPYXQIOjE1ODgyOTQ3MiG9wliwiZXhwli0xNiE5ODMWNZIZLC12ZXli0ilgliwiaXNzlioibmVNGouMslmp0asl6Ink4UzVVdF8yZU19.ZNpBYhS!6eOL8IxOcE1 CPYPCyIz61w2G6tpseLc20qm5|xpdigiDMtscjXGY3nloha_7oNxqEl0neovPSuZGChITCZEWKmHKn4IFKmOyh1 0SiFIdtQ9pQIELIVIBO QMtWYS0r6zbgydTm1 S9tGuibNFdKKIWfOW7GMaMHiAoSQhQzEtyVtt] DSErREZVX6HQA0XpgwKIwalvk, SZGeUwE1 giuXBlG87flpMPkgDOmzapSGVPrQLL-K6-LViLrS37A!XIGZGmKPX61_goQrnyBvGRYk77y65FolimlbVzaKsGyDtXVD1yx6sgtR3mN740cS6bAmel3hG8boXO

5. 一些实际操作

5.1. 切换数据库

use 数据库名
也可以手动切换

5.2. 清空

match (n) detach delete n

match是匹配 操作,可以简单的理解为相当于mysql中的select 操作,而小括号()代表一个节点 node(可理解为括号类似一个圆形),括号里面的n为标识符

5.3. 创建persion节点

create (n:Person{name:"John"}) return n

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

创建成功

create (:Person {name:'Sally'}) 
create (:Person {name:'Steve'}) 
create (:Person {name:'Mike'}) 
create (:Person {name:'Liz'}) 
create (:Person {name:'Shawn'}) 

5.4. 创建地区节点

create (n:Location {city:'Miami', state:'FL'})
create (n:Location {city:'Boston', state:'MA'})
create (n:Location {city:'Lynn', state:'MA'})
create (n:Location {city:'Portland', state:'ME'})
create (n:Location {city:'San Francisco', state:'CA'})

现在一共有 6 个人物节点 以及5 个地区节点

5.5. 接下来创建关系

match (a:Person {name:'Liz'}), 
      (b:Person {name:'Mike'}) 
merge (a)-[:FRIENDS]->(b)

这里的方括号[]即为关系,FRIENDS为关系的类型。注意这里的箭头-->是有方向的,表示是从a到b的关系。 如图,Liz和Mike之间建立了FRIENDS关系,通过Neo4J的可视化很明显的可以看出

关系也可以增加属性

match(a:Person {name:'Shawn'}), 
      (b:Person {name:'Sally'}) 
merge (a)-[:FRIENDS {since:2001}]->(b)

在关系中,同样的使用花括号{}来增加关系的属性,也是类似Python的字典,这里给FRIENDS关系增加了since属性,属性值为2001,表示他们建立朋友关系的时间。

为剩下的 添加关系

match (a:Person {name:'Shawn'}), (b:Person {name:'John'}) merge (a)-[:FRIENDS {since:2012}]->(b);
match (a:Person {name:'Mike'}), (b:Person {name:'Shawn'}) merge (a)-[:FRIENDS {since:2006}]->(b);
match (a:Person {name:'Sally'}), (b:Person {name:'Steve'}) merge (a)-[:FRIENDS {since:2006}]->(b);
match (a:Person {name:'Liz'}), (b:Person {name:'John'}) merge (a)-[:MARRIED {since:1998}]->(b)

建立不同类型节点之间的关系-人物和地点的关系

match (a:Person {name:'John'}), 
  (b:Location {city:'Boston'}) 
merge (a)-[:BORN_IN {year:1978}]->(b)

为剩下的建立关系

match (a:Person {name:'Liz'}), (b:Location {city:'Boston'}) merge (a)-[:BORN_IN {year:1981}]->(b);
match (a:Person {name:'Mike'}), (b:Location {city:'San Francisco'}) merge (a)-[:BORN_IN {year:1960}]->(b);
match (a:Person {name:'Shawn'}), (b:Location {city:'Miami'}) merge (a)-[:BORN_IN {year:1960}]->(b);
match (a:Person {name:'Steve'}), (b:Location {city:'Lynn'}) merge (a)-[:BORN_IN {year:1970}]->(b)

知识图谱的数据已经插入完毕,可以开始做查询了。我们查询下所有在Boston出生的人物

5.6. 增删改查

match (a:Person)-[:BORN_IN]->(b:Location {city:'Boston'}) return a,b

5.6.1. 查询所有对外有关系的节点

match (a)-->() return a

注意这里箭头的方向,返回结果不含任何地区节点,因为地区并没有指向其他节点(只是被指向)

5.6.2. 查询所有有关系的节点

match (a)--() return a

5.6.3. 查询所有对外有关系的节点,以及关系类型

match (a)-[r]->() return a.name, type(r)

5.6.4. 查询所有有结婚关系的节点

MATCH (n)-[:MARRIED]-() RETURN n

5.6.5. 创建节点的时候就建好关系

CREATE (a:Person {name:'Todd'})-[r:FRIENDS]->(b:Person {name:'Carlos'})

5.6.6. 查找某人的朋友的朋友

match (a:Person {name:'Mike'})-[r1:friends]-()-[r2:friends]-(friend_of_a_friend) return friend_of_a_friend.name AS fofName

5.6.7. 增加/修改节点的属性

match (a:Person {name:'Liz'}) set a.age=34;
match (a:Person {name:'Shawn'}) set a.age=32;
match (a:Person {name:'John'}) set a.age=44;
match (a:Person {name:'Mike'}) set a.age=25

这里的 set 表示 修改

5.6.8. 删除节点属性

match (a:Person {name:'Mike'}) set a.test='test';
match (a:Person {name:'Mike'}) remove a.test

通过 remove 进行删除属性

设置属性后

删除后

5.6.9. 删除节点

match (a:Location {city:'Portland'}) delete a

删除节点 用 delete

5.6.10. 删除所有关系的节点

match (n)
detach delete n

detach delete会先删除所有节点的关系,然后再删除节点本身,

相关推荐
TGB-Earnest25 分钟前
【py脚本+logstash+es实现自动化检测工具】
大数据·elasticsearch·自动化
大圣数据星球2 小时前
Fluss 写入数据湖实战
大数据·设计模式·flink
suweijie7682 小时前
SpringCloudAlibaba | Sentinel从基础到进阶
java·大数据·sentinel
Data跳动8 小时前
Spark内存都消耗在哪里了?
大数据·分布式·spark
woshiabc1119 小时前
windows安装Elasticsearch及增删改查操作
大数据·elasticsearch·搜索引擎
lucky_syq9 小时前
Saprk和Flink的区别
大数据·flink
lucky_syq9 小时前
流式处理,为什么Flink比Spark Streaming好?
大数据·flink·spark
袋鼠云数栈9 小时前
深入浅出Flink CEP丨如何通过Flink SQL作业动态更新Flink CEP作业
大数据
小白学大数据11 小时前
如何使用Selenium处理JavaScript动态加载的内容?
大数据·javascript·爬虫·selenium·测试工具
15年网络推广青哥11 小时前
国际抖音TikTok矩阵运营的关键要素有哪些?
大数据·人工智能·矩阵