次のようなcsvの列があります。
このコードを使用して、日付の分割がどのように機能しているかをテストしています。
LOAD CSV WITH HEADERS FROM
'file:///..some_csv.csv' AS line
WITH
SPLIT(line.date_of_birth, '/') AS date_of_birth
return date_of_birth;
このコードブロックは正常に機能し、期待どおりの結果が得られます。これは、各日付の3つの値のコレクション、または日付がない場合はnull
です(たとえば、
[4, 5, 1971]
[0, 0, 2003]
[0, 0, 2005]
. . .
null
null
. . .
私の質問は、作成されたnullのこの問題は何ですか?nullがあるときにMERGEを実行できないのはなぜですか?
LOAD CSV WITH HEADERS FROM
'file:///..some_csv.csv' AS line
WITH
SPLIT(line.date_of_birth, '/') AS date_of_birth, line
MERGE (p:Person {
date_of_birth: date_of_birth
});
上記のこのブロックは私にエラーを与えます:
Cannot merge node using null property value for date_of_birth
私は周りを検索して、このエラーについて 他に1つSO question を見つけましたが、答えはありません。他の検索は役に立ちませんでした。
値がない場合、Neo4jは単に要素を作成しないという印象を受けました。
結局のところ、ノードを生成するための値がない場合、ノードをどのように生成できるのでしょうか?したがって、IDが欠落していないことがわかっているので、IDと日付をマージできるので、Neo4jは常に値を参照します。
しかし、このコードはそれよりうまくいきませんでした(同じエラーメッセージ)。
LOAD CSV WITH HEADERS FROM
'file:///..some_csv.csv' AS line
WITH
SPLIT(line.date_of_birth, '/') AS date_of_birth, line
MERGE (p:Person {
ID: line.ID
,date_of_birth: date_of_birth
});
私の次のアイデアは、おそらくこのエラーはスラッシュでnull値を分割しようとしているためであるということです?多分問題全体はSPLIT
が原因です。
しかし、悲しいかな、これに単純化すると同じエラー:
LOAD CSV WITH HEADERS FROM
'file:///..some_csv.csv' AS line
WITH line
MERGE (p:Person {
subject_person_id: line.subject_person_id
,date_of_birth: line.date_of_birth
});
だから私は本当にエラーの原因を理解していません。これを見てくれてありがとう。
[〜#〜]編集[〜#〜]
@ stdob--と@cybersamはどちらも同じように優れた応答で答えました。Google経由でここに来た場合は、両方が受け入れられたと見なしてください。
@cybersamが言ったように、マージがスコープ内でnullに設定されているクエリではうまく機能しません。したがって、 作成時および一致時 を使用できます。
LOAD CSV WITH HEADERS FROM
'file:///..some_csv.csv' AS line
MERGE (p:Person {
subject_person_id: line.subject_person_id
})
ON CREATE SET p.date_of_birth = line.date_of_birth
ON MATCH SET p.date_of_birth = line.date_of_birth
MERGE
などの一部のCypherクエリは、NULL
値ではうまく機能しません。
MERGE
でこの状況を処理するためのややトリッキーな回避策は、FOREACH
句を使用してMERGE
を条件付きで実行することです。このクエリはあなたのために働くかもしれません:
LOAD CSV WITH HEADERS FROM 'file:///..some_csv.csv' AS line
FOREACH (x IN CASE WHEN line.date_of_birth IS NULL THEN [] ELSE [1] END |
MERGE (:Person {date_of_birth: SPLIT(line.date_of_birth, '/')})
);
または、COALESCE(n.property?, {defaultValue})
を使用できます
私がかなり気に入っているもう1つの解決策は、次のように、対象のフィールドがNULLである行をスキップするようにサイファーに指示することです。
USING PERIODIC COMMIT #
LOAD CSV WITH HEADERS FROM
'file:///.../csv.csv' AS line
WITH line, SPLIT(line.somedatefield, delimiter) AS date
WHERE NOT line.somedatefield IS NULL
[THE REST OF YOUR QUERY INVOLVING THE FIELD]