neekitit
neekitit

Reputation: 61

Get the leaves of every node in Node4J

So For example take this data which is stored in csv file:

source,child
A,B
B,C
C,D
X,Y
Y,Z

And i load it like this:

LOAD CSV WITH HEADERS FROM 'file:///data.csv' AS line 
MERGE (s:src {id: line.source}) 
MERGE (d:dst {id: line.child}) 
CREATE (s)-[:FEEDs_INTO]->(d)

In my example we have 2 leaves - A and X, but there may be multiple leaves for one node. Now I want to get every leaf-node connection. So for my example I want something like this:

A,B
A,C
A,D
X,Y
X,Z

How Can i do it ?

Upvotes: 0

Views: 317

Answers (1)

jose_bacoy
jose_bacoy

Reputation: 12684

Your data model can be improved further. Since src and dst are connected, then you can label them in one class (let say, label it as "node"). Thus your loading script can be as follows:

LOAD CSV WITH HEADERS FROM 'file:///data.csv' AS line 
MERGE (s:node {id: line.source})
MERGE (d:node {id: line.child}) 
MERGE (s)-[:FEEDs_INTO]->(d)

Then your query will be as simple as below:

MATCH (child:node)-[:FEEDs_INTO*]->(parent:node)
WHERE NOT EXISTS((:node)-->(child)) 
RETURN child, parent 

where the * in the relationship means the path may vary from 1 to a length of maximum x. This is like you want to jump from A to B (length: 1) to C (length: 2) then to D (length: 3) and so on. The where clause makes sure that the child is a leaf without a node attached to it.

 Result:
╒══════════╤══════════╕
│"child"   │"parent"  │
╞══════════╪══════════╡
│{"id":"A"}│{"id":"B"}│
├──────────┼──────────┤
│{"id":"A"}│{"id":"C"}│
├──────────┼──────────┤
│{"id":"A"}│{"id":"D"}│
├──────────┼──────────┤
│{"id":"X"}│{"id":"Y"}│
├──────────┼──────────┤
│{"id":"X"}│{"id":"Z"}│
└──────────┴──────────┘

Upvotes: 1

Related Questions