使用Neo4j实现关系唯一性约束

3
我正在使用Spring data neo4j 2.1.0.BUILD-SNAPSHOT和Neo4j 1.6.1服务器。 我有两个用户节点之间的Friendship关系,并且我想确保每个user1、user2对只创建一个关系(顺序不重要)。
通常建议在创建另一个关系之前,在应用程序级别检查是否已存在关系,但我认为这不能避免并发问题:约束应该在数据库级别上进行管理。
我能想到的最好的解决方案是使用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的这个问题很少。也许嵌入式版本受到的影响较小。
谢谢
1个回答

3
通常,在SDN中,两个节点之间的关系已经确保它们之间只有一种类型的关系(通过事先检查)。
它还没有利用Neo4j中的唯一性支持。
是的,使用REST服务器可能会遇到并发/竞争条件。
嵌入式版本支持锁定(例如,在2个节点中的一个或两个上)然后创建具有该锁定的关系。这样就不会有第二个线程同时执行相同的操作。
如果你乐观地进行检查,这可能是可以的。即在创建后进行检查,然后删除。您也可以直接利用REST-API来支持该行为。我们可能会在SDN 2.1中添加对此的支持,您可以提出问题(链接到此帖子)http://spring.neo4j.org/issues

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接