Neo4j:使用Cypher创建具有唯一节点的图形
我有一个发送者和接收者表:Neo4j:使用Cypher创建具有唯一节点的图形,neo4j,cypher,Neo4j,Cypher,我有一个发送者和接收者表: Table A: +------+--------+ |sender|receiver| +------+--------+ | A| B| | B| C| | C| D| | D| A| | E| B| | A| D| |
Table A:
+------+--------+
|sender|receiver|
+------+--------+
| A| B|
| B| C|
| C| D|
| D| A|
| E| B|
| A| D|
| E| C|
+------+--------+
我想创建一个从“发送方”到“接收方”的连接图。例如,A-(rel)->B
发送方列中的值也可以出现在接收方列中。但是,我不希望节点A、B、C、D和E在我的图中重复。它们只能在最终图形中出现一次
我试着这样做:
LOAD CSV WITH HEADERS FROM 'file:///graph' AS row
CREATE (:sender_node { sender: row.sender})
MATCH (n:sender_node)
WITH n.sender AS sender, collect(n) AS nodes
WHERE size(nodes) > 1
FOREACH (n in tail(nodes) | DELETE n)
LOAD CSV WITH HEADERS FROM 'file:///graph' AS row
CREATE (:receiver_node { receiver: row.receiver})
MATCH (n:receiver_node)
WITH n.receiver AS receiver, collect(n) AS nodes
WHERE size(nodes) > 1
FOREACH (n in tail(nodes) | DELETE n)
LOAD CSV WITH HEADERS FROM 'file:///graph' AS row
MATCH (from_var:sender_node {sender: row.sender}),(to_var:receiver_node {receiver:row.receiver})
CREATE (from_var)-[:rel]->(to_var)
RETURN *
我基本上分别删除了发送方和接收方节点中的重复项。但由于节点A、B、C和D同时出现在“发送方”和“接收方”列中,因此它们在图中出现了两次。我想更正此部分。电子邮件关系的开始节点隐式地是发件人。
电子邮件
关系的结束节点隐式地是接收者。因此,发送方和接收方节点不应该有不同的标签,这是多余的,并且使数据模型过于复杂
相反,您应该只为这两种节点使用User
标签。这也将帮助您避免重复,尤其是当您使用子句而不是
例如:
LOAD CSV WITH HEADERS FROM 'file:///graph' AS row
MERGE (sender:User {id: row.sender})
MERGE (receiver:User {id: row.receiver})
MERGE (sender)-[:EMAILS]->(receiver)
RETURN *