繁体   English   中英

Neo4j:使用 Cypher 创建具有唯一节点的图

[英]Neo4j: Create a graph with unique nodes using Cypher

我有一个发送者和接收者表:

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 出现在“发送方”和“接收方”列中,因此它们在图中出现了两次。 我想纠正这部分。

EMAILS关系的起始节点隐含地是发送者。 EMAILS关系的结束节点隐含地是一个接收者。 因此,发送者和接收者节点不应该有不同的标签,这是多余的,并且会使您的数据 model 过于复杂。

相反,您应该只对这两种节点使用User label。 这也将帮助您避免重复,尤其是当您使用MERGE子句而不是CREATE时。

例如:

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 *

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM