私の neo4j グラフの一部は、オブジェクト、その値、およびそれらの値に関連付けられた属性を表しています。一般的なプログラミング構文を使用するために、次の結果のようなものを永続化しています。
Object.Attribute = Value
ここで、オブジェクト、属性、および値はすべてノードであり、次のように VALUE および ATTRIBUTE 関係によってリンクされています。
Object-[:VALUE]->Value-[:ATTRIBUTE]->Attribute
これを特定の例で説明すると、このコードの結果は次のようになります。
Object.Colour = 'Red'
次のように永続化されます。
Object-[:VALUE]->(Value { value:'Red' })-[:ATTRIBUTE]->(Attribute { name:'Colour' })
上記のように永続化された状態を変更したい場合に問題が発生し、既存の属性 (そして理想的には値) ノードを再利用したい場合 - つまり、属性 { name: 'Colour' } ノード、各 Value ノード インスタンスに関連する単一のインスタンスが必要です。
次の Cypher クエリは、同一のノードが既に存在するかどうかに関係なく、毎回新しい値ノードと属性ノードを作成します。
start o=node(something)
create unique o-[:VALUE]->(v {value:'Green'})-[:ATTRIBUTE]->(a {name:'Colour'})
return v;
以下は、明らかに値ノードと属性ノードの両方をリサイクルしますが、もちろん、必要な属性が存在しない場合 (つまり、初めて使用される場合) は機能しません。
start o=node(something), a=node(something)
create unique o-[:VALUE]->(v {value:'Green'})-[:ATTRIBUTE]->a
where a.name = 'Colour'
return v;
ドキュメント内の「一意の作成は常にグラフの変更を最小限に抑えます — 既存のグラフの一部を使用できる場合はそうなるでしょう」という記述は、完全に真実ではないようで、その理由がわかりません。私のクエリはこの動作を示しません。
後者のクエリの「リサイクル」効果を、前者のように必要なときに属性 (および値) のオンデマンド作成と組み合わせるにはどうすればよいですか?