web-dev-qa-db-ja.com

null値でMERGEすることはできません。 neo4jの「nullプロパティ値を使用してノードをマージできない」

次のようなcsvの列があります。

enter image description here

このコードを使用して、日付の分割がどのように機能しているかをテストしています。

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経由でここに来た場合は、両方が受け入れられたと見なしてください。

13
Monica Heddneck

@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
13
stdob--

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, '/')})
);
11
cybersam

または、COALESCE(n.property?, {defaultValue})を使用できます

5
Val

私がかなり気に入っているもう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]
3
Tshimanga