あなたは(そう、特定の名前の最初の試合は遅いです)今のあなたは、インデックスを使用していない、あなたのクエリをクリーンアップする必要があるとしている、とあなたはデカルトを行いますproduct against all:ユーザーノード。次に、各行の文字列を作成します。
まず、開始ノードを高速に見つけるために、USER(name)にインデックスを作成します。
その後、残りの試合をクリーンアップする必要があります。
代わりにこのような何かを試してみてください:
MATCH (n:USER) WHERE n.name = "name"
WITH n, "2000" as number
MATCH (n)<-[:CREATED_BY]-(:COMMENT)-[:HAS]->(l:LIKE)-[:CREATED_BY]->(o:User)
RETURN n, o, number, count(l)
をあなたが「2000」せずに、クエリのように、このクエリを使用して同様のプランが表示されます。
o
にマッチするデカルト商品がありますが、最後の試合のパターンで発生しなければならないという点で、o
の追加の制限があることに気づくほど、インテリジェントになっていますその状況に対するその最適化により、デカルト積を実行することを避けることができます。
しかし、新しい変数number
の導入により、プランナはこれが基本的に同じ状況であることを認識できなくなり、プランナはデカルト積を最適化しませんでした。
今のところ、クエリの実行方法を明示し、クエリ内のデカルト積を避けるようにしてください。 、それは代わりにあなたの結果のすべての行のためにそれを後で試合でユーザー言っている:この特定のケースでは、それはあなたが3行目のMATCH (o:User)
を持っている場合、それはo
の種類があることを宣言していないことを理解することが重要
をですこれまでのところ、すべてのユーザーに対してデカルト製品を実行してから、ユーザーノードごとに、提供されたパターン内にどのノードが存在するかを確認します。これは、提供されたパターンを単純に拡張して、パターンの反対側にあるユーザーノードを見つけることと比べて、多くの不必要な作業です。
EDIT
限り、両方の取得など:LIKEや:嫌いノード数は、おそらくこのような何かを試してみてください。
MATCH (n:USER) WHERE n.name = "name"
WITH n, "2000" as number
MATCH (n)<-[:CREATED_BY]-(:COMMENT)-[:HAS]->(likeDislike)-[:CREATED_BY]->(o:User)
WITH n, o, number, head(labels(likeDislike)) as type, count(likeDislike) as cnt
WITH n, o, number, CASE WHEN type = "LIKE" THEN cnt END as likeCount, CASE WHEN type = "DISLIKE" THEN cnt END as dislikeCount
RETURN n, o, number, sum(likeCount) as likeCount, sum(dislikeCount) as dislikeCount
あなたはまだそのnumber
変数であり必要と仮定。
私の想定では、you/cypherは32969個の新しい文字列を作成します。あなたはJVMでgc休止を打つのですか?番号2000を使用しても同じことが起こっていますか? – manonthemat