それは本当にインデックスを使用していますかどうかを確認するためにクエリをプロファイリングしてみてください。
PROFILE
WITH "qwe" AS forename, "asd" AS surname
MATCH (p:Person {forename: forename, surname: surname})
RETURN p
れていない場合は、あなたがそれを強制することができます
WITH "qwe" AS forename, "asd" AS surname
MATCH (p:Person {forename: forename, surname: surname})
USING INDEX p:Person(forename)
USING INDEX p:Person(surname)
RETURN p
Cypher refcard(強調鉱山で述べたように):
Cypherが準最適インデックスを使用している場合は、インデックスの使用が強制できます以上1つのインデックスを使用する必要があります。
USING
の章も参照してください。
更新
現在サポートされていません同じノード上で複数のインデックスを使用しているので、のは、クエリが遅い理由に戻って注目しましょう、そして、それは実際に何かをするかどうか。あなたはサブセットの実際のLOAD CSV
をプロファイリングし、データが何も一致するかどうかを確認することができます:あなたはMATCH
が何かを見つけることを確認することができ、その方法を
PROFILE
USING PERIODIC COMMIT
LOAD CSV WITH HEADERS FROM 'file:///personaldata.csv' AS line1
WITH line1
LIMIT 10
OPTIONAL MATCH (p:Person {forename:line1.forename, surname:line1.surname})
RETURN p, line1.newPersonNumber
(すなわちforenameと姓がトリミングか何かする必要はありません)また、どのインデックスがクエリにとって有益であるかを確認することもできます。インデックスが1つしか使用されないため、結果は他のプロパティでフィルタリングされ、最も識別性の高いインデックスを使用すると高速になります。すべての人がジョンであれば、あなたは姓でインデックスを使うのがよいでしょうが、もしそうなら、forenameにインデックスを使用してください。彼らがJohn Doesのすべてであれば、重複の問題があります...とにかく、2つのプロファイル(どちらのインデックスも)間のフィルタリングステップの数値を比較すると、インデックスの分布を知ることができます。
ご返信が遅れました。 クエリは1つのインデックスのみを使用しており、両方のインデックスを使用していません。 を実行した後 'インデックスpを用いた:インデックスpを使用する人を(forename) :人(姓)' Iは、同じ変数に対する複数のヒントがサポートされていない '得る(行3、列13(オフセット:109)) 」をUSING INDEX p:Person(forename) "'。 'MATCH(p:Person) WHERE EXISTS(p.newPersonNumber) RETURNこのようなプロパティを持つノードがあるかどうかを確認してから、インデックスを実行しても問題はありません。 p'が返されますが、0行が返されました。 – Porjaz
私は、クエリのデバッグとプロファイリングに焦点を当てて答えを更新しました。 –
'PROFILE'を使用すると、' MATCH'が結果を見つけるので、クエリが正しく書かれていると思います。また、私にとってもっと有益なのは、forenameに索引をつけることです(今のようです)。他に何が問題なのか分かりません。また、CSVファイルは4.7 GBです。 – Porjaz