与Neo4j强制实现关系独特性

时间:2012-03-29 11:31:03

标签: neo4j spring-data-neo4j

我正在使用Spring数据neo4j 2.1.0.BUILD-SNAPSHOT和Neo4j 1.6.1服务器。 我在两个用户节点之间有友谊关系,我想确保只为每个user1,user2对创建一个关系(订单不计算)。

常见的建议是在创建另一个关系之前检查应用程序级别是否已存在关系,但我认为这不会避免并发问题:应该在数据库级别管理约束。

我能想到的最好的解决方案是使用@Indexed注释和Neo4j 1.6中引入的唯一属性,并根据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;
}

BTW我知道最新版本的Spring数据neo4j支持使用Neo4jTemplate.getOrCreateNode()对节点进行检查,但我不确定它是否适用于Relationships。其余的API应该在那里。 Unique relationship

所以我有两个问题:

1还有更好的选择吗?

2我是否应该受到这种并发性问题的困扰,或者即使在高流量站点也不太可能发生不良事件,并且应用程序级别的检查应该足够了?我问,因为在我看来这是一个非常普遍的问题,但Neo4j几乎没有这个问题。也许嵌入式版本受此影响较小。

由于

1 个答案:

答案 0 :(得分:3)

在SDN中,在两个节点之间建立关系的常用方法已经确保它们之间只有一种类型的关系(通过预先检查)。

它尚未利用Neo4j中的唯一性支持。

是的,使用REST-Server,这种方法可能会遇到并发/竞争条件。

嵌入式版本支持锁定(例如,在2个节点中的一个节点上 - 或两者),然后在适当的位置创建与该锁定的关系。所以没有第二个线程同时做同样的事情。

如果你乐观地做,那可能没问题。即创建后检查并在之后删除。您还可以直接利用REST-API来支持该行为。我们可能会在SDN 2.1中添加对SDN 2.1的支持你可以在http://spring.neo4j.org/issues提出问题(链接到这篇文章)吗?