0.背景
因json文件、mysql、mongo存储都不能方便的满足我的要求,计划后续使用图数据库来存储复杂的的图状关系
1.安装
看了一眼dockerhub有现成的镜像,直接选了最新的
0 1 2 3 4 |
docker run -d \ --publish=7474:7474 --publish=7687:7687 \ --volume=/data/neo4j/data:/data \ neo4j:5.5.0-community |
7474是web端浏览器的端口,7687是数据库本身的端口。启动后默认用户名密码都是neo4j,记得修改密码。这里测试,因此用弱密码12345678
2.使用
2.1.基本语法
node节点
0 1 2 3 4 |
() //匿名的节点,不包含标签和变量,可以代表数据库的任意节点 (p:Person) //使用变量p和标签Person (:Technology) //没有变量,标签Technology (work:Company) //使用变量work和标签Company |
relationship关系
0 1 2 3 4 5 6 7 8 9 10 11 12 |
//按这个方向存储数据 CREATE (p:Person)-[:LIKES]->(t:Technology) //反向查询关系不会返回任何结果 MATCH (p:Person)<-[:LIKES]-(t:Technology) //如果不确定方向,可以不执行关系的方向来查询 MATCH (p:Person)-[:LIKES]-(t:Technology) //关系也可以用变量 -[rel]-> -[rel:LIKES]-> |
properties属性
0 1 2 3 |
Node的属性(p:Person {name: 'Sally'}) Relationship的属性: -[rel:IS_FRIENDS_WITH {since: 2018}]-> |
好了,你已经学会基本的语法了,是时候设计一个复杂的项目了(
3.集成到java中
尝试 spring-boot 3 + neo4j ORM
3.1.修改pom.xml
0 1 2 3 4 |
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-neo4j</artifactId> </dependency> |
3.2.entity类
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
import lombok.Data; import org.springframework.data.annotation.CreatedDate; import org.springframework.data.annotation.LastModifiedDate; import org.springframework.data.neo4j.core.schema.*; import org.springframework.data.neo4j.core.schema.Relationship.Direction; import org.springframework.data.neo4j.core.support.UUIDStringGenerator; import java.util.ArrayList; import java.util.List; @Data @Node("LabelName") public class SomeNodeEntity { @Id @GeneratedValue(generatorClass = UUIDStringGenerator.class) private String id; @Property("title") private String title; @Property("description") private String description; @CreatedDate //need @EnableNeo4jAuditing private Long createdAt; @LastModifiedDate //need @EnableNeo4jAuditing private Long updatedAt; @Relationship(type = "DIRECTED", direction = Direction.INCOMING) private List<OtherNodeEntity> directors = new ArrayList<>(); } |
3.3 repo类
0 1 2 3 4 5 6 7 8 |
package cn.hylstudio.skykoma.data.collector.repo.neo4j; import cn.hylstudio.skykoma.data.collector.entity.neo4j.MovieEntity; import org.springframework.data.neo4j.repository.Neo4jRepository; public interface MovieEntityRepo extends Neo4jRepository<MovieEntity, String> { MovieEntity findByTitle(String title); } |
注意:关系字段中,如果实体不存在则会自动创建Node,但如果修改实体导致数据减少,OGM不会删除关联的实体,只会删除关系
参考
https://docs.spring.io/spring-data/neo4j/docs/current/reference/html/#preface
https://neo4j.com/docs/getting-started/current/get-started-with-neo4j/
https://neo4j.com/docs/browser-manual/current/
https://www.w3cschool.cn/neo4j/neo4j_cql_introduction.html
0 Comments