2016-03-31 12 views
1

Neo4jクエリで問題が発生しています。 AppというNode型があるとします。 Appノードには、フィールド「m_id」と「info」があります。フィールド "info"が等しいノード間の関係を作成するためのクエリを作成したいと思います。 Neo4jクエリでのCYPHER 2.3のパフォーマンス

この

はクエリです:

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); 

しかし、事は、私はアプリケーションのすべてのレコードにアクセスして、非常に遅いクエリを取得することですノード。

これは、クエリのプロファイルです:

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

答えて

1

はのように、bのために別々のMATCH句で使用される一時変数にa.infoを入れてWITH句を使用して、それ自体でaを見つけてみてください。

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の使用はその障害を取り除きます。

上記のプロファイルは、1つまたは両方のインデックスが使用されていないことを示している場合は、インデックスヒントを追加してみてくださいすることができます

MATCH(:私はオプションMATCHを使用して解決策を見つけ出す

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; 
+0

2試合にそれを分割するのに十分な良いです。 2.3の中間WITHまたは式のエイリアスの必要はありません –

+0

あなたのソリューションも動作します。 –

0

(a)<> ID(b)AND NOT(b) - [:INFO]のように指定してください(a:App {m_id: 'SOME_VALUE'}) - >(a)マージ(a) - [r:情報] - >(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)                    | 
+----------------+------+---------+-----------------+------------------------------------------------------------------------------------------------------------+ 
関連する問題