cancel
Showing results for 
Search instead for 
Did you mean: 

A small question about cypher semantics

czp
Node Link

How should I understand the semantics of these cypher statements. Why the first and second statements have no results and the third statement outputs a line of results?

neo4j@neo4j> with 3 as c1 match (v:nonexist) return count(v) as c2, c1;
+---------+
| c2 | c1 |
+---------+
+---------+

0 rows available after 65 ms, consumed after another 17 ms
neo4j@neo4j> with 3 as c1 match (v:nonexist) return c1;
+----+
| c1 |
+----+
+----+

0 rows available after 41 ms, consumed after another 0 ms
neo4j@neo4j> with 3 as c1 match (v:nonexist) return count(v) as c2;
+----+
| c2 |
+----+
| 0 |
+----+


neo4j@neo4j> match (v:nonexist) return count(v) as c2;
+----+
| c2 |
+----+
| 0 |
+----+

 

1 ACCEPTED SOLUTION

glilienfield
Ninja
Ninja

A neo4j query produces rows of data for a single match. The way 'with' works is its variable is added to each row of the 'match' result. For example, 'with 3 as c1 match(n) return *', would result in rows as follows (assuming there is a match):

c1, n

3, first instance of n

3, second instance of n

etc. 

Based on above, this is how I view each of your questions. 

1. when 'with c1 match(v:nonexist)' produces a null result, you get a empty result since you are returning something from the result set (c1). 

2. Same reason as #1

3 & 4. These differ from #1 and #2, since you are not requesting something returned from the row data, only the aggregate count of the rows is returned, which is zero for the null rows result. 

View solution in original post

2 REPLIES 2

glilienfield
Ninja
Ninja

A neo4j query produces rows of data for a single match. The way 'with' works is its variable is added to each row of the 'match' result. For example, 'with 3 as c1 match(n) return *', would result in rows as follows (assuming there is a match):

c1, n

3, first instance of n

3, second instance of n

etc. 

Based on above, this is how I view each of your questions. 

1. when 'with c1 match(v:nonexist)' produces a null result, you get a empty result since you are returning something from the result set (c1). 

2. Same reason as #1

3 & 4. These differ from #1 and #2, since you are not requesting something returned from the row data, only the aggregate count of the rows is returned, which is zero for the null rows result. 

@glilienfield Very clear answer! thanks a lot for the reply.

Nodes 2022
Nodes
NODES 2022, Neo4j Online Education Summit

On November 16 and 17 for 24 hours across all timezones, you’ll learn about best practices for beginners and experts alike.