Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/neo4j/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Neo4j:使用Cypher创建具有唯一节点的图形_Neo4j_Cypher - Fatal编程技术网

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 *