1
votes

Apologies as I am new to neo4j and struggling with what I imagine is a very simple example.

I would like to model an org chart which I have stored as a csv like so

id,name,manager_id
1,allan,2
2,bob,4
3,john,2
4,sam,
5,Jim,2

Note that Bob has 3 direct reports and Bob reports into Sam who doesn't report into anyone.

I would like to produce a graph which shows the management chain. I have tried the following, but it produces relationships which are disjoint from the people:

LOAD CSV WITH HEADERS FROM "file///employees.csv" AS csvLine
CREATE (p:Person {id: csvLine.id, name: csvLine.name})
CREATE (p)-[:MANAGED_BY {manager: csvLine.manager_id}]->(p)

This query creates a bunch of self-referencing relationships. Is there anyway to populate the graph with one command over the single csv? I must be missing something and any help is appreciated. Thanks

1

1 Answers

1
votes

I think this is what you are looking for.

In your query tou are creating a relationship between p and p thus the self referencing relationships.

I added a coalesce statement to deal with people that do not have a manager_id value. THis way Sam can report to himself.

LOAD CSV WITH HEADERS FROM "file:///employees.csv" AS csvLine
// create or match the person in the left column
MERGE (p:Person {id: csvLine.id })

// if they are created then assign their name
ON CREATE SET p.name = csvLine.name

// create or match the person/manager in the right column
MERGE (p1:Person {id: coalesce(csvLine.manager_id, csvLine.id) })

// create the reporting relationship
CREATE (p)-[:MANAGED_BY]->(p1)