Devika Awasthi
Devika Awasthi

Reputation: 17

Neo4j- Avoid multiple relationships getting created between the same nodes in cypher?

I want to restrict the relationships getting created , if already created between the existing nodes. Right now its getting created multiple times? Is there any command similar to 'merge' for restricting duplicate relationships?Thanks for any suggestion

Upvotes: 1

Views: 947

Answers (4)

user96
user96

Reputation: 180

If I understand your question, CREATE UNIQUE may be the solution you are looking for. For example:

create (a:Ex {name: 'A'})-[r:inside]->(b:Ex {name: 'B'}) return a, b, r

sets up your original (a)-[]->(b) relationship. Then to extend the relationship in the manner you proposed ....

match (a)-[:inside]->(b) where a.name = 'A' and b.name = 'B'
create unique (a)-[:inside]->(b)-[:inside]->(q:Ex {name: 'Q'})
return a, b, q

CREATE UNIQUE also works if the relationships are different:

match (a)-[:inside]->(b) where a.name = 'A' and b.name = 'B'
create unique (a)-[:inside]->(b)-[:under]->(q:Ex {name: 'Q'})
return a, b, q

Upvotes: 1

Vikrant Labde
Vikrant Labde

Reputation: 138

User MERGE instead of CREATE while creating relationships.

MERGE (Product)-[:listed_under_category]->(level3)
MERGE (level3)-[:child_of]->(level2)

Upvotes: 3

Mvde
Mvde

Reputation: 141

hey i think the mix up but i need more information. Is that merge, merges the the whole statement. so if he does not find a "match" for the whole statement the database "creates" the whole statement.

So when you type something like merge (a)-[]->(b)-[]->(q) if you already have (a)-[]->(b)

he will recreate (a)-[]->(b)-[]->(q) and you have in the db (a)-[]->(b)-[]->(q) , (a)-[]->(b)

but if you type merge (a)-[]->(b) merge(b)-[]->(q)

and you know that you have the nodes. Neo4j merge will create the relations if there are no relations. and match if there are relations

Upvotes: 1

cybersam
cybersam

Reputation: 67044

The MERGE clause also avoids duplicating relationships.

Upvotes: 0

Related Questions