Database CYPHER 2.3在Neo4j查询中的性能

Database CYPHER 2.3在Neo4j查询中的性能,database,performance,graph,neo4j,cypher,Database,Performance,Graph,Neo4j,Cypher,我在Neo4j查询中遇到问题。假设我有一个名为App的节点类型。应用程序节点具有字段“m_id”和“info”。我想构建一个查询,在字段“info”相等的节点之间创建一个关系 以下是查询: MATCH (a:App {m_id:'SOME_VALUE' }),(b:App {info: a.info}) WHERE ID(a)<>ID(b) AND NOT (b)-[:INFO]->(a) MERGE (a)-[r:INFO]->(b) RETURN b.m_id; +

我在Neo4j查询中遇到问题。假设我有一个名为App的节点类型。应用程序节点具有字段“m_id”和“info”。我想构建一个查询,在字段“info”相等的节点之间创建一个关系

以下是查询:

MATCH (a:App {m_id:'SOME_VALUE' }),(b:App {info: a.info}) WHERE ID(a)<>ID(b) AND NOT (b)-[:INFO]->(a) MERGE (a)-[r:INFO]->(b) RETURN b.m_id;
+---------------+--------+---------+-----------------+--------------------------------------------------------------------------------------------------------------------------------+
| Operator      | Rows   | DB Hits | Identifiers     | Other                                                                                                                          |
+---------------+--------+---------+-----------------+--------------------------------------------------------------------------------------------------------------------------------+
| +ColumnFilter |      0 |       0 | b.m_id          | keep columns b.m_id                                                                                                            |
| |             +--------+---------+-----------------+--------------------------------------------------------------------------------------------------------------------------------+
| +Extract      |      0 |       0 | a, b, b.m_id, r | b.m_id                                                                                                                         |
| |             +--------+---------+-----------------+--------------------------------------------------------------------------------------------------------------------------------+
| +Merge(Into)  |      0 |       1 | a, b, r         | (a)-[r:INFO]->(b)                                                                                                             |
| |             +--------+---------+-----------------+--------------------------------------------------------------------------------------------------------------------------------+
| +Eager        |      0 |       0 | a, b            |                                                                                                                                |
| |             +--------+---------+-----------------+--------------------------------------------------------------------------------------------------------------------------------+
| +Filter       |      0 |  2000000 | a, b            | Ands(b.info == a.info, NOT(IdFunction(a) == IdFunction(b)), NOT(nonEmpty(PathExpression((b)-[anon[104]:INFO]->(a), true)))) |
| |             +--------+---------+-----------------+--------------------------------------------------------------------------------------------------------------------------------+
| +SchemaIndex  | 184492 |  1000000 | a, b            | {  AUTOSTRING0}; :App(m_id)                                                                                                    |
| |             +--------+---------+-----------------+--------------------------------------------------------------------------------------------------------------------------------+
| +NodeByLabel  | 184492 |  1000001 | b               | :App                                                                                                                           |
+---------------+--------+---------+-----------------+--------------------------------------------------------------------------------------------------------------------------------+
+----------------+------+---------+-----------------+------------------------------------------------------------------------------------------------------------+
| Operator       | Rows | DB Hits | Identifiers     | Other                                                                                                      |
+----------------+------+---------+-----------------+------------------------------------------------------------------------------------------------------------+
| +ColumnFilter  |    0 |       0 | b.m_id          | keep columns b.m_id                                                                                        |
| |              +------+---------+-----------------+------------------------------------------------------------------------------------------------------------+
| +Extract       |    0 |       0 | a, b, b.m_id, r | b.m_id                                                                                                     |
| |              +------+---------+-----------------+------------------------------------------------------------------------------------------------------------+
| +Merge(Into)   |    0 |       1 | a, b, r         | (a)-[r:INFO]->(b)                                                                                         |
| |              +------+---------+-----------------+------------------------------------------------------------------------------------------------------------+
| +Eager         |    0 |       0 | a, b            |                                                                                                            |
| |              +------+---------+-----------------+------------------------------------------------------------------------------------------------------------+
| +OptionalMatch |    0 |       0 | a, b            |                                                                                                            |
| |\             +------+---------+-----------------+------------------------------------------------------------------------------------------------------------+
| | +Filter      |    0 |       0 | a, b            | Ands(NOT(IdFunction(a) == IdFunction(b)), NOT(nonEmpty(PathExpression((b)-[anon[109]:INFO]->(a), true)))) |
| | |            +------+---------+-----------------+------------------------------------------------------------------------------------------------------------+
| | +SchemaIndex |    0 |       0 | a, b            | a.info; :App(info)                                                                                       |
| | |            +------+---------+-----------------+------------------------------------------------------------------------------------------------------------+
| | +Argument    |    0 |       0 | a               |                                                                                                            |
| |              +------+---------+-----------------+------------------------------------------------------------------------------------------------------------+
| +SchemaIndex   |    0 |       1 | a               | {  AUTOSTRING0}; :App(m_id)                                                                                |
+----------------+------+---------+-----------------+------------------------------------------------------------------------------------------------------------+
但问题是我的查询速度非常慢,可以访问应用程序节点的所有记录

