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
- 导入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})