我正在使用 Spring 数据 neo4j 2.1.0.BUILD-SNAPSHOT 和 Neo4j 1.6.1 服务器。我在两个用户节点之间有一个友谊关系,我想确保为每个用户 1、用户 2 对只创建一个关系(顺序不计算在内)。
常见的建议是在创建另一个关系之前在应用程序级别检查关系是否已经存在,但我认为这并不能避免并发问题:约束应该在数据库级别进行管理。
我能想到的最佳解决方案是使用带有 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() 对节点进行此检查,但我不确定它是否适用于关系。其余的 API 应该在那里。独特的关系
所以我有两个问题:
1 有没有更好的选择?
2 我是否应该被这个并发问题所困扰,或者即使在高流量站点中也不太可能发生坏事并且应用程序级别的检查就足够了?我问是因为在我看来这是一个非常普遍的问题,但是 Neo4j 几乎没有关于这个问题。也许嵌入式版本受此影响较小。
谢谢