конкатенация команд сопоставления шифров neo4j


Являются ли эти два утверждения шифра идентичными:

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

//second
match (a)-[r]->(b)
match b-[r2]->c
1 3

1 ответ:

2 оператора Cypher не идентичны. Мы можем показать это с помощью команды PROFILE , которая показывает, как механизм шифрования будет выполнять запрос.

В следующих примерах все запросы заканчиваются на RETURN a, c, так как у вас не может быть голого предложения MATCH.

Как вы можете видеть, первый запрос имеет фильтр NOT(r == r2), которого нет у второго запроса. Это происходит потому, что Cypher гарантирует, что результат одного предложения MATCH не содержит дубликатов отношения.
  1. Первый запрос

    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. Второй запрос

    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 |                |
    ==> +----------------+---------------+------+--------+----------------+----------------+