簡體   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