Создание связей узлов одного типа в Neo4j Cypher - PullRequest
1 голос
/ 29 февраля 2020

Вот часть из фрейма данных, с которым я работаю:

A_PERSON, B_PERSON, MESSAGE_TIME
SARAH, RON, 13:20 pm
RON, TIM, 13:33 pm
TIM, MARTHA, 13:45 pm
RON, LARRY, 13:35 pm
LARRY, JIM, 13:38 pm

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

Я пробовал что-то вроде этого:

load csv with headers 
from "file:\\df.csv" as row 
create(m: Message {a_person: row.A_PERSON, b_person: row.B_PERSON, time: row.MESSAGE_TIME})

, чтобы потом я мог сопоставить их, но это не представляется возможным. Результат содержит несколько дубликатов A_PERSON из-за второго и третьего ярлыка. Поэтому я не понимаю, как создавать уникальные узлы и связывать их друг с другом. Возможно ли это сделать? И если это так, то как?

1 Ответ

1 голос
/ 29 февраля 2020

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

MERGE создаст человека, если его не существует, или MATCH его, если они существуют.

LOAD CSV WITH HEADERS 
FROM "file:\\df.csv" AS row 
MERGE (a_person:Person {name: row.A_PERSON})
MERGE (b_person:Person {name: row.B_PERSON})
MERGE (a_person)-[:SENT_MESSAGE {time: row.MESSAGE_TIME}]->(b_person)

или, если вы хотите, чтобы сообщение было узлом, вы могли бы сделать что-то вроде этого.

LOAD CSV WITH HEADERS 
FROM "file:\\df.csv" AS row 
MERGE (a_person:Person {name: row.A_PERSON})
MERGE (b_person:Person {name: row.B_PERSON})
MERGE (a_person)-[:SENT_MESSAGE]->(:Message {time: row.MESSAGE_TIME})-[:TO]->(b_person)
...