#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. наконец, я это сделал, но я выбрал вид ниже. Как можно запустить один и тот же код, и мы получили разные результаты?