Невозможно объединить узел с использованием нулевого значения свойства для sourceID. (Данные ICIJ Panama Papers)

Я пытаюсь импортировать файл csv в базу данных Neo4j, вот ссылка на файл CSV http://apps.dealopia.com/offshoreleaks/offshore_leaks_csvs-20170104/Intermediaries.csv

Запрос, который я использую для импорта данных CSV в БД,

USING PERIODIC COMMIT 10000
LOAD CSV FROM "http://apps.dealopia.com/offshoreleaks/offshore_leaks_csvs-20170104/Intermediaries.csv" AS line
MERGE (i:Intermediateries{name:line[1],internal_id:line[2],address:line[3],valid_until:line[4],country_codes:line[5],countries:line[6],status:line[7],node_id:line[8],sourceID:line[9]})

Запрос выдает следующую ошибку: - Невозможно объединить узел с использованием нулевого значения свойства для sourceID.

Я нашел несколько полезных ресурсов, но, учитывая размер ICIJ Panama Papers Size, на выполнение потребуется несколько часов, есть ли способ устранить проверку на наличие значений NULL и оптимизировать запрос?


person Ahmar Abdullah    schedule 09.03.2017    source источник


Ответы (2)


Вы неправильно используете индексацию. Индекс начинается с 0, а не с 1. Также в данном csv есть строка заголовка. Поэтому отредактируйте запрос Cypher соответствующим образом.

Измените его на следующее:

USING PERIODIC COMMIT 10000 
LOAD CSV WITH HEADERS FROM "http://apps.dealopia.com/offshoreleaks/offshore_leaks_csvs-20170104/Intermediaries.csv" AS line 
MERGE 
(i:Intermediateries{name:line[0],internal_id:line[1],address:line[2],valid_until:line[3],country_codes:line[4],countries:line[5],status:line[6],node_id:line[7],sourceID:line[8]})

См. Дополнительную информацию в официальной документации - http://neo4j.com/docs/developer-manual/current/cypher/clauses/load-csv/#load-csv-import-data-from-a-csv-file

person Vivek Kumar    schedule 09.03.2017

да, вы можете легко отфильтровать строки с нулевым исходным идентификатором

USING PERIODIC COMMIT 10000 LOAD CSV FROM  "http://apps.dealopia.com/offshoreleaks/offshore_leaks_csvs-20170104/Intermediaries.csv" AS line 
WITH line where line[9] is not null
MERGE (i:Intermediateries{name:line[1],internal_id:line[2],address:line[3],
valid_until:line[4],country_codes:line[5],countries:line[6],status:line[7],node_id:line[8],sourceID:line[9]})

Вы также можете использовать coalesce, если хотите импортировать эти узлы, даже если у них нет идентификатора источника.

USING PERIODIC COMMIT 10000 LOAD CSV FROM  "http://apps.dealopia.com/offshoreleaks/offshore_leaks_csvs-20170104/Intermediaries.csv" AS line 
WITH line,coalesce(line[9],"NoId") as sourceID
MERGE (i:Intermediateries{name:line[1],internal_id:line[2],address:line[3],
valid_until:line[4],country_codes:line[5],countries:line[6],status:line[7],node_id:line[8],sourceID:sourceID})

Я бы создал такой запрос, если бы импортировал это, если у вас есть плагин apoc

USING PERIODIC COMMIT 10000 LOAD CSV WITH HEADERS FROM  "http://apps.dealopia.com/offshoreleaks/offshore_leaks_csvs-20170104/Intermediaries.csv" AS line 
MERGE (i:Intermediateries{internal_id:line.internal_id})
ON CREATE SET i += apoc.map.clean(row.properties,['internal_id'],[])

если у вас нет плагина apoc, вам нужно указать свойства вручную

USING PERIODIC COMMIT 10000 LOAD CSV WITH HEADERS FROM  "http://apps.dealopia.com/offshoreleaks/offshore_leaks_csvs-20170104/Intermediaries.csv" AS line 
MERGE (i:Intermediateries{internal_id:line.internal_id})
ON CREATE SET i.name = line.name,i.address = line.address, i.valid_until = line.valid_until,
i.country_codes = line.country_code, i.countries = line.countries,i.status = line.status,i.node_id = line.node_id,
i.sourceID = line.sourceID,i.note = line.note
person Tomaž Bratanič    schedule 09.03.2017
comment
Проблема не устранена с запросом - person Ahmar Abdullah; 09.03.2017
comment
Последний работает некоторое время, но возвращает ошибку. Невозможно объединить узел с использованием нулевого значения свойства для internal_id - person Ahmar Abdullah; 10.03.2017
comment
Основная проблема здесь в том, что невозможно объединить узлы с нулевыми значениями. Например, MERGE (a{key: value}) всегда будет невозможно сделать, если значение равно нулю. Безопасный способ - MERGE (a) SET a.key = value в качестве последнего примера. Однако в этом случае, как я полагаю, internal_id является основным идентификатором посредника, поэтому нам нужно там какое-то значение. Я НАСТОЯТЕЛЬНО предлагаю очистить данные перед импортом, например, добавить internal_id там, где это необходимо, или удалить эти строки. Если это невозможно сделать, то COALESCE (line.internal_id, name) может помочь использовать имя как internal_id. - person yawmoght; 10.03.2017