2

私は、Neo4j Milestone 2.0.0-M03 で学習しようとしている初心者の Neo4j ユーザーです。ノードが保持するプロパティによってではなく、それらが持つ関係によって、一意のノードを作成しようとしています。

次を使用してデータベースを作成します。

MERGE (p:Person { name : 'Bill' })
MERGE (p:Person { name : 'Ben' })
MERGE (p:Person { name : 'Bob' })

次に、Bill と Ben をメンバーとする「チーム」を作成します。

MATCH bill:Person, ben:Person  
WHERE bill.name='Bill' AND ben.name='Ben' 
CREATE UNIQUE t:Team-[:HAS_MEMBER]->bill, t:Team-[:HAS_MEMBER]->ben

次に、Bill と Bob のメンバーで 2 番目のチームを作成したいと思いますが、上記と同じことを行います。

MATCH bill:Person, bob:Person  
WHERE bill.name='Bill' AND bob.name='Bob' 
CREATE UNIQUE t:Team-[:HAS_MEMBER]->bill, t:Team-[:HAS_MEMBER]->bob

これにより、Bob を既存のチームに追加するという最小限の変更が行われます。このように、Bill、Ben、および Bob を含む 1 つのチームがありますが、メンバーが一意である 2 つのチームが必要です。

「CREATE UNIQUE」のセマンティクスを考えると、これは正しいと思います。残念ながら、メンバーによって一意に識別される 2 番目のチーム ノードを作成するための正しいステートメントがわかりません。

チームを区別するプロパティをチームに配置したくありません。チーム ノードは、プロパティではなく、関係によって一意に識別されるようにしたいと考えています。

HAS_MEMBERが存在しない場合にのみ、チームと個人の間に存在する二重関係「OMITS_MEMBER」を作成できます。これにより、望ましくないデータベースの制約が追加されるようです。

この種のことをグラフ理論の数学でチーム プロパティや双対関係なしで表現できることを考えると、Neo4j を開発している賢い人々はそれを行う方法を持っていると確信しています。私はそれを理解するのに苦労しています。

4

3 に答える 3

0

必要な各チームはノードであるため、プログラムのある時点でこれらを追跡する必要があります。プロパティのないチームを持つことに固執している場合でも、それらにはまだノード ID があります。したがって、次のように動作するはずです。

  • チームを作成し、そのノード ID を取得します (5 を返すとします)。

    CREATE (t:Team) RETURN ID(t)
    
  • 次に、メンバーをチームに追加します

    START t=node(5)
    MATCH bill:Person, ben:Person
    WHERE bill.name='Bill' AND ben.name='Ben' 
    CREATE t-[:HAS_MEMBER]->bill, t-[:HAS_MEMBER]->ben
    

ステートメントを使用してこれらの呼び出しを組み合わせることもできると思いますがWITH、試していません。

于 2013-06-29T12:56:12.110 に答える
0

おそらく一意をドロップしますが、作成されるチームが自分で一意になるかどうかを確認しますか? それらの線に沿った何か:

MATCH bill:Person, bob:Person
WHERE bill.name='Bill' AND bob.name='Bob' 
and not bill-[:HAS_MEMBER*2]-bob
CREATE t2:Team-[:HAS_MEMBER]->bill, t2:Team-[:HAS_MEMBER]->bob

もちろん、これはほぼ確実にすべてのケースをカバーするわけではなく、コーディングするのが難しいかもしれません

于 2013-06-27T17:30:55.460 に答える