Как взять определенный символ из файла csv?

#neo4j #cypher

#neo4j #шифр

Вопрос:

Я новичок в neo4j, и мне нужна ваша помощь!

Я создал узел статьи в neo4j, и я хочу прочитать csv-файл, который содержит информацию о ссылках среди статей (articleId, —[Cites]->,articleId). Формат файла csv следующий

 "1001   9910248"
"1001   9910268"
"9304045    9204040"
"9308122    9203084"
"9308122    9204035"
"9308122    9205041
 

1001 — это идентификатор одной статьи, а 9910248 — идентификатор другой статьи. Я хочу прочитать этот файл и создать следующую связь (статья) -[:CITES]-> (статья). Как я мог это сделать?

Я пробовал ниже, но это не сработало.

 LOAD CSV FROM "file:///C:/Citations.csv" AS line
FIELDTERMINATOR "t" 
MERGE (article:Article {id: line[0]})
WITH article, SPLIT(article.id, " ") AS art
MERGE (article)-[:CITES]->(toarticle:TArticle {id: art})

 

Ответ №1:

Я скопировал ваше содержимое CSV и поместил его в data.csv файл и попытался обработать его как tsv формат, что не сработало, поскольку, вероятно, разделяющие символы не являются табуляциями.

Загрузка файла в формате CSV в браузере выводит следующее в виде строк :

 LOAD CSV FROM "file:///data.csv" AS row
RETURN row

╒══════════════════════╕
│"row"                 │
╞══════════════════════╡
│["1001   9910248"]    │
├──────────────────────┤
│["1001   9910268"]    │
├──────────────────────┤
│["9304045    9204040"]│
├──────────────────────┤
│["9308122    9203084"]│
├──────────────────────┤
│["9308122    9204035"]│
├──────────────────────┤
│["9308122    9205041"]│
└──────────────────────┘
 

Это означает, что существует только один столбец.

Затем мы можем разделить элементы ячейки на пробельные символы :

 LOAD CSV FROM "file:///data.csv" AS row
RETURN row[0], split(row[0], " ")

Text
Code
╒════════════════════╤══════════════════════════════╕
│"row[0]"            │"split(row[0], " ")"          │
╞════════════════════╪══════════════════════════════╡
│"1001   9910248"    │["1001","","","9910248"]      │
├────────────────────┼──────────────────────────────┤
│"1001   9910268"    │["1001","","","9910268"]      │
├────────────────────┼──────────────────────────────┤
│"9304045    9204040"│["9304045","","","","9204040"]│
├────────────────────┼──────────────────────────────┤
│"9308122    9203084"│["9308122","","","","9203084"]│
├────────────────────┼──────────────────────────────┤
│"9308122    9204035"│["9308122","","","","9204035"]│
├────────────────────┼──────────────────────────────┤
│"9308122    9205041"│["9308122","","","","9205041"]│
└────────────────────┴──────────────────────────────┘
 

Как вы можете видеть, между идентификаторами в каждой ячейке более одного пробела, что приводит к созданию массивов элементов разного размера.

Решение состоит в том, чтобы взять первый и последний элементы каждой коллекции :

 LOAD CSV FROM "file:///data.csv" AS row
WITH split(row[0], " ") AS elements
RETURN head(elements) AS article1, last(elements) AS article2

╒══════════╤══════════╕
│"article1"│"article2"│
╞══════════╪══════════╡
│"1001"    │"9910248" │
├──────────┼──────────┤
│"1001"    │"9910268" │
├──────────┼──────────┤
│"9304045" │"9204040" │
├──────────┼──────────┤
│"9308122" │"9203084" │
├──────────┼──────────┤
│"9308122" │"9204035" │
├──────────┼──────────┤
│"9308122" │"9205041" │
└──────────┴──────────┘
 

Теперь вы можете использовать эти идентификаторы для объединения статей и отношений cites :

 LOAD CSV FROM "file:///data.csv" AS row
WITH split(row[0], " ") AS elements
WITH head(elements) AS article1, last(elements) AS article2
MERGE (a1:Article {id: article1})
MERGE (a2:Article {id: article2})
MERGE (a1)-[:CITES]->(a2)
 

введите описание изображения здесь

Если вы хотите обрабатывать идентификаторы как числа, вам нужно преобразовать их в целые числа :

 LOAD CSV FROM "file:///data.csv" AS row
WITH split(row[0], " ") AS elements
WITH head(elements) AS article1, last(elements) AS article2
MERGE (a1:Article {id: toInteger(article1)})
MERGE (a2:Article {id: toInteger(article2)})
MERGE (a1)-[:CITES]->(a2)
 

РЕДАКТИРОВАТЬ на основе данного файла CSV на Github

Этот файл CSV может быть проанализирован как TSV, проблема с кучей, вероятно, потому, что у вас нет индекса :Article(id) , поэтому начните с этого :

 CREATE INDEX ON :Article(id)
 

Затем вы можете загрузить его как файл TSV непосредственно с Github (на моем ноутбуке он был завершен за 6 секунд) :

 LOAD CSV FROM "https://raw.githubusercontent.com/anpetsa/neo4j/main/Citations.csv" AS row
WITH split(row[0], " ") AS elements
WITH head(elements) AS article1, last(elements) AS article2
MERGE (a1:Article {id: toInteger(article1)})
MERGE (a2:Article {id: toInteger(article2)})
MERGE (a1)-[:CITES]->(a2)
 

введите описание изображения здесь

Комментарии:

1. большое вам спасибо за вашу помощь. Я попробовал ваш код, но я получил ошибку java heep space. Возможно ли, что ошибка связана с файлом csv? я попытаюсь загрузить файл csv прямо сейчас.

2. @person Я редактирую ответ дополнительным разделом на основе вашего данного файла

3. я попытался запустить ваш код и взял приведенный ниже Neo. Ошибка ClientError. Инструкция. SemanticError не может объединить следующий узел из-за значения свойства null для ‘id’: (a1:Article {id: null}) (Сбой при обработке файла ‘/ anpetsa/neo4j /main / Citations.csv’ в строке 1.) я также пробовал id в виде строки, но я принял СЛИЯНИЕ (a1:Статья {идентификатор: article1}) СЛИЯНИЕ (a2:Статья {идентификатор: article2}) Ошибка: Neo. Ошибка перехода. Общая информация. Ошибка OutOfMemoryError. Может быть, это ошибка моего ноутбука?

4. наконец, я это сделал, но я выбрал вид ниже. Как можно запустить один и тот же код, и мы получили разные результаты?