2017-05-23 3 views
0

データベースに5800万のノードと1億の関係がすでに存在しているとします。 Person(cstid):Neo4jでcsvとマージデータをロードするときのヒントの使用方法

USING PERIODIC COMMIT 
LOAD CSV WITH HEADERS FROM 'file:///path/to/data.csv' AS row FIELDTERMINATOR '\t' 
MERGE (n:Person {cstid: row.cstid}) 
ON CREATE SET n.name = row.name 
ON MATCH SET n.name = row.name; 

はまた、上の固有の制約があった:

は、その後、私は130万のノードと以下のようなLOADのCSV方法を経由して100万人の関係が含まれているデルタバッチデータをロードしたいです私はそれを使用したくないです。だから私は、以下のようなSCANヒントを使用してみました:

USING PERIODIC COMMIT 
LOAD CSV WITH HEADERS FROM 'file:///path/to/data.csv' AS row FIELDTERMINATOR '\t' 
MERGE (n:Person {cstid: row.cstid}) 
USING SCAN n:Person 
ON CREATE SET n.name = row.name 
ON MATCH SET n.name = row.name; 

しかしのNeo4jだけで、警告を投げる直接要求して終了を終了します。

WARNING: Invalid input 's': expected 'n/N' (line 3, column 2 (offset: 154)) 
"using scan n:Person" 
^

私はINDEXヒントを指定すると、この現象も存在します:

USING PERIODIC COMMIT 
LOAD CSV WITH HEADERS FROM 'file:///path/to/data.csv' AS row FIELDTERMINATOR '\t' 
MERGE (n:Person {cstid: row.cstid}) 
USING INDEX n:Person(cstid) 
ON CREATE SET n.name = row.name 
ON MATCH SET n.name = row.name; 

だから... Neo4jはMERGE節でヒントを使用してサポートしていますか?

のNeo4j:3.2.0 CE

答えて

1

いいえ、のNeo4jは現在MERGE句とUSING句をサポートしていません。

しかし、この論理的に等価のクエリは動作するはずです:

USING PERIODIC COMMIT 
LOAD CSV WITH HEADERS FROM 'file:///path/to/data.csv' AS row FIELDTERMINATOR '\t' 
OPTIONAL MATCH (n:Person {cstid: row.cstid}) 
USING SCAN n:Person 
FOREACH(ignored IN CASE WHEN n IS NULL THEN [1] END | CREATE (n:Person {cstid: row.cstid})) 
SET n.name = row.name; 

FOREACH句は、それが存在しない場合、ノードを作成するためのハックです。そして、あなたはいつもSETnameのプロパティを望んでいるので、それだけです。

+0

[1]とは何ですか? –

+0

これは、単一の値(これは無視されます)を含むコレクションで、 '|'の後に操作が実行されます(この場合、一度)。 'FOREACH'は' NULL'値または空のコレクションを反復するように要求された場合は何もしません。 – cybersam

関連する問題