我想在neo4j中创建一个关系,其中Person有一个朋友列表。我可以使用spring-data以两种方式执行此操作。
a)创建一个具有List的类Person,重复发送朋友,并使用@Relationship注释相同的内容。
@NodeEntity(label="Person")
public class Person {
@GraphId
private Long id;
private String firstName;
private String lastName;
private String email;
@Relationship(type = "FRIEND_WITH")
List<Person> friends;
}
b)创建没有任何List的Person对象,并与Cypher建立“FRIEND_WITH”关系
@Query "CREATE (a)-[FRIEND_WITH]->(b)"
这两种方法的优点/缺点是什么?
答案 0 :(得分:2)
只要有可能,您应该使用代码管理域模型中的实体和关系,而不是查询。在代码中执行此操作的优点是您的域对象和图形将保持同步。 SDN使用的基础对象图形映射器无法理解您的查询正在执行的操作,因此无法对您的域模型进行任何更改。这意味着每次使用查询改变数据库时,您可能需要重新加载所有对象。
答案 1 :(得分:1)
我正在添加第二个答案,因为我无法在评论中格式化代码,但是这样的东西可以开箱即用,并且不需要任何查询。
public class Person {
private Long id;
private String name;
@Relationship(type="FOLLOWS", direction = "OUTGOING")
private Set<Person> followees = new HashSet<>();
@Relationship(type="FOLLOWS", direction = "INCOMING")
private Set<Person> followers = new HashSet<>();
public void follow(Person p) {
this.followees.add(p);
p.followers.add(this);
}
public void unfollow(Person p) {
this.followees.remove(p);
p.followers.remove(this);
}
}