这是查询的配置文件:

MATCH (a:App {m_id:'SOME_VALUE' }),(b:App {info: a.info}) WHERE ID(a)<>ID(b) AND NOT (b)-[:INFO]->(a) MERGE (a)-[r:INFO]->(b) RETURN b.m_id;
+---------------+--------+---------+-----------------+--------------------------------------------------------------------------------------------------------------------------------+
| Operator      | Rows   | DB Hits | Identifiers     | Other                                                                                                                          |
+---------------+--------+---------+-----------------+--------------------------------------------------------------------------------------------------------------------------------+
| +ColumnFilter |      0 |       0 | b.m_id          | keep columns b.m_id                                                                                                            |
| |             +--------+---------+-----------------+--------------------------------------------------------------------------------------------------------------------------------+
| +Extract      |      0 |       0 | a, b, b.m_id, r | b.m_id                                                                                                                         |
| |             +--------+---------+-----------------+--------------------------------------------------------------------------------------------------------------------------------+
| +Merge(Into)  |      0 |       1 | a, b, r         | (a)-[r:INFO]->(b)                                                                                                             |
| |             +--------+---------+-----------------+--------------------------------------------------------------------------------------------------------------------------------+
| +Eager        |      0 |       0 | a, b            |                                                                                                                                |
| |             +--------+---------+-----------------+--------------------------------------------------------------------------------------------------------------------------------+
| +Filter       |      0 |  2000000 | a, b            | Ands(b.info == a.info, NOT(IdFunction(a) == IdFunction(b)), NOT(nonEmpty(PathExpression((b)-[anon[104]:INFO]->(a), true)))) |
| |             +--------+---------+-----------------+--------------------------------------------------------------------------------------------------------------------------------+
| +SchemaIndex  | 184492 |  1000000 | a, b            | {  AUTOSTRING0}; :App(m_id)                                                                                                    |
| |             +--------+---------+-----------------+--------------------------------------------------------------------------------------------------------------------------------+
| +NodeByLabel  | 184492 |  1000001 | b               | :App                                                                                                                           |
+---------------+--------+---------+-----------------+--------------------------------------------------------------------------------------------------------------------------------+
+----------------+------+---------+-----------------+------------------------------------------------------------------------------------------------------------+
| Operator       | Rows | DB Hits | Identifiers     | Other                                                                                                      |
+----------------+------+---------+-----------------+------------------------------------------------------------------------------------------------------------+
| +ColumnFilter  |    0 |       0 | b.m_id          | keep columns b.m_id                                                                                        |
| |              +------+---------+-----------------+------------------------------------------------------------------------------------------------------------+
| +Extract       |    0 |       0 | a, b, b.m_id, r | b.m_id                                                                                                     |
| |              +------+---------+-----------------+------------------------------------------------------------------------------------------------------------+
| +Merge(Into)   |    0 |       1 | a, b, r         | (a)-[r:INFO]->(b)                                                                                         |
| |              +------+---------+-----------------+------------------------------------------------------------------------------------------------------------+
| +Eager         |    0 |       0 | a, b            |                                                                                                            |
| |              +------+---------+-----------------+------------------------------------------------------------------------------------------------------------+
| +OptionalMatch |    0 |       0 | a, b            |                                                                                                            |
| |\             +------+---------+-----------------+------------------------------------------------------------------------------------------------------------+
| | +Filter      |    0 |       0 | a, b            | Ands(NOT(IdFunction(a) == IdFunction(b)), NOT(nonEmpty(PathExpression((b)-[anon[109]:INFO]->(a), true)))) |
| | |            +------+---------+-----------------+------------------------------------------------------------------------------------------------------------+
| | +SchemaIndex |    0 |       0 | a, b            | a.info; :App(info)                                                                                       |
| | |            +------+---------+-----------------+------------------------------------------------------------------------------------------------------------+
| | +Argument    |    0 |       0 | a               |                                                                                                            |
| |              +------+---------+-----------------+------------------------------------------------------------------------------------------------------------+
| +SchemaIndex   |    0 |       1 | a               | {  AUTOSTRING0}; :App(m_id)                                                                                |
+----------------+------+---------+-----------------+------------------------------------------------------------------------------------------------------------+

尝试单独查找
a
,使用
WITH
子句将
a.info
放入一个临时变量中,该临时变量由单独的
MATCH
子句用于
b
,如下所示:

