Neo4j,Cypher:有条件的创造

red*_*vil 5 neo4j cypher

我有一个特定的问题来制作条件创建语句.我不能MERGE在这里使用,因为MATCHAND 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 
Run Code Online (Sandbox Code Playgroud)

返回0行对于何时xy是的情况null.

虽然在运行时m没有返回 null相同的情况..

....
WITH m
OPTIONAL MATCH (x)-[r1:FeedNext{user_id:USER_ID}]->(m)-[r2:FeedNext{user_id:USER_ID}]->(y) 
RETURN m 
Run Code Online (Sandbox Code Playgroud)

m在所有情况下返回价值的方法是什么?

jja*_*erg 8

你的WHERE条件限制CREATE通过确保it's从来没有达到过,如果xyNULL,但随后的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
Run Code Online (Sandbox Code Playgroud)