Ronak
Ronak

Reputation: 391

Node creation using cypher Foreach

I have 2 csv files and their sructure is as follows:

1.csv
id name age
1  aa   23
2  bb   24

2.csv
id product location
1  apple   CA
2  samsung PA
1  HTC     AR
2  philips CA
3  sony    AR

// 1.csv
LOAD CSV WITH HEADERS FROM "file:///G:/1.csv" AS csvLine
CREATE (a:first { id: toInt(csvLine.id), name: csvLine.name, age: csvLine.age})

// 2.csv
LOAD CSV WITH HEADERS FROM "file:///G:/2.csv" AS csvLine
CREATE (b:second { id: toInt(csvLine.id), product: csvLine.product, location: csvLine.location})    

Now i want to create another node called "third", using the following cypher query.

LOAD CSV WITH HEADERS FROM "file:///G:/1.csv" AS csvLine
MATCH c = (a:first), d = (b.second)
FOREACH (n IN nodes(c) | 
CREATE (e:third)
SET e.name = label(a) + label(b) + "id"
SET e.origin = label(a)
SET e.destination = label(b)
SET e.param = a.id)

But the above query give me duplicate entries. I think here it runs 2 time after the load. Please suggest or any alternative way for this.

Upvotes: 1

Views: 1037

Answers (2)

Michael Hunger
Michael Hunger

Reputation: 41676

You don't use csvLine at all for matching the :first and :second node!

So your query doesn't make sense

This doesn't make sense either:

MATCH c = (a:first), d = (b.second)
FOREACH (n IN nodes(c) | 
CREATE (e:third)

c are paths with a single node, i.e. (a) so instead of the foreach you would use a directly instead

Upvotes: 1

FrobberOfBits
FrobberOfBits

Reputation: 18002

CREATE always creates, even if something is already there. So that's why you're getting duplicates. You probably want MERGE which only creates an item if it doesn't already exist.

I wouldn't ever do CREATE (e:third) or MERGE (e:third) because without specifying properties, you'll end up with duplicates anyway. I'd change this:

CREATE (e:third)
SET e.name = label(a) + label(b) + "id"
SET e.origin = label(a)
SET e.destination = label(b)
SET e.param = a.id)

To this:

MERGE (e:third { name: label(a) + label(b) + "id",
                 origin: label(a), 
                 destination: label(b),
                 param: a.id })                  

This then would create the same node when necessary, but avoid creating duplicates with all the same property values.

Here's the documentation on MERGE

Upvotes: 3

Related Questions