Neo4Jにデータをロードしようとしています。私はPerson
ノードがすでにセットアップされています。今、このノードは配列(またはコレクション)であるべきemail
プロパティを持つ必要があります。基本的には、email
プロパティは複数の値を持つ必要がある、のように -Neo4JでCypherを使用して既存のノードに複数の値を追加する方法
email: ["[email protected]", "[email protected]"]
私はここに同様の質問に遭遇しましたが、答えの全ては、ノード自体がを作成時に複数のプロパティ値にを設定することを示しています。 this答えからこのようなクエリ -
CREATE (e:Employee { name:"Sam",languages: ["C", "C#"]})
RETURN e
しかし、私の場合の問題点は、Person
ノードはすでにを作成し、私は今それにemail
プロパティを設定する必要があるということです。
これは私がロードする必要があり、データの小さなサブセットである -
Personid|email
933|[email protected]
933|[email protected]
933|[email protected]
1129|[email protected]
1129|[email protected]
1129|[email protected]
4194|[email protected]
4194|[email protected]
私のクエリはジェネリックにする必要があるので、また、データは、数千行でCSVファイルから来ている、私は」することができます各ノードPerson
ノードのプロパティを設定します。
MATCH (n:TESTPERSON{id:933})
SET n.email = "[email protected]"
RETURN n
MATCH (n:TESTPERSON{id:933})
SET n.email = "[email protected]"
RETURN n
私が考えていたように、これはちょうど、最新の値にemail
プロパティを上書きする -
はここの回答で、とサイファーのドキュメント上で見た後、私はのNeo4jはあなたがプロパティ値として配列/コレクション(同じタイプの複数の値)を設定することができ、その後、私はこれを試したことが判明 -
あなたが見ることができるように、email
プロパティは、現在複数の値を持っている -
// CREATE test node
CREATE (n:TESTPERSON{id:933})
RETURN n
// at this time, this node does not have any `email` property, so setup
// email as an array with one string value
MATCH (n:TESTPERSON{id:933})
SET n.email = ["[email protected]"]
RETURN n
// Now, using +=, I can append to the array of strings
MATCH (n:TESTPERSON{id:933})
SET n.email = n.email + "[email protected]"
RETURN n
// add a third value to array
MATCH (n:TESTPERSON{id:933})
SET n.email = n.email + "[email protected]"
RETURN n
ここでの結果です。
しかし、私のCSVファイルには何千もの行があるので、これを行うには一般的なクエリが必要です。
私はドキュメントhereごとにCASE
文を使用して考えて、これを試してみました -
MATCH (n:TESTPERSON {id:933})
CASE
WHEN n.email IS NULL THEN SET n.email = [ "[email protected]"]
ELSE SET n.email = n.email + "[email protected]"
RETURN n
しかし、これは単なるエラースロー - mismatched input CASE expecting ;
を。 CASE
エラーが固定されている場合でも、
LOAD CSV WITH HEADERS FROM 'FILEURL' AS line FIELDTERMINATOR `|`
MATCH (n:TESTPERSON {id:toInt(line.Personid)})
CASE
WHEN n.email IS NULL THEN SET n.email = [line.email]
ELSE SET n.email = n.email + line.email
をしかし、これはうまくいく場合は私も知っていない -
私はCSVは、このようなファイルのための汎用的な方法として、このクエリを使用することができます期待していました。
私は本当に困っていて、助けていただければ幸いです。ありがとうございました。
ありがとう!これは完全に機能しました。私が実行したクエリは次のとおりです - 'CSVをヘッダからロード 'fileURL" AS行 FIELDTERMINATOR' | ' MATCH(n:TESTPERSON {id:toInt(line.Personid)}) SET n.email = COALESCE(n.email、[])+ line.email' –