Neo4j Eager and Optional Match Issues

140 views Asked by At

When I try to execute the following query (to create a relationship between teachers and students), I see an eager pop up in the profile:

USING PERIODIC COMMIT 10000
LOAD CSV WITH HEADERS FROM "file:/AFile" as line
WITH line
MATCH (teacher:Teacher {ValueOne: toInt(line.ValueOne)})
MATCH (bully:Bully { Value2:toInt(line.ValueTwo)})
MATCH (bully)-[:LOVES]->(student:Student)
CREATE (student)<-[:HELPS]-(teacher)
;

The result of a profile looks like:

  • Empty Result
  • Update Graph
  • Eager
  • Filter(0)
  • SimplePatternMatcher
  • SchemaIndex(0)
  • SchemaIndex(1)
  • ColumnFilter
  • Filter(1)
  • Extract
  • Slice
  • LoadCSV

Someone recommended optional matches here, which I attempted to do on the last match:

OPTIONAL MATCH (bully)-[:LOVES]->(student:Student)
WHERE student IS NOT NULL

This resulted in the error:

Other node is null.

I also tried limiting the student match to return only a single student, but this didn't work either. However, I don't think I'm doing it correctly, where I add WITH student LIMIT 1.

Does anyone have recommendations for how to reduce the number of eagers? Without the create at the end, I don't get an eager, and with it I do.

Following Stefan's suggestion, I'm no longer getting an eager, but I am getting the "Other node is null" error.

  • Empty Result
  • UpdateGraph
  • Optional Match
  • SchemaIndex(0)
  • SchemaIndex(1)
  • Slice
  • ColumnFilter
  • Filter(0)
  • Extract
  • LoadCSV
  • Filter(1)
  • SimplePatternMatcher
  • Argument
1

There are 1 answers

4
Stefan Armbruster On

At least in 2.2.2 the following seems not to have an eager:

USING PERIODIC COMMIT 10000
LOAD CSV WITH HEADERS FROM "file:/AFile" as line
WITH line
MATCH (teacher:Teacher {ValueOne: toInt(line.ValueOne)})
MATCH (bully:Bully { Value2:toInt(line.ValueTwo)})
OPTIONAL MATCH (bully)-[:LOVES]->(student)
WHERE student IS NOT NULL and "Student" in labels(student)
MERGE (student)<-[:HELPS]-(teacher)

The error "other node is null" seems to pop up when doing an optional match with a label on the other end.