Cyper在可选比赛中合并

时间:2019-02-14 20:25:58

标签: neo4j cypher

我试图根据我的可选匹配中的关系来查看是否存在节点: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"

1 个答案:

答案 0 :(得分:2)

执行此操作的一种方法是使用pattern comprehension代替“可选匹配”。这会将所有拥有订单的客户收集到一个列表中,然后您可以使用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)
)
...