Neo4j,Cypher:有条件的创造

时间:2014-07-17 12:21:30

标签: neo4j cypher

我有一个特定的问题来制作条件创建语句。我不能在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行对于ynullm的情况。

在运行..

的同一案例中,null未返回.... WITH m OPTIONAL MATCH (x)-[r1:FeedNext{user_id:USER_ID}]->(m)-[r2:FeedNext{user_id:USER_ID}]->(y) RETURN m
m

有什么方法可以在所有情况下返回{{1}}的值?

2 个答案:

答案 0 :(得分:8)

WHERE条件限制CREATE,确保xy NULL RETURN永远不会达到CREATEFOREACH也达不到子句。如果要返回是否创建,则必须仅过滤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}是一个输入参数,有条件选择任一合并路径。

由于