Neo4j: создайте граф с уникальными узлами, используя Cypher - PullRequest
0 голосов
/ 17 апреля 2020

У меня есть таблица отправителей и получателей:

Table A:

+------+--------+                                                          
|sender|receiver|
+------+--------+ 
|     A|       B|
|     B|       C|
|     C|       D|
|     D|       A|
|     E|       B|
|     A|       D|
|     E|       C|
+------+--------+  

Я хочу создать график с подключениями от «отправителя» к «получателю». Например, A -(EMAILS)-> 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)-[:EMAILS]->(to_var)
RETURN *

Я в основном удалил дубликаты отдельно в узлах отправителя и получателя. Но поскольку узлы A, B, C и D отображаются в столбцах «отправитель» и «получатель», они дважды отображаются на графике. Я хочу исправить эту часть.

1 Ответ

1 голос
/ 17 апреля 2020

Начальный узел отношения EMAILS неявно является отправителем. И конечный узел отношения EMAILS неявно является получателем. Поэтому у вас не должно быть разных меток для узла отправителя и получателя, что является избыточным и делает вашу модель данных слишком сложной.

Вместо этого вам следует просто использовать, скажем, метку User для обоих типов узлов. , Это также поможет вам избежать дубликатов, особенно когда вы используете предложение 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 *
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...