私は、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 を開発している賢い人々はそれを行う方法を持っていると確信しています。私はそれを理解するのに苦労しています。