2

Spring データ neo4j 2.1.0.BUILD-SNAPSHOT および Neo4j 1.6.1 サーバーを使用しています。2 つのユーザー ノード間にフレンドシップ関係があり、ユーザー 1 とユーザー 2 のペアごとに 1 つの関係のみが作成されるようにしたいと考えています (順序はカウントされません)。

一般的な提案は、別の関係を作成する前に関係が既に存在するかどうかをアプリケーション レベルで確認することですが、それでは同時実行性の問題を回避できないと思います。制約はデータベース レベルで管理する必要があります。

私が考えることができる最善の解決策は、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 データ neo4j の最新リリースが Neo4jTemplate.getOrCreateNode() を使用してノードでこのチェックをサポートしていることは知っていますが、リレーションシップで機能するかどうかはわかりません。ただし、残りの API はそこにあるはずです。ユニークな関係

だから私は2つの質問があります:

1 他に良い代替品はありますか?

2 この同時実行性の問題に悩まされる必要がありますか? それとも、トラフィックの多いサイトでも問題が発生する可能性は非常に低く、アプリケーション レベルでのチェックで十分なはずですか? 非常に一般的な問題のように思われるので質問しますが、Neo4j ではこれについてはほとんどありません。おそらく、組み込みバージョンはこれによる影響が少ないでしょう。

ありがとう

4

1 に答える 1

3

2 つのノード間に関係を持たせるという SDN の通常のアプローチでは、それらの間に 1 つのタイプの関係が 1 つだけ存在することが既に保証されています (事前に確認することにより)。

そのために、Neo4j の一意性サポートをまだ活用していません。

はい、REST-Server を使用すると、このアプローチは同時実行/競合状態に陥る可能性があります。

組み込みバージョンは、ロック (たとえば、2 つのノードのいずれか、または両方) をサポートし、そのロックを使用して関係を作成します。同じことを同時に行う 2 番目のスレッドがないようにします。

楽観的にやれば大丈夫です。つまり、作成後に確認し、後で削除します。REST-API を直接利用して、その動作をサポートすることもできます。おそらく SDN 2.1 までにそのサポートを追加します

于 2012-04-02T08:59:51.033 に答える