Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/neo4j/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Neo4j,Cypher:条件创建_Neo4j_Cypher - Fatal编程技术网

Neo4j,Cypher:条件创建

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

我有一个特定的问题来创建条件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)-[: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
获取空集合。想试试吗?