I am having 2 node types lets say of type 'Student' and 'Teacher'
Student have {id, name}.
Teacher have {id, name}.
Student can have optional relationship with Class node as 'TEACHES'.
(t:Teacher)-[r:TEACHES]->(c:Student).
[r:TEACHES] - Optional relationship. (present or may not present)
I want to find "Student" nodes who don't have teacher. i.e There is no any incoming relationship "TEACHES"
Please help.
I think you're looking for this sort of pattern.
MATCH (s:Student)
WHERE NOT (s)<-[:TEACHES]-(:Teacher)
RETURN s
Here's a simple data setup, along with the query at the bottom you need to solve your problem. Essentially, you want to query for situations where a relationship doesn't exist. The syntax here is for neo4j 2.0, so the answer would be slightly different for older versions.
neo4j-sh (?)$ create (t:Teacher {name:"Bob"})-[r:TEACHES]->(s:Student {name:"Mary"});
+-------------------+
| No data returned. |
+-------------------+
Nodes created: 2
Relationships created: 1
Properties set: 2
Labels added: 2
19 ms
neo4j-sh (?)$ create (t:Teacher {name:"Mark"});
+-------------------+
| No data returned. |
+-------------------+
Nodes created: 1
Properties set: 1
Labels added: 1
5 ms
neo4j-sh (?)$ MATCH (s:Student) WHERE NOT (s)<-[:TEACHES]-(:Teacher) RETURN s
I got result by this. First match student criteria and then find relationship is null
MATCH (s:Student)
OPTIONAL MATCH (t:Teacher)-[r:TEACHES]->(s)
WITH s,r
WHERE r IS NULL
RETURN s.name
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With