neo4j-在FOREACH子句中以及RETURN子句中声明可用于节点创建的变量

问题描述

我正在使用带有以下标签的neo4j图:商店,用户,产品

这些关系是:(商店)-[:OF]->(用户),(产品)-[:OF]->(用户),(商店)-[:卖]->(产品)>

添加或更新商店时,可以从商店中添加,更新,附加或删除产品。 仅当产品没有其他商店的附件时,才能进行更新。

我有以下正在运行的添加商店查询

OPTIONAL MATCH (user: User {id: $userId} )
CREATE (store:Store)-[:OF]->(user)
SET store = $store
WITH store,user
OPTIONAL MATCH (p: Product {id: "hu1"})-[:OF]->(user)  
WITH store,p,CASE WHEN NOT (:Store)-[:SELL]->(p) OR                 
(:Store {id: '12asd'})-[:SELL]->(p) THEN [1]      
ELSE [] END as array              
FOREACH(
    x in array |              
    MERGE (p)-[:OF]->(user)          
    ON MATCH SET p += $product1         
    ON CREATE SET p = $product1         
    MERGE (store)-[:SELL]->(p)         
) 
RETURN store,p

(看起来很奇怪,我的条件之一是在刚创建商店ID时检查商店ID,但是此代码中的此查询在需要时可以处理更多情况,并且我不会为整个问题烦恼代码

需要进行的修改将商店的创建移至FOREACH语句,因为,如果其中一种产品未通过CASE条件之一,我就不会创建商店。

我尝试使用MERGE在FOREACH语句内移动商店创建-

OPTIONAL MATCH (user: User {id: $userId} ) 
WITH user
OPTIONAL MATCH (p: Product {id: "1"})-[:OF]->(user)  
WITH p,CASE WHEN NOT (:Store)-[:ON]->(p) OR                 
(:Store {id: 'st'})-[:ON]->(p) 
THEN [1]      
ELSE [] END as array              
FOREACH(
    x in array |              
    MERGE (p)-[:OF]->(user)          
    ON MATCH SET p += $product1         
    ON CREATE SET p = $product1         
    MERGE (store:Store {id: 'st'})
    ON MATCH SET store += $store         
    ON CREATE SET store = $store         
    MERGE (store)-[:ON]->(p)         
) 
RETURN store,p 

但是我得到了这个错误

Neo4jError:变量store未定义

指向RETURN语句中的store变量。

我尝试在FOREACH和RETURN之间添加一个WITH语句,但是我只在WITH子句中指向存储变量时遇到了相同的错误

如何在FOREACH子句的外部声明变量,以便可以在FOREACH中为其创建节点并在RETURN中使用它?

解决方法

尝试在FOREACH语句之外声明参数:

OPTIONAL MATCH (user: User {id: $userId} ) 
WITH user
OPTIONAL MATCH (p: Product {id: "1"})-[:OF]->(user)  
WITH p,CASE WHEN NOT (:Store)-[:ON]->(p) OR                 
                   (:Store {id: 'st'})-[:ON]->(p) 
                   THEN [1] ELSE [] END as array,$store as store,$product1 as product1              
FOREACH(
    x in array |              
    MERGE (p)-[:OF]->(user)          
    ON MATCH SET p += product1         
    ON CREATE SET p += product1         
    MERGE (s:Store {id: 'st'})
    ON MATCH SET s += store         
    ON CREATE SET s += store         
    MERGE (s)-[:ON]->(p)         
) 
RETURN store,p