Создавайте уникальные узлы и создавайте метки с несколькими значениями

Я новичок в neo4j, и мой вопрос может выглядеть очень просто. У меня есть файл CSV, со следующей структурой: Состав

Id - это идентификатор человека, а Fam - идентификатор проекта, в котором принимал участие этот человек. Я хочу соединить людей, если они работали над одним проектом.

Какова лучшая модель данных в этом случае? Первое, что пришло мне в голову, это сделать id-узел и метку Fam. Но я не знаю, как загрузить несколько меток на один узел. Во-вторых, сделать и ID и Fam как узлы, а затем сделать запрос, чтобы показать связанных сотрудников.

Для второго случая код будет таким:

LOAD CSV WITH HEADERS FROM 'file:///PNG20161202.csv' AS line
MERGE (n:id {Person_id: toInt(line.id)})
WITH line, n
MERGE (m:Fam {Fam_id: toInt(line.Fam)})
WITH m,n
MERGE (n)-[:WORK_IN]->(m);

Но я не знаю, как отобразить только связанный идентификатор. (Мне нужно экспортировать и визуализировать эту сеть в Gephi, только идентификатор)

Для первого случая я знаю, как установить отношения между идентификаторами, но не знаю, как написать запрос LOAD CSV, который создаст идентификатор с помощью мультиметки.

Предложения очень ценятся.

1 ответ

Решение

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

Это, я думаю, было самой важной частью вашего описания:

"Идентификатор - это идентификатор человека, а Fam - идентификатор проекта, в котором принимал участие этот человек. Я хочу связать людей, если они работали над одним проектом".

Важные "вещи", которые вы упоминаете, - это люди и проекты. Поэтому мне кажется, что это те ярлыки, с которыми вы должны работать: Person и:Project. Идентификаторы, как правило, уникальны, поэтому они, вероятно, должны быть свойствами узлов: Person и:Project с уникальными ограничениями для меток и свойств идентификаторов.

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

CREATE CONSTRAINT ON (p:Person)
ASSERT p.ID IS UNIQUE

CREATE CONSTRAINT ON (pr:Project)
ASSERT pr.ID IS UNIQUE

Ваш импорт будет только соединяться: Персоны: Проекты, над которыми они работали.

LOAD CSV WITH HEADERS FROM 'file:///PNG20161202.csv' AS line
MERGE (n:Person {ID: toInt(line.id)})
MERGE (m:Project {ID: toInt(line.Fam)})
MERGE (n)-[:WORKED_ON]->(m);

Как только вы это сделаете, вам будет легко запрашивать: лиц, которые работали над тем же:Project, и вам не нужен LOAD CSV для этого.

РЕДАКТИРОВАТЬ

Для создания: ЗНАЕТ отношения между: Лицами, которые работали над тем же: Проектами, вы можете использовать этот запрос:

MATCH (p1:Person)-[:WORKED_ON]->(:Project)<-[:WORKED_ON]-(p2:Person)
WITH DISTINCT p1, p2
MERGE (p1)-[:KNOWS]-(p2)
Другие вопросы по тегам