конкатенация команд сопоставления шифров neo4j
Являются ли эти два утверждения шифра идентичными:
//first
match (a)-[r]->(b),b-[r2]->c
//second
match (a)-[r]->(b)
match b-[r2]->c
1 ответ:
2 оператора Cypher не идентичны. Мы можем показать это с помощью команды PROFILE , которая показывает, как механизм шифрования будет выполнять запрос.
В следующих примерах все запросы заканчиваются на
Как вы можете видеть, первый запрос имеет фильтрRETURN a, c
, так как у вас не может быть голого предложенияMATCH
.NOT(r == r2)
, которого нет у второго запроса. Это происходит потому, что Cypher гарантирует, что результат одного предложенияMATCH
не содержит дубликатов отношения.
Первый запрос
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 | | ==> +----------------+---------------+------+--------+----------------+----------------+ ==>
Второй запрос
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 | | ==> +----------------+---------------+------+--------+----------------+----------------+