1. neo4j的简介
Neo4j是一种基于图形数据库模型 的开源图形数据库管理系统。它专注于存储和处理图形数据结构,如节点、关系和属性,以提供高效的图形数据查询和分析功能。
基于硬盘
为什么要使用
对数据的需求不在局限于对数据本身的获取,还需要获取数据与数据件的关系(就是连接数据)
简单来说,图数据库主要用于存储更多的连接数据。
2. 特点和优势
特点:
- 使用Neo4j CQL
- 遵循属性图数据模型
- 使用Apache Lucence 支持索引
- 支持 unique 约束
- 包含一个用于执行CQL命令的UI:Neo4j 数据浏览器
- 支持完整的事务(ACID)
- 采用原生图形库与本地GPE(图形处理引擎)
- 支持数据导出为Json 和XLS格式
- 提供rest api ,可以被任何编程语言调用
- 可以通过任意UI MVC 框架
- 支持Java API :Cypher API 和 Native Java API 来开发java 应用程序
优点:
- 它很容易表示连接的数据
- 检索/遍历/导航更多的连接数据是非常容易和快速的
- 它非常容易地表示半结构化数据
- Neo4j CQL查询语言命令是人性化的可读格式,非常容易学习
- 使用简单而强大的数据模型
- 它不需要复杂的连接来检索连接的/相关的数据,因为它很容易检索它的相邻节点或关系细节没有连接或索引
3. 名词
- 节点 节点通常用于表示实体
- 标签 标签用于分类节点
- 关系 图中的边表示关系,关系连接两个节点,如撰写关系
- 关系类型 关系与节点一样具有类型划分,但关系有且仅有一种关系类型。
- 属性 属性是用于描述节点和关系特性的名称 - 值对
- 路径与遍历 在图中,查询过程是路径搜索与遍历的过程
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会先删除所有节点的关系,然后再删除节点本身,