我正在使用Spring data neo4j 2.1.0.BUILD-SNAPSHOT和Neo4j 1.6.1服务器。
我有两个用户节点之间的Friendship关系,并且我想确保每个user1、user2对只创建一个关系(顺序不重要)。
通常建议在创建另一个关系之前,在应用程序级别检查是否已存在关系,但我认为这不能避免并发问题:约束应该在数据库级别上进行管理。
我能想到的最好的解决方案是使用Neo4j 1.6中引入的带有唯一属性的@Indexed注释,并基于user1和user2 id创建唯一约束,例如:
顺便说一下,我知道Spring data neo4j的最新版本支持使用Neo4jTemplate.getOrCreateNode()在节点上执行此检查,但我不确定它是否适用于关系。但是REST API应该可以实现。参见唯一关系。
所以我有两个问题:
1. 有更好的替代方案吗?
2. 我应该担心这个并发问题吗?即使在高流量网站上,应用程序级别的检查是否足够?我问这个问题是因为我觉得这是一个非常普遍的问题,但关于Neo4j的这个问题很少。也许嵌入式版本受到的影响较小。
谢谢
通常建议在创建另一个关系之前,在应用程序级别检查是否已存在关系,但我认为这不能避免并发问题:约束应该在数据库级别上进行管理。
我能想到的最好的解决方案是使用Neo4j 1.6中引入的带有唯一属性的@Indexed注释,并基于user1和user2 id创建唯一约束,例如:
@Indexed(unique = true)
private String uniqueConstraint;
public String getUniqueConstraint(){
if(user1.id > user2.id){
return user1.id + "|" + user2.id;
}
return user2.id + "|" + user1.id;
}
顺便说一下,我知道Spring data neo4j的最新版本支持使用Neo4jTemplate.getOrCreateNode()在节点上执行此检查,但我不确定它是否适用于关系。但是REST API应该可以实现。参见唯一关系。
所以我有两个问题:
1. 有更好的替代方案吗?
2. 我应该担心这个并发问题吗?即使在高流量网站上,应用程序级别的检查是否足够?我问这个问题是因为我觉得这是一个非常普遍的问题,但关于Neo4j的这个问题很少。也许嵌入式版本受到的影响较小。
谢谢