Импорт массивного набора данных в Neo4j, где каждая сущность имеет разные свойства - PullRequest
1 голос
/ 19 мая 2019

Я пытаюсь выполнить массовую загрузку массива данных в один экземпляр Neo4j.Каждый узел будет представлять общий Entity, который будет иметь определенные свойства, например:

  • метка
  • описание
  • дата

В дополнение к этому существует ноль или более свойств, специфичных для типа Entity, поэтому, например, если Entity является Book, свойства будут выглядеть примерно так:

  • label
  • описание
  • дата
  • автор
  • впервые опубликовано
  • ...

И если Entity является Car, свойства будут выглядеть примерно так:

  • label
  • description
  • дата
  • марка
  • модель
  • ...

Я впервые попыталсяимпортируйте набор данных путем потоковой передачи каждого Entity из файловой системы и использования Cypher для вставки каждого узла (около 200 миллионов объектов и 400 миллионов связей).Это было слишком медленно (как я и ожидал, но попробовать стоит).

Поэтому я использовал инструмент массового импорта neo4j-admin import, который работает над файлом CSV, в котором для каждого свойства указаны заголовки.У меня проблема в том, что я не вижу способа добавить дополнительные свойства, специфичные для каждого Entity.Единственное решение, которое я могу придумать, - это включить столбец CSV для каждого возможного свойства, выраженного в наборе сущностей, однако я верю, что у меня будет множество избыточных свойств для всех моих сущностей.

EDIT1

Каждый Entity уникален, поэтому будет несколько типов 1M + (метки в Neo4j)

Любые предложения о том, как этого добиться, будут оценены.

1 Ответ

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

Команда import neo4j-admin поддерживает импорт из нескольких файлов узлов и взаимосвязей.

Поэтому, чтобы поддерживать несколько «типов» узлов (называемых labels в neo4j), вы можете разделить ваш оригинальный CSV-файл на отдельные файлы, по одному для каждого «типа» сущности. Каждый файл может иметь столбцы данных, относящиеся к этому типу.

[ОБНОВЛЕНО]

Вот один из способов поддержки импорта узлов, имеющих произвольные схемы, из файла CSV.

  1. Файл CSV не должен иметь заголовка.
  2. Каждое свойство в строке CSV должно быть представлено смежной парой значений: 1 для имени свойства и 1 для значения свойства.

С таким CSV-файлом этот код (который использует функцию APOC apoc.map.fromValues ​​) должен работать:

LOAD CSV FROM "file:///mydata.csv" AS line
CREATE (e:Entity)
SET e = apoc.map.fromValues(line);

ПРИМЕЧАНИЕ: приведенный выше код будет использовать строки для всех значений. Если вы хотите, чтобы значения некоторых свойств были целыми числами, логическими значениями и т. Д., То вместо этого вы можете сделать что-то подобное (но это, вероятно, целесообразно, только если одно и то же свойство встречается часто; если свойство не существует в строке, никакое свойство не будет создается в узле, но это будет тратить некоторое время):

LOAD CSV FROM "file:///mydata.csv" AS line
WITH apoc.map.fromValues(line) AS data
WITH apoc.map.setKey(data, 'foo', TOINTEGER(data.foo)) AS data
CREATE (e:Entity)
SET e = apoc.map.fromValues(line);
...