0

私の 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;

ドキュメント内の「一意の作成は常にグラフの変更を最小限に抑えます — 既存のグラフの一部を使用できる場合はそうなるでしょう」という記述は、完全に真実ではないようで、その理由がわかりません。私のクエリはこの動作を示しません。

後者のクエリの「リサイクル」効果を、前者のように必要なときに属性 (および値) のオンデマンド作成と組み合わせるにはどうすればよいですか?

4

1 に答える 1

0

最初の問題は、プロパティ グラフ内にプロパティ グラフを作成していることです。それは可能ですが、扱いにくく、常に良い選択とは限りません。

あなたの例: http://console.neo4j.org/r/evl77k

理解が正しければ、値ノードを変更して同じ属性ノードを再利用できるようにしたいと思うでしょう。

問題は、2 番目のクエリで、グラフに既にあるものとは異なるプロパティを持つ値ノードを見つけるように Cypher に依頼することです。Cypher はそのようなノードを見つけることができないため、ノードを作成します。次に、新しく作成されたノードから発信 ATTRIBUTE リレーションシップを見つけようとしますが、もちろん何も見つかりません。したがって、新しい関係と属性が作成されます。

同じ属性ノードを使用し続ける場合は、次のように値ノードからプロパティ値を省略します。

START  o=node(0) 
CREATE UNIQUE o-[:VALUE]->(v)-[:ATTRIBUTE]->(a {name:'Colour'}) 
SET    v.value = 'Green' 
RETURN v

これにより、毎回新しいパスを作成する代わりに、カラー アトリビュート ノードが検出され、プロパティが設定されます。

理にかなっていますか?

アンドレス

于 2012-11-28T11:25:32.413 に答える