2017-03-03 9 views
0

私は動作しないクエリがあります。Neo4jコンソール:タイプが一致しません:期待されるコレクション<T>ノードでした

型の不一致:期待コレクションが、ノードが... FOREACHから来ていた

コード:エラーが発生しているエラーがどこにあるか私にはわからない

MATCH (user:User {user_role: 'Customer'}) 
WITH user 
OPTIONAL MATCH (user)-[hv:HAS_VAUCHER]->(v:Vaucher {status: 2}) 
WITH user, count(hv) as hv 
WHERE hv = 0 
WITH user 
FOREACH (u IN user | CREATE (v:Vaucher {discount: 5, created_at: 1488531600, start_at: 1488531600, type: 'March', status: 2})<-[:HAS_VAUCHER]-(u)) 

答えて

1

1は、クエリに作ることができるいくつかの改善がありますが、ここであなたは、コレクション内のユーザーを持っていないので、FOREACHを落とし、クイックフィックスだし、すでに行につき1人のユーザー持っている:

MATCH (user:User {user_role: 'Customer'}) 
WITH user 
OPTIONAL MATCH (user)-[hv:HAS_VAUCHER]->(v:Vaucher {status: 2}) 
WITH user, count(hv) as hv 
WHERE hv = 0 
WITH user 
CREATE (v:Vaucher {discount: 5, created_at: 1488531600, start_at: 1488531600, type: 'March', status: 2})<-[:HAS_VAUCHER]-(user) 
+0

のようなクエリを簡素化し、あなたの答えをありがとう、しかし、ポイントは一つだけのユーザーのためにそれを作成することはなかったことができます。 –

+1

それはできません。 'user'はuser_roleが 'Customer'のすべてのユーザーと一致します。しかし、多くのユーザーが一致しますが、それはいくつですか?Vauchersが作成されます。作成操作は行ごとに実行されるので、一致するすべてのユーザーが独自に取得します。Vaucher – InverseFalcon

0

を私は、さらに研究を作り、それを行う方法は、コレクションを作成することでした。

MATCH (user:User {user_role: 'Customer'}) 
WITH user 
OPTIONAL MATCH (user)-[hv:HAS_VAUCHER]->(v:Vaucher {status: 2}) 
WITH user, count(hv) as hv 
WHERE hv = 0 
WITH user, COLLECT(user) AS users 
FOREACH (u IN users | CREATE (v:Vaucher {discount: 5, created_at: 1488531600, start_at: 1488531600, type: 'March', status: 2})<-[:HAS_VAUCHER]-(u)) 

「ユーザー」が返さ戻っNノード(ない1)が、foreachのために渡されたとき、それはおそらく唯一の最初のノードになります。

+1

どちらのアプローチも有効です。あなたが見つけたように、FOREACHはコレクションを運営しています。しかし、これは必ずしも必要ではありません。すでに各行で作業する必要があるすべてのユーザーがいるため、単にCREATEを実行するとまったく同じことが実行されます。 – InverseFalcon

1

あなたはWHERE NOT句でフィルタリング部分を短くして、この

MATCH (user:User {user_role: 'Customer'}) 
where not (user)-[:HAS_VAUCHER]->(:Vaucher {status: 2}) 
CREATE (v:Vaucher {discount: 5, created_at: 1488531600, 
start_at: 1488531600, type: 'March', status: 2})<-[:HAS_VAUCHER]-(u) 
関連する問題