0

これはクエリです:

MATCH (n:Client{curp:'SOME_VALUE'}) 
WITH n 
MATCH (n)-[:HIZO]-()-[r:FB]-()-[:HIZO]-(m:Client) 
WHERE ID(n)<>ID(m)
AND NOT (m)-[:FB]->(n) 
MERGE (n)-[:FB]->(m) RETURN m.curp

プロフィール

クエリがすでに n, m ペアを 6,781 行に絞り込んでいるのに、Merge ステージが非常に多くの DB ヒットを取得するのはなぜですか?

その段階の詳細はこれを示しています:

n, m, r
(n)-[ UNNAMED155:FB]->(m)
4

1 に答える 1

1

クエリは行を構築し、クエリ内の操作は構築されたすべての行で実行されることに注意してください。

一致のパターンは同じ :Client への複数のパスを見つける可能性があるため、同じ n と m を持つ複数の行が作成されます (ただし、r は異なる可能性がありますが、クエリの他の場所で r を使用していないため、お勧めします)。変数を削除します)。

つまり、n と個別の m の間の単一のリレーションシップを MERGE するつもりであったとしても、この MERGE 操作は実際には n と m のすべての重複行に対して実行されます。これらの MERGE の 1 つが関係を作成し、他の MERGE はそれ以上何もせずに作成された関係に一致するサイクルを浪費します。

そのため、MERGE を実行する前に n と m の個別のペアのみを考慮することで、データベース ヒット数を下げることができるはずです。

また、あなたのクエリは関係が存在しない n と m のみを考慮していることを確認したので、MERGE の代わりに CREATE を安全に使用できます。必要ない。

改善されたクエリは次のようになります。

MATCH (n:Client{curp:'SOME_VALUE'}) 
WITH n 
MATCH (n)-[:HIZO]-()-[:FB]-()-[:HIZO]-(m:Client) 
WHERE n <> m
AND NOT (m)-[:FB]->(n) 
WITH DISTINCT n, m
MERGE (n)-[:FB]->(m) 
RETURN m.curp

編集

:FB 関係に MERGE を使用するようにクエリを返すと、代わりに CREATE を使用しようとするとパフォーマンスが低下します。

于 2017-01-05T02:43:21.323 に答える