上手Neo4j
Neo4j是什么
软件安装及常用的配置选项介绍
下载
wget https://neo4j.com/artifact.php?name=neo4j-community-3.5.3-unix.tar.gz
解压:
tar -zxvf neo4j-community-3.5.3-unix.tar.gz
解压后进入指定目录
drwxr-xr-x 3 187 root 4096 Feb 7 2019 bin
drwxr-xr-x 2 187 ssh_keys 4096 Sep 4 15:41 conf
drwxr-xr-x 3 187 ssh_keys 4096 Feb 7 2019 data
drwxr-xr-x 2 187 ssh_keys 4096 Feb 7 2019 import
drwxr-xr-x 2 root root 4096 Sep 4 15:41 lib
-rw-r--r-- 1 187 ssh_keys 141211 Feb 7 2019 LICENSES.txt
-rw-r--r-- 1 187 ssh_keys 36005 Feb 7 2019 LICENSE.txt
drwxr-xr-x 2 187 ssh_keys 4096 Feb 7 2019 logs
-rw-r--r-- 1 187 ssh_keys 6546 Feb 7 2019 NOTICE.txt
drwxr-xr-x 2 187 ssh_keys 4096 Sep 4 15:41 plugins
-rw-r--r-- 1 187 ssh_keys 1596 Feb 7 2019 README.txt
drwxr-xr-x 2 187 ssh_keys 4096 Feb 7 2019 run
-rw-r--r-- 1 187 ssh_keys 96 Feb 7 2019 UPGRADE.txt
配置环境变量
vim /etc/profile
追加以下内容
后面的 路径是neo4j的解压路径
export NEO4J_HOME=/home/changwu/neo4j-community-3.5.3
添加path
export PATH=$PATH:$NEO4J_HOME/bin
修改neo4j的配置文件,使其启动起来/conf/neo4j.conf
分配内存
dbms.memory.heap.initial_size=1024m
dbms.memory.heap.max_size=1024m
# 修改54行,去掉改行的#,可以远程通过ip访问neo4j数据库
dbms.connectors.default_listen_address=0.0.0.0
# 默认 bolt端口是7687
# 端口可以自定义,别忘了去 安全组中开放这个端口
dbms.connector.bolt.listen_address=:9999
# 默认通过http访问的端口是7474, 开放这个端口,可以在浏览器打开
# HTTP Connector. There can be zero or one HTTP connectors.
dbms.connector.http.enabled=true
dbms.connector.http.listen_address=:9998
启动命令
[root@ecs-t6-large-2-linux-20190824103606 bin]# ./neo4j
Usage: neo4j { console | start | stop | restart | status | version }
概念名词
Label
label 相当于数据库中的表, 比如有一个Label="Person" 代表一类节点
Node
node 节点, 也叫它定点,每一个节点都代表一个对象, 相当于数据表中的一行数据
节点可以有若干个属性来描述自己
relation
relation 关系,也叫做边,有类型,带方向
- 有类型:表示节点之间的关系可以有多种, 比如 朋友关系, 上下级关系
- 带方向:表示节点之间的关系可以是单向的, 也可以是双向的, 注意在创建节点的关系时,必须指定方向性,否则会报错,但是在查询时,如果不指定方向,默认会查询双向的关系
id
每个节点,关系,都有系统自动分配的id,从0开始,全局唯一
如果我们手动创建一个node,然后指定它的id=1, 我们自己指定的id是属性, 与系统默认的id无关
create(Person{ id : '1' } )
通过id函数,可以获取出node的id值
match (n:Person{id:'erzi'}) return id(n)
Index
如果未来会频繁的根据node的某一个属性查询节点, 考虑为node的这个属性添加一个索引(不需要给index取名字),为了更强的性能
- 创建索引
create index on :Person(id)
- 删除索引
drop index on :Person(id)
- 查询
// where in = < > substring 都会走索引
explain match (n:Person) where n.id=2008 return n
注意点: 如果是给某一个字段创建了索引,那么查询这个字段是会扫描索引然会返回这个node, 但是,如果是给某一个字段创建索引后查询一个label下的全部节点,依然会走全表扫描
创建了索引的属性,自带唯一性的约束
consiraint 唯一性约束
- 添加唯一约束
create constraint on (a:Person) Assert a.id is unique
Assert a.id is unique
- 删除唯一约束
drop constraint on (a:Person) Assert a.id is unique
Cypher语言
cypher是语言是针对 neo4j设计的语言,类sql,但是他没有sql中多表之间的jion操作
创建 标签 | 节点 | 属性 | 关系
创建了两个节点,并且使用love 关联了他们的关系 张三-love->李四
create (:Person{name:'张三'})-[:love]->(:Person{name:'李四'})
其中 Person 是 Label
{name:'张三'} 整体是 node
name: 是属性
[:love] 是关系 (别忘了加: 冒号)
创建节点时,取个别名会很方便后续的操作
下面这句就是创建的一个id为'grandmother'的节点,并返回新创建的这个节点展示
如果你用浏览器访问,看到的每一个节点上的描述文字,其实就是id的值
create (n:Persion{id:'grandmother',name:'奶奶'}) return n
属性类型
Neo4j | Java |
---|---|
Null | null |
Boolean | java.lang.Boolean |
Integer | java.lang.Long |
Float | java.lang.Double |
String | java.lang.String |
List | java.util.List |
Map | java.util.Map |
Node | org.neo4j.driver.v1.types.Node(*) |
Relation | org.neo4j.driver.v1.types.Relationship(*) |
Path | org.neo4j.driver.v1.types.Path(*) |
Match 查询匹配
基本上所有的操作之间都得先把符合条件的node match出来, match 相当于 select
从Person标签中匹配出25条
match(n:Person) return n limit 25
匹配出id为2008的25个节点
match(n:Person{id:'2008'}) return n limit 25
同上
match(n:Person) where n.id ='2008' return n limit 25
Merge == Match or Create
先匹配出符合条件的节点,在给两个节点添加关系
match (n:Person{id:'son'} ),(f:Persion{id:'jiao'})
merge (n)-[:fuqi]->(f)
Delete & Remove
delete 用于删除 节点和关系
//删除son和jiao的 jiao -[:girlfriend]-> son 的关系
match (n:Person{id:'son'}),(f:Persion{id:'jiao'})
merge (n)<-[r:girfrield]-(f) delete r
// 删除节点
match (n:Person{id:'1'}) delete n
// 当把一个label下的全部node删除后, label也会消失
match (n:Person{id:'1'})-[r:love]->(f:Person{id:'2'}) delete n,r,f
remove 用户删除 标签
查询出一个标签然后删除它
match (n:Test) remove n:Test
// 当然,如果label中只有一个node了, 那么delete这个节点之后,label依然会消失
Set 修改属性
set 相当于update
如: 给指定的node,动态添加属性, 可以同时添加多个值,用逗号分隔
这也反应出 neo4j是无schme的特性,非结构化数据
match (n:Person{id:'1'}) set n.id='2',n.name='张三'
补充
- 排序
按照age正序排序
match (n:Person) return n order by n.age limit 25
按照age倒叙排序
match (n:Person) return n order by n.age desc limit 25
- 跳过
match (n:Person) return n skip 2
- 去重 : 连接两个match语句, 取出中间的重复部分
match XXX union all match YYY
- Null
match (n:Person) return n where n.age is not null
- In
match (n:Person) return n where n.age in [2,3,4,5,6,7]
常用的函数
- 普通函数
函数名 | 作用 |
---|---|
Upper | 字母转大写 |
Lower | 字母转小写 |
Substring | 获取给定串的子串 |
replace | 字符串替换 |
- 聚合函数
函数名 | 作用 |
---|---|
count | 返回 match 返回的行数 |
max | 返回match到的最大值 |
min | 返回match到的最小值 |
sum | 返回match命令的所有行求和值 |
avg | 返回match返回的所有行的平均值 |
- 查询节点之间的最短路径
shortestPath
//其中 *..2 表示查看他们之间的最短路径为2, 路径数==关系数 ,2 要求关系层在2 以内
match p=shortestPath((a:Persion{id:'1'})-[*..2]-(b:Persion{id:'5'})) return p
- 查询节点之间全部的最短路径
shortestPath
match p=allshortestpaths((N:Actor{name:'123'})-[*..6]-(M:Actor{name:'789'})) return p
六层关系理论: 六度关系理论由美国社会心理学家斯坦利-米尔格兰姆(Stanley Milgram)于1967年最先提出。通俗地说,你和世界上任何人之间所间隔的关系不会超过六度,也就是说最多通过六个人你就能够认识任何一个陌生人
数据备份和恢复
它的备份超级简单,当你把数据全部录入neo4j之后呢,只需要备份下data目录即可,当遭受攻击,或者主动数据迁移时,只需要将我们备份的data目录替换原data目录即可,数据自然会恢复
SpringDataNeo4j
Spring boot 版本 2.1.3RELEASE
点击进入: SpringDataNeo4j的官方文档
- 导入jar包坐标
<dependency>
<groupId>org.neo4j</groupId>
<artifactId>neo4j-ogm-http-driver</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-neo4j</artifactId>
</dependency>
如何使用javaBean表示node
@Data
@NodeEntity(label = "Actor") // 通过label设置 标签的名字
@NoArgsConstructor
@AllArgsConstructor
public class Actor {
// 这个id,如果我们没有自定义,使用的就是系统默认生成的
// 自定义了的话, 使用的是我们自己的, 但是不能缺少, 而且 必须是Long类型的
@Id
@GeneratedValue
private Long id ;
//@Property(name="name") 改变生成的json格式数据中的key
private String name;
private String image;
}
如何使用javaBean表示node之间的relation
@RelationshipEntity(type = "学生")
@AllArgsConstructor
@NoArgsConstructor
@Data
public class StudentRelation {
@Id
@GeneratedValue
private Long id;
//todo 关系节点这两个下面的两个不能少
@StartNode
private Actor startNode;
@EndNode
private Actor endNode;
}
简单的curd
自定义Repository,让他继承Neo4jRepository
public interface ActorRepository extends Neo4jRepository<Actor,Long> {}
使用方法跟jpa一样,无脑是就行
复杂查询
使用@Query注解,自定义cypher
public interface StudentRelationRepository extends Neo4jRepository<StudentRelation,Long> {
// todo ok
@Query(value = "MATCH p=(n:Actor)<-[StudentRelation]->(m:Actor) WHERE m.name={name} RETURN p")//
List<StudentRelation> findAll(@Param("name") String name);
//todo ok 返回节点n以及n指向的所有节点与关系
@Query("MATCH p=(n:Actor)-[StudentRelation]->(m:Actor) WHERE id(n)={0} RETURN p")
List<StudentRelation> findAllByBotNode(Actor actor);
}
批量导入csv文件数据
批量导入csv里面的数据,前提是打开两个配置
dbms.security.allow_csv_import_from_file_urls=true
dbms.directories.import=import
命令:
load csv with headers from "file:///bank.csv" As line create (:Bank{name:line.bank,number:line.count,detail:line.detail})
上手Neo4j的更多相关文章
- Neo4j ETL工具快速上手:简化从关系数据库到图数据库的数据迁移
注:本文系从https://medium.com/neo4j/tap-into-hidden-connections-translating-your-relational-data-to-graph ...
- 图形数据库Neo4J简介
最近我在用图形数据库来完成对一个初创项目的支持.在使用过程中觉得这种图形数据库实际上挺有意思的.因此在这里给大家做一个简单的介绍. NoSQL数据库相信大家都听说过.它们常常可以用来处理传统的关系型数 ...
- MongoDB快速上手
1. MongoDB简介 MongoDB是一个跨平台的基于Key_Value键值对形式保存数据的NoSQL文档类型数据库. NoSQL(not only sql)数据库,泛指非关系型数据库. 1.1 ...
- Neo4j数据库简单
作为世界上先进的地图数据库,Neo4j如今,公司已成为许多互联网的首选.Neo4j它是基于java开源地图数据库开发,另外一个NoSQL数据库.Neo4j在保证对数据关系的良好刻画的同一时候.还支持传 ...
- 开源软件:NoSql数据库 - 图数据库 Neo4j
转载自原文地址:http://www.cnblogs.com/loveis715/p/5277051.html 最近我在用图形数据库来完成对一个初创项目的支持.在使用过程中觉得这种图形数据库实际上挺有 ...
- 暑假学习笔记(一)——初识Neo4j和APICloud入门
暑假学习笔记(一)--初识Neo4j和APICloud入门 20180719笔记 1.Neo4j 接了学姐的系统测试报告任务,感觉工作很繁重,但是自己却每天挥霍时光.9月份就要提交系统测试报告了,但是 ...
- 图数据库Neo4j简介
图数据库Neo4j简介 转自: 图形数据库Neo4J简介 - loveis715 - 博客园https://www.cnblogs.com/loveis715/p/5277051.html 最近我在用 ...
- Neo4j图数据库从入门到精通(转)
add by zhj: 转载时,目录没整理好,还会跳转到原文 其实RDB也可以存储多对多的关系,使用的是中间表,GDB使用的是边,RDB中的实体存储在数据表,而GDB存储在节点.两者使用的底层技术不同 ...
- 图数据库对比:Neo4j vs Nebula Graph vs HugeGraph
本文系腾讯云安全团队李航宇.邓昶博撰写 图数据库在挖掘黑灰团伙以及建立安全知识图谱等安全领域有着天然的优势.为了能更好的服务业务,选择一款高效并且贴合业务发展的图数据库就变得尤为关键.本文挑选了几款业 ...
随机推荐
- VMware永久激活密钥
VMware Workstation 14 Pro永久激活密钥 1. ZC3WK-AFXEK-488JP-A7MQX-XL8YF 2. AC5XK-0ZD4H-088HP-9NQZV-ZG2R4 3. ...
- lede install unifi controller
requirement: sdb3 should be formated as ext4, DO not use f2fs/NTFS/exFAT. debootstrap --arch=amd64 s ...
- c++之基础数据类型
c++规定了在创建一个变量或者常量时,必须先要指定相应的数据类型,否发无法将变量分配给内存. 1.整型 数据类型 占用空间 取值范围 short 2字节 -2^15-2^15-1 int 4字节 -2 ...
- 简单实现vue列表点击某个高亮显示
比如ul下有4个li元素. 给每个li绑定点击事件@click="select_li(index),然后这个点击时间会将一个全局变量 selectLi 赋值为 index 的值. 然后在每个 ...
- C# (转载)webbrowser专题(参考资料:https://www.cnblogs.com/blogpro/p/11458390.html)
C# .Net 2.0实例学习:WebBrowser页面与WinForm交互技巧 2 Study Case :高亮显示 上一个例子中我们学会了查找文本——究跟到底,对Web页面还是只读不写.那么,如果 ...
- phper使用MySQL 针对千万级的大表要怎么优化?
有需要学习交流的友人请加入交流群的咱们一起,群内都是1-7年的开发者,希望可以一起交流,探讨PHP,swoole这块的技术 或者有其他问题 也可以问,获取swoole或者php进阶相关资料私聊管理即可 ...
- 中移动物联手机端APP软件
https://open.iot.10086.cn/doc/book/device-develop/multpro/sdk-doc-tool/APP.html
- vue中Enter触发登录事件和javascript中Enter触发点击事件
created(){ window.addEventListener('keydown', this.handleKeyDown, true)//开启监听键盘按下事件 } 在methods中当keyC ...
- Postman文件上传
1:请求Url 2:选择消息体 3:选择表单参数 4:填写参数KEY-VALUE,记得打钩 5:Send发送请求
- MySQL 两张表关联更新(用一个表的数据更新另一个表的数据)
有两张表,info1, info2 . info1: info2: 现在,要用info2中的数据更新info1中对应的学生信息,sql语句如下: UPDATE info1 t1 JOIN info2 ...