neo4j - 可选匹配上的 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"
解决方案
您可以做到这一点的一种方法是使用模式理解代替可选匹配。这会将所有有订单的客户收集到一个列表中,然后您可以使用 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)
)
...