Как импортировать CSV среднего размера с большим количеством нулей и столбцов в Neo4j - PullRequest
1 голос
/ 21 апреля 2019

Мне нужно импортировать существующую онтологию лекарств в Neo4j. Эта онтология хранится в файле CSV; он содержит ~ 30000 строк и 192 столбца на строку (то есть значения). Дело в том, что из этих 192 столбцов подавляющее большинство из них (~ 170) имеют нулевые значения почти во всех строках.

Примеры, с которыми я сталкивался до сих пор, включают гораздо более простые схемы (с 4 или 5 столбцами). Кроме того, я не нашел никаких полезных идей о том, как бороться с моделями такого типа. Тем не менее, я нашел информацию относительно нулевых значений в целом; тем не менее, будучи новичком в Neo4j, я не уверен, как лучше импортировать данные в CSV-файл. Насколько я знаю, это альтернативы:

  1. Импорт поэтапно. Согласно вебинару на официальной веб-странице Neo4j, я мог бы сначала импортировать столбец идентификатора, а затем, для каждого столбца «X» с нулевыми значениями, фильтровать ненулевые значения в столбце X и выгружать оба столбца в новый файл CSV. Эта последняя операция привела бы к коду Cypher, подобному следующему (при условии, что все лекарства уже импортированы):
USING PERIODIC COMMIT 10000
LOAD CSV WITH HEADERS FROM "file:///Users/user/ontology_with .csv" AS line

MATCH (drug:Drug {id: line.`Class ID`})
MATCH (d:Drug {id: line.`X`})
CREATE (drug)-[:ACTIVATES_DRUG]->(d)
  1. Использование оператора FOR EACH, что, как мне кажется, упрощает предыдущую операцию:
USING PERIODIC COMMIT 10000
LOAD CSV WITH HEADERS FROM "file:///Users/user/ontology_with .csv" AS line
FOREACH(n IN (CASE WHEN line.activates IS NULL THEN [] ELSE [1] END) |
    MERGE (drug:Drug {id: line.`Class ID`})
    CREATE (n)-[:ACTIVATES_DRUG]->(drug)
)
  1. Использование пакетного импортера. Хотя в зависимости от размера CSV (~ 30000 строк) эту опцию следует отклонить, может ли она быть полезной с учетом нулевых значений? Как мне справиться с нулевыми значениями, если лучшим вариантом окажется пакетный импортер?

Принимая во внимание особенности моего исходного файла CSV, особенно огромное количество столбцов, какой способ импорта данных в Neo4j вы бы предложили? Буду признателен за советы экспертов или опытных пользователей Neo4j.

Ответы [ 2 ]

2 голосов
/ 21 апреля 2019

Я сталкивался с подобной ситуацией и раньше, и решил использовать что-то наиболее близкое к вашей первой альтернативе - хотя с заявлением об отмене, которое делало предварительную фильтрацию CSV ненужной.

Предполагая, что индекс 0 предоставил идентификатор для (наркотик) и ваши идентифицируемые значения для (d) из индекса 1 - 191:

USING PERIODIC COMMIT 10000
LOAD CSV FROM "file:///Users/user/ontology_with .csv" AS line
UNWIND range(1,191) as i
MATCH (drug:Drug {id: line[0]})
MATCH (d:Drug {id: line[i]})
CREATE (drug)-[:ACTIVATES_DRUG]->(d)

Нулевые значения не должны ничего возвращать для MATCH (d: Drug {id: line [i]}) , и поэтому будут пропущены.

1 голос
/ 25 мая 2019

В конце концов, все оказалось немного сложнее. В большинстве столбцов CSV хранились многозначные отношения со значениями, разделенными '|', поэтому мне пришлось скорректировать предыдущий ответ. Вот пример таких многозначных отношений, на случай, если они пригодятся кому-либо еще:

LOAD CSV WITH HEADERS FROM "file:///DINTO_CSVLint.csv" AS line
WITH line, SPLIT(line.`may interact with`, '|') AS ddiDrugs
UNWIND ddiDrugs AS i
MATCH (sourceDrug:Drug {preferredLabel: line.`Preferred Label`})
MATCH (destDrug:Drug {uri: i})
MERGE (sourceDrug)-[r:MAY_INTERACT_WITH]->(destDrug)
RETURN r;

Я использовал аналогичный подход в остальных отношениях.

...