neo4j cypher Match command concatenation

前端 未结 1 1478
执念已碎
执念已碎 2020-12-19 21:57

are these two Chypher statements identical:

//first
match (a)-[r]->(b),b-[r2]->c

//second
match (a)-[r]->(b)
match b-[r2]->c
1条回答
  •  温柔的废话
    2020-12-19 22:26

    The 2 Cypher statements are NOT identical. We can show this by using the PROFILE command, which shows you how the Cypher engine would perform a query.

    In the following examples, the queries all end with RETURN a, c, since you cannot have a bare MATCH clause.

    As you can see, the first query has a NOT(r == r2) filter that the second query does not. This is because Cypher makes sure that the result of a single MATCH clause does not contain duplicate relationships.

    1. First query

      profile match (a)-[r]->(b),b-[r2]->c return a,c;
      ==> +-----------------------------------------------+
      ==> | a                     | c                     |
      ==> +-----------------------------------------------+
      ==> | Node[1]{name:"World"} | Node[0]{name:"World"} |
      ==> +-----------------------------------------------+
      ==> 1 row
      ==> 2 ms
      ==> 
      ==> Compiler CYPHER 2.3
      ==> 
      ==> Planner COST
      ==> 
      ==> Runtime INTERPRETED
      ==> 
      ==> Projection
      ==>   |
      ==>   +Filter
      ==>     |
      ==>     +Expand(All)(0)
      ==>       |
      ==>       +Expand(All)(1)
      ==>         |
      ==>         +AllNodesScan
      ==> 
      ==> +----------------+---------------+------+--------+----------------+----------------+
      ==> |       Operator | EstimatedRows | Rows | DbHits |    Identifiers |          Other |
      ==> +----------------+---------------+------+--------+----------------+----------------+
      ==> |     Projection |             1 |    1 |      0 | a, b, c, r, r2 |           a; c |
      ==> |         Filter |             1 |    1 |      0 | a, b, c, r, r2 |   NOT(r == r2) |
      ==> | Expand(All)(0) |             1 |    2 |      4 | a, b, c, r, r2 | (b)-[r2:]->(c) |
      ==> | Expand(All)(1) |             2 |    2 |      8 |        a, b, r |  (b)<-[r:]-(a) |
      ==> |   AllNodesScan |             6 |    6 |      7 |              b |                |
      ==> +----------------+---------------+------+--------+----------------+----------------+
      ==> 
      
    2. Second query

      profile match (a)-[r]->(b) match b-[r2]->c return a,c;
      ==> +-----------------------------------------------+
      ==> | a                     | c                     |
      ==> +-----------------------------------------------+
      ==> | Node[1]{name:"World"} | Node[1]{name:"World"} |
      ==> | Node[1]{name:"World"} | Node[0]{name:"World"} |
      ==> +-----------------------------------------------+
      ==> 2 rows
      ==> 2 ms
      ==> 
      ==> Compiler CYPHER 2.3
      ==> 
      ==> Planner COST
      ==> 
      ==> Runtime INTERPRETED
      ==> 
      ==> Projection
      ==>   |
      ==>   +Expand(All)(0)
      ==>     |
      ==>     +Expand(All)(1)
      ==>       |
      ==>       +AllNodesScan
      ==> 
      ==> +----------------+---------------+------+--------+----------------+----------------+
      ==> |       Operator | EstimatedRows | Rows | DbHits |    Identifiers |          Other |
      ==> +----------------+---------------+------+--------+----------------+----------------+
      ==> |     Projection |             1 |    2 |      0 | a, b, c, r, r2 |           a; c |
      ==> | Expand(All)(0) |             1 |    2 |      4 | a, b, c, r, r2 | (b)-[r2:]->(c) |
      ==> | Expand(All)(1) |             2 |    2 |      8 |        a, b, r |  (b)<-[r:]-(a) |
      ==> |   AllNodesScan |             6 |    6 |      7 |              b |                |
      ==> +----------------+---------------+------+--------+----------------+----------------+
      

    0 讨论(0)
提交回复
热议问题