何百万ものノードを含むラベルPersonがあります。ノードにはいくつかのプロパティがあり、CSVファイルからノードに新しいプロパティを追加しようとしています。その人の名前と名前でそれらを一致させようとしていますが、クエリが遅すぎます。クエリは次のとおりです。
USING PERIODIC COMMIT LOAD CSV WITH HEADERS FROM 'file:///personaldata.csv' AS line1 MATCH (p:Person {forename:line1.forename, surname:line1.surname}) SET p.newPersonNumber=line1.newPersonNumber
クエリを終了する前に、クエリを1時間ほど実行したままにしました。私は何か間違ったことをしていますか?私は上のインデックスを持っていることに注意してくださいforename
とsurname
。
クエリをプロファイリングして、実際にインデックスが使用されているかどうかを確認してください。
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が次善のインデックスを使用する場合、または複数のインデックスを使用する必要がある場合は、インデックスの使用を強制できます。
の章も参照してくださいUSING
。
更新
現在、同じノードで複数のインデックスを使用することはサポートされていないため、クエリが遅い理由と、実際に何かを実行するかどうかに焦点を当てましょう。LOAD CSV
サブセットの実際のプロファイルを作成し、データが何かに一致するかどうかを確認できます。
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
このようにして、MATCH
検索結果が何かを検出することを確認できます(つまり、名前と名前にトリミングなどは必要ありません)。また、クエリにとってより有益なインデックスを確認することもできます。使用されるインデックスは1つだけなので、結果は次のようになります。他のプロパティでフィルタリングされ、最も判別的なインデックスを使用すると高速になります。すべての人がジョンズである場合は、名前のインデックスを使用することをお勧めしますが、全員がジョンズである場合は、フォアネームのインデックスを使用します。それらがすべてJohnDoesである場合、重複の問題があります...とにかく、2つのプロファイル(いずれかのインデックスを使用)間のフィルタリングステップの数値を比較すると、インデックスの分布がわかります。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加