MATCH (a:App { m_id:'SOME_VALUE' })
WITH a, a.info AS a_info
MATCH (b:App { info: a_info })
WHERE a <> b AND NOT (b)-[:INFO]->(a)
MERGE (a)-[r:INFO]->(b)
RETURN b.m_id;

我使用可选匹配找到了一个解决方案:

匹配(a:App{m_id:'SOME_VALUE'})可选匹配(a),(b:App{info:a.info})其中id(a)id(b)和NOT(b)-[:info]->(a)合并(a)-[r:info]->(b)返回b.m_id

这是查询的配置文件:

MATCH (a:App {m_id:'SOME_VALUE' }),(b:App {info: a.info}) WHERE ID(a)<>ID(b) AND NOT (b)-[:INFO]->(a) MERGE (a)-[r:INFO]->(b) RETURN b.m_id;
+---------------+--------+---------+-----------------+--------------------------------------------------------------------------------------------------------------------------------+
| Operator      | Rows   | DB Hits | Identifiers     | Other                                                                                                                          |
+---------------+--------+---------+-----------------+--------------------------------------------------------------------------------------------------------------------------------+
| +ColumnFilter |      0 |       0 | b.m_id          | keep columns b.m_id                                                                                                            |
| |             +--------+---------+-----------------+--------------------------------------------------------------------------------------------------------------------------------+
| +Extract      |      0 |       0 | a, b, b.m_id, r | b.m_id                                                                                                                         |
| |             +--------+---------+-----------------+--------------------------------------------------------------------------------------------------------------------------------+
| +Merge(Into)  |      0 |       1 | a, b, r         | (a)-[r:INFO]->(b)                                                                                                             |
| |             +--------+---------+-----------------+--------------------------------------------------------------------------------------------------------------------------------+
| +Eager        |      0 |       0 | a, b            |                                                                                                                                |
| |             +--------+---------+-----------------+--------------------------------------------------------------------------------------------------------------------------------+
| +Filter       |      0 |  2000000 | a, b            | Ands(b.info == a.info, NOT(IdFunction(a) == IdFunction(b)), NOT(nonEmpty(PathExpression((b)-[anon[104]:INFO]->(a), true)))) |
| |             +--------+---------+-----------------+--------------------------------------------------------------------------------------------------------------------------------+
| +SchemaIndex  | 184492 |  1000000 | a, b            | {  AUTOSTRING0}; :App(m_id)                                                                                                    |
| |             +--------+---------+-----------------+--------------------------------------------------------------------------------------------------------------------------------+
| +NodeByLabel  | 184492 |  1000001 | b               | :App                                                                                                                           |
+---------------+--------+---------+-----------------+--------------------------------------------------------------------------------------------------------------------------------+
+----------------+------+---------+-----------------+------------------------------------------------------------------------------------------------------------+
| Operator       | Rows | DB Hits | Identifiers     | Other                                                                                                      |
+----------------+------+---------+-----------------+------------------------------------------------------------------------------------------------------------+
| +ColumnFilter  |    0 |       0 | b.m_id          | keep columns b.m_id                                                                                        |
| |              +------+---------+-----------------+------------------------------------------------------------------------------------------------------------+
| +Extract       |    0 |       0 | a, b, b.m_id, r | b.m_id                                                                                                     |
| |              +------+---------+-----------------+------------------------------------------------------------------------------------------------------------+
| +Merge(Into)   |    0 |       1 | a, b, r         | (a)-[r:INFO]->(b)                                                                                         |
| |              +------+---------+-----------------+------------------------------------------------------------------------------------------------------------+
| +Eager         |    0 |       0 | a, b            |                                                                                                            |
| |              +------+---------+-----------------+------------------------------------------------------------------------------------------------------------+
| +OptionalMatch |    0 |       0 | a, b            |                                                                                                            |
| |\             +------+---------+-----------------+------------------------------------------------------------------------------------------------------------+
| | +Filter      |    0 |       0 | a, b            | Ands(NOT(IdFunction(a) == IdFunction(b)), NOT(nonEmpty(PathExpression((b)-[anon[109]:INFO]->(a), true)))) |
| | |            +------+---------+-----------------+------------------------------------------------------------------------------------------------------------+
| | +SchemaIndex |    0 |       0 | a, b            | a.info; :App(info)                                                                                       |
| | |            +------+---------+-----------------+------------------------------------------------------------------------------------------------------------+
| | +Argument    |    0 |       0 | a               |                                                                                                            |
| |              +------+---------+-----------------+------------------------------------------------------------------------------------------------------------+
| +SchemaIndex   |    0 |       1 | a               | {  AUTOSTRING0}; :App(m_id)                                                                                |
+----------------+------+---------+-----------------+------------------------------------------------------------------------------------------------------------+

把它分成两场比赛就足够了。在2.3中不需要中间带或表达式别名