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 {
@Autowired
private UserRepository userRepository;
@Test<

本文介绍了如何在Neo4j Spring Data中动态实现起始节点类型,包括基于NodeEntity和RelationshipEntity的方法,以及如何解决代码膨胀和维护性问题。通过RelationshipEntity的动态节点类型,可以减少模型的复杂性,适合OLTP系统中的复杂节点和关系操作。文章提供了一个实现动态起始节点类型的解决方案,并给出了项目源码链接。

1204

被折叠的 条评论
为什么被折叠?



