LIMIT
を使用すると、Neo4jは一致するものが見つかるとグラフの移動を停止します。
Cypherは宣言型のクエリ言語であるため、クエリオプティマイザはLIMIT
節を適切に処理します。つまり、パターンマッチング中の制限を考慮します。
これを証明するための実験を設計しましょう。例えば、データセット:
まず、それはものではありません特定のIDにノードn
をバインドしてクエリからSTART
句を削除します。
CREATE
(p1:Person),
(p2:Person),
(p3:Person),
(p1)-[:KNOWS]->(p2),
(p1)-[:KNOWS]->(p3),
(p2)-[:KNOWS]->(p3)
グラフは次のようになります私たちはこの実験に欲しいです。一般的に:START
は既に非難されており、可能な場合は使用しないでください。
のは、LIMIT 1
制約を追加して、クエリプランを分析するためにPROFILE
キーワードを使用してみましょう:
PROFILE
MATCH (n)-[]-(p1:Person)
RETURN n
LIMIT 1
LIMIT
キーワードを削除し、再度、クエリプランを分析:
PROFILE
MATCH (n)-[]-(p1:Person)
RETURN n
LIMIT 1
制約付きクエリプランは、NodeByLabelScan操作から2つのデータベースヒットを含む1行のみを返します。ただし、制約のないクエリプランでは、データベースのヒット数が4の3行が返されます。
更新: InverseFalconのコメントで示唆されているように、EXISTS
関数を使用すると、ブール値になります。ただし、結果に1行を取得するには(まだ不必要なデータベースのヒットを避けるため)、まだLIMIT 1
が必要です。
PROFILE
MATCH (n)
RETURN EXISTS((n)-[]-(:Person))
LIMIT 1
この試合の唯一の目的は、このようなパターンまたはパスが存在するかどうかを把握することである場合にも、EXISTS()関数に興味があるかもしれません。 – InverseFalcon
ありがとう@InverseFalcon、それは非常に洞察力があります。私は 'EXISTS'を使って答えを更新しました。興味深いのは、まだ 'LIMIT 1'を使うべきだと思うということです。 'EXISTS'にもっと優雅な方法がありますか? –
それは本当にどのようにクエリで使用されるかによって異なります。特定のノードに一致する場合(元のクエリでノード(0)と同じように)パターンが存在するかどうかを知りたい場合は、そのパターンでEXISTS()を使用すると、trueまたはfalse 。多くのノード(この回答のクエリのように、nがすべてのノードに一致する)と一致する場合に使用すると、すべての行についてそのパターンEXISTS()が計算されます。 LIMITは結果セット全体に適用され、行単位ではないことに注意してください。 – InverseFalcon