2016-12-31 24 views
2

ノードが2つありますPersonノードがあります。neo4j - MERGEが重複するノードを作成します

(p:Person {Name: 'Anthony'}) 
(p:Person {Name: 'Jason'}) 

必須の関係は次のとおりです。

(p:Person)-[KNOWS]-(s:Skill) //s is dynamically entered 

これを達成するために、私は、クエリを使用:

MATCH (p:Person) 
WHERE p.Name='Anthony' 
MERGE(p)-[r:KNOWS{Weight:83}]-(x:Skill {Name:"WordPress"}) 

しかし、私は再びそれをしようとした場合:

MATCH (p:Person) 
WHERE p.Name='Jason' 
MERGE(p)-[r:KNOWS{Weight:80}]-(x:Skill {Name:"WordPress"}) 

ノード(s:Skill {Name: 'WordPress'})が作成された,

私はMERGEパターン全体と一致しますが、どのように私はそれが存在しない場合は、このクエリは唯一Skillノードを作成することを保証できることを理解できますか?面白いブログ記事へ

答えて

1

ありがとう:ここにa linkです!他の回答に興味がまだ

MATCH (p: Person) 
WHERE p.Name='Jason' 
MERGE (s:Skill {Name: 'Wordpress'}) 
CREATE UNIQUE (p)-[r:KNOWS {Weight:80}]-(s) 
RETURN (r) 

は、私は解決策があることが判明しました! :)

3

あなたのMERGEは、あなたが含まれている値を含め、パターン全体を探していることに注意してください。 :KNOWS関係と異なる重みプロパティでMERGEを試みたとき、そのようなプロパティとの関係を見つけることができなかったので、パターン全体が作成されました。スキルすでにグラフで:既存があった場合でも、スキルノードパターンが作成されるときに作成されている:あなたは新しいが、発見されたとして

そのクエリと他の問題がありました。あなたが発見したように、あなたはパターンをマージする前に、まずスキルだけでMERGEを実行する必要があります。新しいプロパティ値を扱うためのよう

、それはあなたが(MERGEでプロパティを除く)のパターンをMERGE後に行わ最善です。例えば

:また

MATCH (p: Person) 
WHERE p.Name='Jason' 
MERGE (s:Skill {Name: 'Wordpress'}) 
MERGE (p)-[r:KNOWS]-(s) 
SET r.Weight = 80 

有用な、MERGE後に代わりにCREATEと一致でそれぞれMERGEは、既存のパターンにマッチしたかどうかに応じて追加の操作(通常SET操作)を行うこと、または上で使用することができそれを作成しました。

+0

これは面白いです!私は、同じクエリでMERGEを2回実行できるとは考えていませんでした。答えをありがとう! – Arjun

3

あり、非常によくMERGEの動作を説明する別のブログ記事がある:側ノードでhttp://graphaware.com/neo4j/2014/07/31/cypher-merge-explained.html

とトレーニングをしているか、クライアントを支援したときに、私は多くの場合、これを繰り返します。MERGEは、重複を防ぐことはできません、ONLY一意性制約はありません!それがさらに困難にそれをきれいにするだから重複混乱を避けるためにのNeo4jノードとの関係を扱うとき

+0

リンクありがとう、Christophe!私は別のq(私は新しいスレッドを作成する必要があるかどうかはわかりません)を持っていますが、私はどのように正式に私のneo4jグラフを表しますか?リレーショナルデータベースでは、ER図を使用します。ここでER図を使用することをお勧めしますか? – Arjun

+1

ホワイトボードの画像はグラフのための十分な図です;-)そうでなければ矢印ツールがあります。http://www.apcjones.com/arrows/# –

+0

ありがとう!大学のプロジェクトにneo4jを使って作業し、ドキュメントのためにそれを必要とする! :) – Arjun

1

は常に(ユニーク/アサート)制約を持つことの習慣を持っています。 linkがあなたに役立つが、公式のNeo4jサイトで提供されている制約を調べるにはどうすればよいかわからない。

+0

ありがとうございます@patilav! neo4jの新機能として、このようなリンクのおかげで、データストアを作成してクエリを作成しながら、優れたプラクティスに従うことの重要性を理解しています。 – Arjun

関連する問題