web-dev-qa-db-ja.com

作成されていない場合、ノードが存在するかどうかを確認します

データベースを作成しようとすると、ノードが存在しない場合は常に新しいノードが作成され、このノードと別のノードの間に関係が設定されます。ノードが存在する場合、両方のノードが関係を取得します。

私の問題は、2つの既存のノードを接続しようとすると、2番目のノードが再作成されることです。 MERGEとCREATE UNIQUEを試してみましたが、どちらも機能しませんでした。

私の例のコード:

CREATE (test1 name:'1'})
MATCH (n)
WHERE n.name = '1'
MERGE (n)-[:know {r:'123'}]->(test3 {name:'3'})

MATCH (n)
WHERE n.name = '1'
MERGE (n)-[:know {r:'123'}]->(test2 {name:'2'})

ここまでは機能しますが、

MATCH (n)
WHERE n.name = '3'
MERGE (n)-[:know {r:'123'}]->(test2 {name:'2'})

存在するノードに接続する代わりに、新しいノード「2」を作成します。

23
Kapotth

完全なパターンでMERGEを使用する場合、動作はパターン全体が一致するか、パターン全体が作成されるかのどちらかです。 MERGEは既存のパターンを部分的に使用しません—それはすべてかゼロかです。部分一致が必要な場合は、パターンを複数のMERGE句に分割することで実現できます。http://docs.neo4j.org/chunked/stable/query-merge .html

MERGE (n)-[:know {r:'123'}]->(test2 {name:'2'})はパターン全体に一致しようとしますが、パターンが存在しないため作成します。あなたができることは:

MERGE (n {name: '3'}) //Create if a node with name='3' does not exist else match it
MERGE (test2 {name:'2'}) //Create if a node with name='2' does not exist else match it
MERGE (n)-[:know {r:'123'}]->(test2) //Create the relation between these nodes if it does not already exist
35
Luanne