0
votes

For example, I created two linked nodes:

create (a:ACTOR {id: "a1", name: "bruce wellis"})
create (m:MOVIE {id: "m1", title: "die hardest"})
create (a)-[:ACTED_IN]->(m)

1. From this cypher query:

match (a:ACTOR {id: "a1"})
with a
optional match (m:MOVIE {id: "m1"})
set m += {
    title: "die easier"
}
return a;

I can have result:

+-----------------------------------------+
| a                                       |
+-----------------------------------------+
| Node[1000]{name:"bruce wellis",id:"a1"} |
+-----------------------------------------+
1 row
Properties set: 1

The query successfully returned the actor node.

2. (UPDATED) But if you make the match MOVIE subquery failed:

match (a:ACTOR {id: "a1"})
with a
optional match (m:MOVIE {id: "mm"})
set m += {
    title: "die easier"
}
return a;

I got error:

CypherTypeException: Expected m to be a node or a relationship, but it was :`null`. 

How to make the second query returning matched actor result?

1

1 Answers

3
votes

A MATCH that fails to match anything will always return no rows.

So, in #2, since the second MATCH failed, it returns no rows.

You could use OPTIONAL MATCH in place of the second MATCH, and you should see results.

[EDITED] For the Updated question, this (somewhat ugly) workaround should work:

MATCH (a:ACTOR {id: "a1"})
WITH a
OPTIONAL MATCH (m:MOVIE {id: "mm"})
WITH a, COLLECT(m) AS cm
FOREACH(m IN cm | SET m += {title: "die easier"})
RETURN a;