簡體   English   中英

CYPHER 2.3 在 Neo4j 查詢中的性能

[英]Performance of CYPHER 2.3 in Neo4j query

我在 Neo4j 查詢中遇到問題。 假設我有一個名為 App 的節點類型。 App 節點具有字段“m_id”和“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;

我也有兩個字段的索引:

CREATE CONSTRAINT ON (a:App) ASSERT a.m_id IS UNIQUE;
CREATE INDEX ON :App(info);

但問題是我的查詢速度非常慢,可以訪問 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            |                                                                                                                                |
| |             +--------+---------+-----------------+--------------------------------------------------------------------------------------------------------------------------------+
| +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                                                                                                                           |
+---------------+--------+---------+-----------------+--------------------------------------------------------------------------------------------------------------------------------+

嘗試自行查找a ,使用WITH子句將a.info放入一個臨時變量中,該變量由b的單獨MATCH子句使用,如下所示:

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;

在比較 2 個節點的屬性時,似乎不使用索引。 使用a_info消除了這個障礙。

如果上面的配置文件顯示未使用一個或兩個索引,您可以嘗試添加索引提示:

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

我想出了一個使用 OPTIONAL MATCH 的解決方案:

MATCH (a:App {m_id:'SOME_VALUE' }) OPTIONAL MATCH (a),(b:App {info: a.info}) WHERE ID(a)<>ID(b) AND NOT (b)-[:信息]->(a) 合並 (a)-[r:INFO]->(b) 返回 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            |                                                                                                            |
| |              +------+---------+-----------------+------------------------------------------------------------------------------------------------------------+
| +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)                                                                                |
+----------------+------+---------+-----------------+------------------------------------------------------------------------------------------------------------+

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM