![](/img/trans.png)
[英]How to retrieve a list of unique paths between two nodes in my neo4j graph using 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.