2016-05-06 11 views
7

Mam kolumny w pliku CSV, który wygląda tak:Nie można MERGE z wartościami null; „Nie można połączyć węzeł stosując zerową wartość właściwości” w neo4j

enter image description here

używam tego kodu, aby przetestować, jak podział terminach pracuje:

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; 

blok ten kod działa poprawnie i daje mi to, czego oczekuję, która jest zbiorem trzech wartości na każdy dzień, a może null jeśli nie było żadnej daty (np

[4, 5, 1971] 
[0, 0, 2003] 
[0, 0, 2005] 
. . . 
null 
null 
. . . 

Moje pytanie brzmi, jaki jest problem z tworzonymi zerami i dlaczego nie mogę wykonać MERGE, gdy są wartości null?

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 
}); 

Blok powyżej daje mi błąd:

Cannot merge node using null property value for date_of_birth 

Szukałem wokół i tylko znaleźć one other SO question o tym błędzie, który nie ma odpowiedzi. Inne wyszukiwania nie pomogły.

Miałem wrażenie, że jeśli nie ma wartości, to Neo4j po prostu nie tworzy elementu.

Wyobraziłem sobie, że nie można wygenerować węzła, ponieważ w końcu, jak można wygenerować węzeł, jeśli nie ma żadnej wartości do wygenerowania? Tak więc, ponieważ wiem, że nie ma żadnego identyfikatora, może uda mi się MERGE z identyfikatorem i datą, więc Neo4j zawsze widzi wartość.

ale ten kod nie wypadły lepiej (sam komunikat o błędzie):

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 
}); 

Mój następny pomysł, że być może jest to błąd dlatego staram się podzielić wartość NULL w ukośniki? Może cały problem wynika z SPLIT.

Ale niestety, ten sam błąd, gdy uproszczone do tego:

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 
}); 

Więc ja naprawdę nie rozumiem przyczynę błędu. Dzięki za spojrzenie na to.

EDIT

Zarówno @ stdob-- i @cybersam oba odpowiedział równie doskonałe odpowiedzi, jeśli przyszedł tu przez Google należy rozważyć je tak, jakby obie były akceptowane

+0

Otrzymuję ten błąd, mimo że nie mam żadnych wartości pustych lub pustych w ogóle. – pl80

+1

Wyobraźmy sobie: ten błąd wystąpi również podczas importowania z pliku CSV, a kolumna znajduje się wewnątrz list zwrotnych (np. Ze względu na spacje) ORAZ POSIADA CZYNNIKI ZAGRANICZNE. – pl80

Odpowiedz

9

Jak @cybersam powiedział scalania dobrze nie działa z zapytaniami w których właściwości są ustawiane w zakresie w null.Tak, można użyć on create and on match:

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 
6

Niektóre Cypher zapytań, jak MERGE, nie działają dobrze z wartościami NULL.

Drobiazgowym sposobem obejścia tego problemu z MERGE jest użycie klauzuli FOREACH do warunkowego wykonania MERGE. To zapytanie może pracować dla Ciebie:

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

Albo można użyć COALESCE(n.property?, {defaultValue})

+0

dlaczego znak zapytania po 'własności'? i czy {} ma oznaczać wymaganą wartość, jak w notacji Backusa-Naura? – ekkis

1

Innym rozwiązaniem, że byłem raczej lubi, to po prostu powiedzieć Cypher pominąć wierszy, w których pole zainteresowań jest NULL jako następujący:

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] 
+0

Bardzo eleganckie rozwiązanie IMO. – darefilz

Powiązane problemy