2

私はNeo4J 2.0のドキュメントでそのSTART句はオプションであり、

Cypher はクエリから開始点を推測しようとします

私は実験的にそれを発見しました

START user = node(*) 
MATCH (user:User)-[r:KNOWS]-(user2:User) 
RETURN user.username AS username, collect(user2.username) AS username2

と同じ結果が得られます

MATCH (user:User)-[r:KNOWS]-(user2:User) 
RETURN user.username AS username, collect(user2.username) AS username2

小さなデータセット用。

私の質問は: 意味的に同じですか? 彼らは常に同じ結果セットを返しますか (私は順序について話しているわけではありません)? 大規模なデータセットでも?スキップはSTARTすべてのノードをトラバースすることを保証しますか? それらが意味的に等しい場合、なぜ使用するのnode(*)でしょうか?

4

1 に答える 1

4

クエリは意味的に同じではありませんが、常に同じ結果を返します。それらが同じ結果を返す理由は、最初のクエリで「ユニバーサル ノード パターン」node(*)を指定した後、すぐにMATCH節でさらにパターンを指定して制限するためです。2 番目のクエリでは、このより狭いパターンを最初から述べていますが、2 つのMATCH句は同等であり、各クエリで宣言されている最も狭いパターンであるため (そしてRETURN句が同じであるため)、2 つのクエリは同じ結果を返します。

このSTART句は、クエリの初期パターンを記述する方法であり、インデックス作成と結びついていました。node(*)orの使用relationship(*)はめったに推奨されず、有用でもありませんでしたが、句は のようにインデックスの取得に使用されましたSTART user=node:userIndex(name="Maciej Ziarko")。2.0 のラベルでは、ラベルのインデックス作成が導入されました。これは現在、クエリでノードをバインドするための推奨される方法です。

スキップSTARTしても、すべてのノードをトラバースする (より正確には、すべてのノードをバインドする) ことは保証されませんが、そのためのSTART句も必要ありません。を使用してMATCH user(ラベルや関係でバインドされるものを制限することなくuser)、データベース内のすべてのノードをバインドできます。それはまだめったに推奨されず、有用ではありません.

于 2013-10-21T20:41:47.253 に答える