Neo4j Spring Data动态起始节点类型实现
在spring-boot里我们可以基于neo4j-spring-data,编写类似关系数据库风格的JPA操作,实现对neo4j数据的CURD。研究neo4j-spring-data底层API的实现发现,本质上还是将JPA的操作翻译为cypher的语句,并基于neo4j的bolt的协议将操作语句发送至远程的数据库服务器来执行,anyway,这块我们不进一步展开了,我们来看看怎么利用neo4j-spring-data的API高效地实现工程化模型。
neo4j-spring-data创建节点和关系
我们利用Neo4j建模的时候,经常会发现,同样的Relationship
里,可能连接的节点是不一样的,比如OWN
(拥有)这样的关系,比如:
用户拥有手机:User
-[OWN
]->Phone
用户拥有银行卡:User
-[OWN
]->Card
在neo4j-spring-data中,主要有2种形式来创建节点和节点之间的关系。
基于NodeEntity
这里我们简单举一个简单例子:User
-[OWN
]->Phone
1. 定义好@NodeEntity
,任何被@NodeEntity
的POJO将会被作为neo4j的一个节点类型处理;
2. 定义好对应的Repository
;
模型定义:
//所有关系标签常量
//这里使用了interface成员变量是常量的特性,比class使用static final String XX="xx"简洁
public interface RelsType {
String OWN = "OWN";
String HAVE = "HAVE";
}
@Data
@NodeEntity
public class User {
@Id
@GeneratedValue
private Long id;
private String name;
/**
* 一对多的关系
*/
@Relationship(type = RelsType.OWN, direction = Relationship.OUTGOING)
private List<Phone> phones;
}
@Data
@NodeEntity
public class Phone {
@Id
@GeneratedValue
private Long id;
private String phoneNo;
/**
* 一对多的关系
*/
@Relationship(type = RelsType.OWN, direction = Relationship.INCOMING)
private List<User> users;
}
定义好对应的Repository:
public interface UserRepository extends Neo4jRepository:<User, Long> {
}
注意:从4.2版本之后,API做了修改GraphRepository改为Neo4jRepository,参数也不一样,如果看到之前的博客的代码,请注意修改。
Base class for repositories GraphRepository has been renamed Neo4jRepository and parameter types change from<T>
to<T, ID>
总结要点:
- POJO中的属性将作为
Node
的properties @Relationship
注解指定与其他节点的关系,指定关系的direction
方向,可以是一对一
,一对多
(List<>)@Id
注解的id是对应Neo4j数据的<id>
值
测试代码:
@RunWith(SpringRunner.class)
@SpringBootTest
public class Neo4jSpringDataTest {