我有一个特定的问题来制作条件创建语句。我不能在MERGE
使用MATCH
,因为CREATE
和....
WITH m
OPTIONAL MATCH (x)-[r1:FeedNext{user_id:USER_ID}]->(m)-[r2:FeedNext{user_id:USER_ID}]->(y)
WHERE x IS NOT NULL AND y IS NOT NULL
WITH x, y, m, r1, r2
CREATE (x)-[:FeedNext{user_id:USER_ID}]->(y)
DELETE r1, r2
RETURN m
语句不同。这是查询..
x
返回0行对于y
和null
为m
的情况。
在运行..
的同一案例中,null
未返回....
WITH m
OPTIONAL MATCH (x)-[r1:FeedNext{user_id:USER_ID}]->(m)-[r2:FeedNext{user_id:USER_ID}]->(y)
RETURN m
m
有什么方法可以在所有情况下返回{{1}}的值?
答案 0 :(得分:8)
WHERE
条件限制CREATE
,确保x
和y
NULL
RETURN
永远不会达到CREATE
,FOREACH
也达不到子句。如果要返回是否创建,则必须仅过滤FOREACH
子句。一种方法是在x,y
子句中创建和删除。 FOREACH
子句采用集合,您可以通过在一种情况下使集合为空并在另一种情况下包含....
WITH m
OPTIONAL MATCH (x)-[r1:FeedNext {user_id:{USER_ID}}]->(m)-[r2:FeedNext {user_id:{USER_ID}}]->(y)
FOREACH (a IN CASE WHEN x IS NULL THEN [] ELSE [x] END |
FOREACH (b IN CASE WHEN y IS NULL THEN [] ELSE [y] END |
CREATE a-[:FeedNext { user_id:{USER_ID}}]->b
DELETE r1, r2
)
)
RETURN m
来进行过滤。使用嵌套的{{1}},您可以这样做
{{1}}
答案 1 :(得分:0)
如果您还想根据条件进行匹配,这是我使用的解决方法。希望它有所帮助。
OPTIONAL MATCH b2p = (x1)-[r1:FeedNext {user_id:{USER_ID}}]->(m1)
OPTIONAL MATCH b2c = (x2)-[r2:FeedNext {email_id:{EMAIL_ID}}]->(m2)
FOREACH (usertype IN CASE WHEN {USER_TYPE} = 'B2P' AND b2p is not null THEN [1] ELSE [] END | MERGE x1-[:ORDER]->(or:Order{order_id:{ORDER_ID}}))
FOREACH (usertype IN CASE WHEN {USER_TYPE} = 'B2C' AND b2c is not null THEN [1] ELSE [] END | MERGE x2-[:ORDER]->(or:Order{order_id:{ORDER_ID}}))
此处{USER_TYPE}是一个输入参数,有条件选择任一合并路径。
由于