Neo4j

2016-05-07 8 views
2

の日付がMM/DD/YYYYまたはYYYYのいずれかで表示される列は、次のように同じ列内で日付が2つの可能な方法で表されるcsvを持っています。Neo4j

  • MM/DD/YYYY

又は

  • YYYY

2番目の形式は、MM/DDが不明な場合にデータ入力を行う他の人が使用します。

月、日、年をノードの個別のプロパティとして抽出したいと思います。

私が書いた:最初のケース(MM/DD/YYYY)のために正常に動作しますが、ちょうどYYYYと下回っ

LOAD CSV WITH HEADERS FROM 
'file:///...some_csv.csv' AS line 
WITH 
line 
MERGE (p:Person { 
    subject_person_id: line.subject_person_id 
}) 
    ON CREATE SET p.month_of_birth = SPLIT(line.date_of_birth, '/')[0] 
    ON MATCH SET p.month_of_birth = SPLIT(line.date_of_birth, '/')[0] 

を。その2番目のケースでは、月はYYYYに設定されています。これは、それが0番目の要素だからです。

私は、日付形式が存在するいくつかのテストが必要であり、その結果に応じて条件付きでSETを実行する必要があると考えていますか?

私はFOREACHの構文を見ましたが、それを適用しようとしましたが、正しいアプローチではありませんでした。誰にもアドバイスはありますか?ありがとう!

答えて

1

case文で値を条件付きで設定できます。悪い値を得た場合はnullに設定することができます。このようなもの...

LOAD CSV WITH HEADERS FROM 
'file:///...some_csv.csv' AS line 
WITH line 
, case 
    when size(line.date_of_birth) = 10 then 
     SPLIT(line.date_of_birth, '/')[0] 
    else 
     NULL 
    end as month 
MERGE (p:Person { subject_person_id: line.subject_person_id}) 
    ON CREATE SET p.month_of_birth = month 
    ON MATCH SET p.month_of_birth = month 
+1

「N/A」ケースを含める理由はありますか?後で削除する必要がある唯一の理由は、「ELSE」を使用することを選択したためです。 ELSEを離れると、物事を簡素化し、最後のステップをスキップできるようです。 –

1

空の要素の配列を埋める必要があると思います。 exampleの場合:

WITH SPLIT('MM/DD/YYYY', '/') as mdy1 
    SPLIT('YYYY', '/'  ) as mdy2, 
RETURN (EXTRACT(x in RANGE(0, 2 - size(mdy1)) | "") + mdy1) [0] as m1, 
     (EXTRACT(x in RANGE(0, 2 - size(mdy2)) | "") + mdy2) [0] as m2 

hmm ...悪くない。しかし、それはエレガントではありません。 [OK]を、のはsimplifyに試してみましょう:

WITH "MM/DD/YYYY" as mdy1, 
    "YYYY"  as mdy2 
RETURN (["", "", ""] + SPLIT(mdy1, "/")) [ -3.. ][0] as m1, 
     (["", "", ""] + SPLIT(mdy2, "/")) [ -3.. ][0] as m2 

我々はまだ改善できますか?あなたが試してみるまで何ができるかわからない:

WITH "MM/DD/YYYY" as mdy1, 
    "YYYY"  as mdy2  
RETURN (SPLIT("//" + mdy1, "/")) [ -3.. ][0] as m1, 
     (SPLIT("//" + mdy2, "/")) [ -3.. ][0] as m2