Создание иерархической структуры с помощью Cypher

Я новичок в Neo4j, и я застрял на одной простой проблеме в течение целого дня. Это должно быть очень просто исправить, но я просто не могу сделать это правильно! Я пытаюсь смоделировать иерархическую структуру компании (от генерального директора до стажера). У меня есть файл cvs с номерами Employee_ID и названиями их должностей. В том же файле у меня есть другой столбец с идентификационными номерами менеджеров сотрудников. Таким образом, в каждой строке у меня есть 3 ячейки: идентификатор сотрудника, должность, идентификатор руководителя сотрудника, и у меня есть 30 строк (на данный момент).

(Например: рядом с идентификатором сотрудника Джона есть идентификатор сотрудника Сэма, поскольку Сэм является менеджером Джона. Сэм также отображается в столбце "Сотрудник", а рядом с его идентификатором находится идентификатор Марка, поскольку Марк является менеджером Сэма… и т. Д.)

Кажется, что это очень похоже на классический пример Actor-[ACTED_IN]->Movie, но в этом случае у меня нет 30 узлов актеров и 30 узлов фильмов, и я не уверен, как построить 30 отношений между теми же 30 узлами.

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

Я уверен, что это простая проблема, но, как я уже сказал, я новичок в Neo4j, и я действительно могу использовать помощь!

ОБНОВЛЕНИЕ: мне удалось заставить это работать, добавляя идентификаторы менеджеров как свойство в узлах Сотрудников.

ЗАГРУЗИТЬ CSV С ЗАГОЛОВКАМИ ИЗ "file: ///Personnel.csv" AS row FIELDTERMINATOR ';'

MERGE (person: Person {employee_ID: row.ID, job_title: row.Jobtitle, manager_ID: row.ManagerID})

С *

МАТЧ (p1: персона)

МАТЧ (p2: персона)

ГДЕ p2.employee_ID = p1.manager_ID

MERGE (p1) - [r: WORKS_UNDER] - (p2)

Я уверен, что должен быть способ сделать это, который не требует, чтобы я добавил идентификаторы менеджеров как свойство, но я не могу понять это:(

2 ответа

Если вы получаете новые неожиданные узлы, то, скорее всего, вы используете MERGE для всего шаблона вместо того, чтобы сначала объединять каждый узел, а только потом объединять отношения между ними.

MERGE похож на матч, за которым следует CREATE (если матч не удался). Любые элементы шаблона, которые еще не связаны, будут созданы.

Вот статья базы знаний о том, как лучше понять, как работает MERGE.

Убедитесь, что вы создали ограничение на свой бизнес-идентификатор

 CREATE CONSTRAINT ON (n:<LabelName>) ASSERT n.<propertyKey> IS UNIQUE
Другие вопросы по тегам