首页 > 解决方案 > 可选匹配上的 Cyper 合并

问题描述

我正在尝试根据我的可选匹配中的关系查看 node :Customer 是否存在。然后,如果他们有订单,我想与我的客户建立一些关系。我不确定什么是正确的语法。

MERGE (o:Order {account: 'j593jfsh', id: '35353'})
OPTIONAL MATCH (c:Customer)-[:HAS_ORDER]->(o)
MERGE (c)-[:HAS_SESSION]->(s)
MERGE (c)-[:HAS_ORDER]->(o)
WHERE c IS NOT NULL"

标签: neo4jcypher

解决方案


您可以做到这一点的一种方法是使用模式理解代替可选匹配。这会将所有有订单的客户收集到一个列表中,然后您可以使用 FOREACH 来合并关系。如果没有客户,列表将为空,FOREACH 将没有任何处理。

...
MERGE (o:Order {account: 'j593jfsh', id: '35353'})
WITH o, s, [(c:Customer)-[:HAS_ORDER]->(o) | c] as customers
FOREACH (c in customers | 
 MERGE (c)-[:HAS_SESSION]->(s)
 MERGE (c)-[:HAS_ORDER]->(o)
)
...

推荐阅读