Создавайте уникальные узлы и создавайте метки с несколькими значениями
Я новичок в 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)