2016-11-18 9 views
0

私は数百万のノードを含むラベルPersonを持っています。ノードにはいくつかのプロパティがあり、CSVファイルからノードに新しいプロパティを追加しようとしています。 私はそれらを人の姓と名で照合しようとしていますが、クエリが遅すぎます。クエリは次のとおりです。Neo4jノードから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

私はそれを終了する前に、私は多分時間のランニングクエリを残しました。 何か間違っていますか? forenamesurnameにインデックスがあることに注意してください。

答えて

0

それは本当にインデックスを使用していますかどうかを確認するためにクエリをプロファイリングしてみてください。

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つのプロファイル(どちらのインデックスも)間のフィルタリングステップの数値を比較すると、インデックスの分布を知ることができます。

+0

ご返信が遅れました。 クエリは1つのインデックスのみを使用しており、両方のインデックスを使用していません。 を実行した後 'インデックスpを用いた:インデックスpを使用する人を(forename) :人(姓)' Iは、同じ変数に対する複数のヒントがサポートされていない '得る(行3、列13(オフセット:109)) 」をUSING INDEX p:Person(forename) "'。 'MATCH(p:Person) WHERE EXISTS(p.newPersonNumber) RETURNこのようなプロパティを持つノードがあるかどうかを確認してから、インデックスを実行しても問題はありません。 p'が返されますが、0行が返されました。 – Porjaz

+0

私は、クエリのデバッグとプロファイリングに焦点を当てて答えを更新しました。 –

+0

'PROFILE'を使用すると、' MATCH'が結果を見つけるので、クエリが正しく書かれていると思います。また、私にとってもっと有益なのは、forenameに索引をつけることです(今のようです)。他に何が問題なのか分かりません。また、CSVファイルは4.7 GBです。 – Porjaz

関連する問題