Импорт CSV в Neo4j, где несколько столбцов имеют пустые ячейки - PullRequest
0 голосов
/ 30 апреля 2020

Я ищу для импорта CSV, где записи в столбцах имеют нулевые значения (пусто). Существует вероятность того, что в любом столбце может быть пустая запись, поэтому в конечном итоге запрос должен обрабатывать любой столбец. Вот пример моей таблицы и пример ожидаемого вывода графика:

Group       Capability      Functionality   Status        Dev    Input         Output  
Pipeline    DataIngest      Read CSV        Complete      Ben    source.csv    masterTable
Pipeline    DataQuality     Quality score   Complete             masterTable
Analytics   Summary         Minimum score   In progress   Jill   masterTable   dataSummary  
Analytics   Summary         Maximum score   In progress          masterTable   dataSummary 
Analytics   Prediction      Future score                  
Output      Report          Bar chart       Not started   Ben    dataSummary
Output      Report          Line chart      Not started   Fred

Expected graph

Вот то, что я пробовал, что делает не производить то, что я ожидал. Запрос вызывает следующие проблемы:

  1. Функциональность не является собственным помеченным узлом (это часть возможностей)
  2. Свойства не сохраняются в функциональности (это может быть связано с проблемой 1 )
CREATE CONSTRAINT ON (g:Group) ASSERT g.name is UNIQUE;
CREATE CONSTRAINT ON (c:Capability) ASSERT c.name is UNIQUE;
CREATE CONSTRAINT ON (f:Functionality) ASSERT f.name is UNIQUE;
LOAD CSV WITH HEADERS FROM 'file:///MasterSheet.csv' AS line

WITH line
MERGE (g:Group {name: line.Group})
MERGE (c:Capability {name: line.Capability})
FOREACH(x IN CASE WHEN line.DevStage IS NULL THEN [] ELSE [1] END |
  MERGE (f:Functionality {name: line.Functionality, status: line.Status, developer: line.Dev}))
MERGE (i:Data {name: line.Input})
MERGE (o:Data {name: line.Output})

CREATE UNIQUE (g)-[:PART_OF]->(c)
CREATE UNIQUE (c)-[:HAS]->(f)
CREATE UNIQUE (f)-[:INPUT]->(i)
CREATE UNIQUE (f)-[:OUTPUT]->(o)

1 Ответ

1 голос
/ 30 апреля 2020

У вас есть несколько проблем.

  1. Большая проблема в том, что ваш файл с разделителями-запятыми (CSV) плохо отформатирован. По умолчанию, как следует из названия, файл CSV должен использовать символ запятой в качестве разделителя значений. В вашем файле данных нет запятых. Вот правильно отформатированная версия вашего файла:

    Group,Capability,Functionality,Status,Dev,Input,Output
    Pipeline,DataIngest,Read CSV,Complete,Ben,source.csv,masterTable
    Pipeline,DataQuality,Quality score,Complete,,masterTable
    Analytics,Summary,Minimum score,In progress,Jill,masterTable,dataSummary
    Analytics,Summary,Maximum score,In progress,,masterTable,dataSummary
    Analytics,Prediction,Future score
    Output,Report,Bar chart,Not started,Ben,dataSummary
    Output,Report,Line chart,Not started,Fred
    

    Обратите внимание, что «пустые» значения представлены последовательными запятыми или, если они находятся в конце строки, они просто опускаются. Значения могут иметь встроенные пробелы.

  2. У вас есть опечатка. DevStage должно быть Dev.

  3. Предложения, зависящие от f, не должны выполняться, пока не создан узел f, и они должны выполняться, когда f находится в сфере. f выходит за рамки предложения FOREACH.

  4. Последние версии neo4j больше не поддерживают CREATE UNIQUE, и вместо него следует использовать MERGE.

Вот запрос, который решает проблемы со 2 по 4 и использует вышеуказанный правильный формат данных:

LOAD CSV WITH HEADERS FROM 'file:///MasterSheet.csv' AS line
MERGE (g:Group {name: line.Group})
MERGE (c:Capability {name: line.Capability})
MERGE (g)-[:PART_OF]->(c)
FOREACH(x IN CASE WHEN line.Dev IS NOT NULL THEN [1] END |
  MERGE (f:Functionality {name: line.Functionality, status: line.Status, developer: line.Dev})
  MERGE (c)-[:HAS]->(f)
  FOREACH(x IN CASE WHEN line.Input IS NOT NULL THEN [1] END |
    MERGE (i:Data {name: line.Input})
    MERGE (f)-[:INPUT]->(i)
  )
  FOREACH(x IN CASE WHEN line.Output IS NOT NULL THEN [1] END |
    MERGE (o:Data {name: line.Output})
    MERGE (f)-[:OUTPUT]->(o)
  )
)

ПРИМЕЧАНИЕ. Ожидаемая визуализация выходных данных не возможно с вашими данными образца.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...