Neo4j,Cypher:条件创建
我有一个特定的问题来创建条件create语句。我不能在这里使用Neo4j,Cypher:条件创建,neo4j,cypher,Neo4j,Cypher,我有一个特定的问题来创建条件create语句。我不能在这里使用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)-[:Feed
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
和y
为null
时,返回0行
而对于运行时的相同情况,m
不会返回null
....
WITH m
OPTIONAL MATCH (x)-[r1:FeedNext{user_id:USER_ID}]->(m)-[r2:FeedNext{user_id:USER_ID}]->(y)
RETURN m
如何在所有情况下返回
m
的值?如果x
和y
为NULL
,则确保永远不会达到CREATE
条件限制的。如果要返回是否创建,则只需过滤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
如果您还希望根据条件进行匹配,这是我使用的一种变通方法。希望能有帮助
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}是一个输入参数,它有条件选择合并路径
谢谢我不明白,您的意思是,对于您的第二个查询,x
和y
为空,而m
为空吗?您能在a中显示它吗?一般来说,如果x
和y
为NULL
,您的WHERE
条件限制CREATE
,请确保永远不会达到该限制,但是RETURN
子句也不会达到。如果要返回是否创建,则只需过滤create
子句,例如,在FOREACH
中创建一个集合,该集合在一种情况下为空,在另一种情况下包含x,y
。@jjaderberg是的,完全正确。实际上,m
是这个查询中的输入,来自前面的一个查询,我没有提到(很抱歉)。我正在更新问题中的这个…明白了。我可以分享一个你可以尝试的技巧,它有点迂回,也许其他人可以提出更好的建议。是的,谢谢。请这样做。我刚刚尝试了这个查询,但它给出了以下错误Neo.DatabaseError.Statement.ExecutionFailure
,在尝试CREATE UNIQUE
时,它抛出期望“a”成为节点,但它是空的
它对我有效。这里有一个控制台,它通过匹配(m{uid:“m”})来获得m
,然后粘贴我的查询并用1
替换{USER\u ID}
参数。我也在控制台上进行了尝试。当r1和r2不存在时,它抛出错误:java.lang.NullPointerException
。这是截图你是对的,我放了个脑屁。Coalesce不返回空集合,而是返回第一个非null值,如果没有,则返回null,因此它仅在x
和y
不为null时工作。但是,原理是正确的,我更新了答案,使用CASE
获取空集合。想试试吗?